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}
利害,不错,值 得学习下
学习学习 学习了,请问这一系列的在哪里学习 支持一下 读懂java层的逻辑 然后so找到对应的调用 还是很简单的
页:
[1]