默小白 发表于 2019-4-1 12:20

WhaleCTF-30days逆向【第二期】包剪锤【初级】

本帖最后由 默小白 于 2019-4-1 12:24 编辑

题目信息:

解压得到apk,拉进jeb

双击com/example/seccon2015/rock_paper_scissors/MainActivity,按tab键反汇编成Java代码

可以看到onClick()方法
主要通过Random().nextInt(v9)生成一个随机数v9
随机数v9构造一个字符串数组v1
然后对数组进行赋值
由此可见n就是CPU的选项,那m就是我们的选择
```java
public void onClick(View arg11) {
      int v9 = 3;
      int v8 = 2;
      if(this.flag != 1) {
            this.flag = 1;
            this.findViewById(0x7F0C0052).setText("");
            View v2 = this.findViewById(0x7F0C0050);
            View v3 = this.findViewById(0x7F0C0051);
            this.m = 0;
            this.n = new Random().nextInt(v9);
            String[] v1 = new String;
            v1 = "CPU: Paper";// 布
            v1 = "CPU: Rock";// 石头
            v1 = "CPU: Scissors";// 剪刀
            ((TextView)v3).setText(v1);
            if(arg11 == this.P) {
                ((TextView)v2).setText("YOU: Paper");
                this.m = 0;
            }

            if(arg11 == this.r) {
                ((TextView)v2).setText("YOU: Rock");
                this.m = 1;
            }

            if(arg11 == this.S) {
                ((TextView)v2).setText("YOU: Scissors");
                this.m = v8;
            }

            this.handler.postDelayed(this.showMessageTask, 1000);
      }
    }
```
再看run()方法,可以看到有两种情况可以赢,也就是WIN!
然后cnt进行++操作,那么cnt就是记录我们赢的次数
观察最后一个if语句,当cnt=1000时,就可以得到flag了
那么此时cnt的值就为1000
接下来就要看calc的值了
```java
public void run() {
            View v0 = MainActivity.this.findViewById(0x7F0C0052);
            if(MainActivity.this.n - MainActivity.this.m == 1) {
                ++MainActivity.this.cnt;
                ((TextView)v0).setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
            }
            else if(MainActivity.this.m - MainActivity.this.n == 1) {
                MainActivity.this.cnt = 0;
                ((TextView)v0).setText("LOSE +0");
            }
            else if(MainActivity.this.m == MainActivity.this.n) {
                ((TextView)v0).setText("DRAW +" + String.valueOf(MainActivity.this.cnt));
            }
            else if(MainActivity.this.m < MainActivity.this.n) {
                MainActivity.this.cnt = 0;
                ((TextView)v0).setText("LOSE +0");
            }
            else {
                ++MainActivity.this.cnt;
                ((TextView)v0).setText("WIN! +" + String.valueOf(MainActivity.this.cnt));
            }

            if(1000 == MainActivity.this.cnt) {
                ((TextView)v0).setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
            }

            MainActivity.this.flag = 0;
      }
```

将rps.apk解压出来,找到lib\armeabi-v7a\下的libcalc.so文件
用IDA载入

直接F5看更直观

可以看到return 7
那么calc的值就为7
再看一下flag的计算方式
"SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}"
将cnt=1000,calc=7代入得到
SECCON{(1000+7)*107}
即SECCON{107749}

xcy188 发表于 2019-4-1 12:41

利害,不错,值 得学习下

52lxw 发表于 2019-4-4 16:14

学习学习

52lxw 发表于 2019-4-9 23:41

学习了,请问这一系列的在哪里学习

neilwu 发表于 2020-2-17 10:45

支持一下 读懂java层的逻辑 然后so找到对应的调用 还是很简单的
页: [1]
查看完整版本: WhaleCTF-30days逆向【第二期】包剪锤【初级】