题目
查壳
先查壳(PKiD等),有壳脱壳,没壳用AndroidKiller等反编译工具打开查看JAVA代码
无壳APK
答案
Writeup
解题
运行
平板模式看不到点阵图😑
调成手机模式(竖屏)出现10x10可点击的点阵图:
解题思路
搜索字符串
使用反编译工具的字符串搜索功能,搜索吐司提示的字符串“你根本不知道什么叫做爱”是中文,需要转为UniCode进行搜索:
在“background.class”里有检测的代码,包括正确(Flag提示)和错误的提示(“你根本不知道什么叫做爱”),不用解前面的点阵题:
MainActivity
搜不出来或者没有思路时,应该先看Android程序的入口——也就是MainActivity主活动。
因为这题真的和出题者的自评一样,不想写的太详细没太大意思👋
代码逻辑
MainActivity
- 实例化音频管理器“AudioManager”接受语音输入,调用讯飞的语音插件进行识别——即,语音转文字;
- 调用background方法完成点阵图游戏
- 调用getsna方法对语音输入进行检测
点阵图游戏
//创建10*10二维数组
public background(Context paramContext)
{
this.matrix = new circle[10][10];
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
this.matrix[i][j] = new circle(j, i);
}
}
//检查二维数组是否满足条件
public boolean check()
{
if ((this.matrix[1][1].getStatus() == 1) && (this.matrix[1][2].getStatus() == 1) && (this.matrix[1][7].getStatus() == 1) && (this.matrix[1][8].getStatus() == 1) && (this.matrix[2][0].getStatus() == 1) && (this.matrix[2][3].getStatus() == 1) && (this.matrix[2][6].getStatus() == 1) && (this.matrix[2][9].getStatus() == 1) && (this.matrix[3][0].getStatus() == 1) && (this.matrix[3][4].getStatus() == 1) && (this.matrix[3][5].getStatus() == 1) && (this.matrix[3][9].getStatus() == 1) && (this.matrix[4][0].getStatus() == 1) && (this.matrix[4][9].getStatus() == 1) && (this.matrix[5][1].getStatus() == 1) && (this.matrix[5][8].getStatus() == 1) && (this.matrix[6][2].getStatus() == 1) && (this.matrix[6][7].getStatus() == 1) && (this.matrix[7][3].getStatus() == 1) && (this.matrix[7][6].getStatus() == 1) && (this.matrix[8][4].getStatus() == 1) && (this.matrix[8][5].getStatus() == 1))
注意下标是从0开始,1列指的是社会共识上的第二列。
1列:1 + 2 + 7 + 8
2列:0 + 3 + 6 + 9
3列:0 + 4 + 5 + 9
4列:0 + 9
5列:1 + 8
6列:2 + 7
7列:3 + 6
8列:4 + 5
输入正确后会提示“Right design”——没什么用:
点击图片进行验证,正确提示“通过爱的验证”——还是没什么用🙂:
getsna方法
- 输入的语音转为四个字符升序排序(从小到大排序);
- 正确的情况下吐司消息提示,字符升序排序(sorted)后为分别为“20667”“25105”“26159”“36924”:
public void getsna(String paramString) { //长度为4 if (paramString.length() != 4) {} for (;;) { int[] arrayOfInt = new int[paramString.length()]; for (int i = 0; i < paramString.length(); i++) { //ASCII转为数字 arrayOfInt[i] = (paramString.charAt(i) & 0xFFFF); } //从小到大排序 for (i = 0; i < 4; i++) { for (int j = i + 1; j < 4; j++) { if (arrayOfInt[i] > arrayOfInt[j]) { int k = arrayOfInt[i]; arrayOfInt[i] = arrayOfInt[j]; arrayOfInt[j] = k; } } } if ((arrayOfInt[0] == 20667) && (arrayOfInt[1] == 25105) && (arrayOfInt[2] == 26159) && (arrayOfInt[3] == 36924)) { //排序后为:“20667”“25105”“26159”“36924” Toast.makeText(getContext(), "You get the sorted flag:20667 25105 26159 36924", 0).show(); } else { Toast.makeText(getContext(), "wrong input", 0).show();
sorted升序
🐍Python🐍十进制转ASCII
```java sortedflag = [20667, 25105, 26159, 36924] numList = len(sortedflag) flag = “”
for i in range(numList):
flag += chr(sortedflag[i])
++i
print(flag)
```
得出的中文呼应题目的“你是谁”,将Python中解出的字符串对应的十进制按“主谓宾”排序顺序,填入“flag{}”。
根据“You get the sorted flag:20667 25105 26159 36924”提示可知值中间有空格。