吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4906|回复: 5
收起左侧

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

[复制链接]
默小白 发表于 2019-4-1 12:20
本帖最后由 默小白 于 2019-4-1 12:24 编辑

题目信息:
WX20190401-102424@2x.png
解压得到apk,拉进jeb
WX20190401-110054@2x.png
双击com/example/seccon2015/rock_paper_scissors/MainActivity,按tab键反汇编成Java代码
WX20190401-110404@2x.png
可以看到onClick()方法
主要通过Random().nextInt(v9)生成一个随机数v9
随机数v9构造一个字符串数组v1
然后对数组进行赋值
由此可见n就是CPU的选项,那m就是我们的选择

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[v9];
            v1[0] = "CPU: Paper";  // 布
            v1[1] = "CPU: Rock";  // 石头
            v1[v8] = "CPU: Scissors";  // 剪刀
            ((TextView)v3).setText(v1[this.n]);
            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的值了

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载入
WX20190401-115545@2x.png
直接F5看更直观
WX20190401-115653@2x.png
可以看到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}


rps.zip (879.63 KB, 下载次数: 77)

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
PHOEN1X + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Hmily + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Li1y + 1 + 1 一直关注大佬,学习了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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找到对应的调用 还是很简单的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表