题目

CSDN免积分下载

查壳

先查壳(PKiD等),有壳脱壳,没壳用AndroidKiller等反编译工具打开查看JAVA代码
无壳APK

答案

flag{25105 26159 20667 36924}

Writeup

解题

运行

平板模式看不到点阵图😑
image.png
调成手机模式(竖屏)出现10x10可点击的点阵图:
image.png

解题思路

搜索字符串

使用反编译工具的字符串搜索功能,搜索吐司提示的字符串“你根本不知道什么叫做爱”是中文,需要转为UniCode进行搜索:
image.png
在“background.class”里有检测的代码,包括正确(Flag提示)和错误的提示(“你根本不知道什么叫做爱”),不用解前面的点阵题:
image.png

MainActivity

搜不出来或者没有思路时,应该先看Android程序的入口——也就是MainActivity主活动。
因为这题真的和出题者的自评一样,不想写的太详细没太大意思👋

代码逻辑

MainActivity

  1. 实例化音频管理器“AudioManager”接受语音输入,调用讯飞的语音插件进行识别——即,语音转文字;

image.png

  1. 调用background方法完成点阵图游戏
  2. 调用getsna方法对语音输入进行检测

image.png

点阵图游戏

  1. //创建10*10二维数组
  2. public background(Context paramContext)
  3. {
  4. this.matrix = new circle[10][10];
  5. for (int i = 0; i < 10; i++)
  6. {
  7. for (int j = 0; j < 10; j++)
  8. {
  9. this.matrix[i][j] = new circle(j, i);
  10. }
  11. }
  12. //检查二维数组是否满足条件
  13. public boolean check()
  14. {
  15. 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”——没什么用:
image.png
点击图片进行验证,正确提示“通过爱的验证”——还是没什么用🙂:
image.png

getsna方法

  1. 输入的语音转为四个字符升序排序(从小到大排序);
  2. 正确的情况下吐司消息提示,字符升序排序(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升序

    image.png

    🐍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”提示可知值中间有空格