声明:本篇的作者 Esc1234(CCSR小组重要成员之一)

题目地址:https://pan.baidu.com/s/11FgG1ymTvcCwB_G7VH9KqA

知识点:android逆向

目录

  1. 题目解析

题目解析

  • 在夜神模拟器中安装程序,打开后界面如下,app名字为LoopAndLoop,输入密码获得flag;

  • 使用jeb打开apk文件,找到核心代码,如下图所示

  • if语句中的判断条件为MainActivity.this.check(v1, 99) == 1835996258,找到check函数;

  • 发现返回结果为chec函数,找到chec函数,发现chec函数为调用的so文件中的函数;

  • 在Libraries/armeabi中找到liblhm.so文件并提取出来

  • 使用IDA打开该so文件,找到chec函数,反编译结果如下

  • 发现该函数中调用了函数check1,check2,check3,回到jeb中查看MainActivity发现check1,check2,check3中也调用了chec函数,印证了该app的名字LoopAndLoop,决定调用一下该so文件中的函数。

  • 首先搭建NDK环境,网上有教程,此处不在赘述,使用Android Studio新建一个Android项目,在app/src/main/下新建文件夹libs/armeabi/,然后将liblhm.so复制到该路径下,在build.gradle文件中添加如下代码

  • MainActivity中添加代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
static {
System.loadLibrary("lhm");
}

public MainActivity() {
super();
}

public native int chec(int arg1, int arg2);

public int check(int arg2, int arg3) {
return this.chec(arg2, arg3);
}

public int check1(int arg4, int arg5) {
int v1 = arg4;
int v0;
for(v0 = 1; v0 < 100; ++v0) {
v1 += v0;
}

return this.chec(v1, arg5);
}

public int check2(int arg5, int arg6) {
int v2;
int v3 = 1000;
int v1 = arg5;
if(arg6 % 2 == 0) {
int v0;
for(v0 = 1; v0 < v3; ++v0) {
v1 += v0;
}

v2 = this.chec(v1, arg6);
}
else {
for(int v0 = 1; v0 < v3; ++v0) {
v1 -= v0;
}

v2 = this.chec(v1, arg6);
}

return v2;
}

public int check3(int arg4, int arg5) {
int v1 = arg4;
int v0;
for(v0 = 1; v0 < 10000; ++v0) {
v1 += v0;
}

return this.chec(v1, arg5);
}
  • onCreate函数中调用chec函数

  • 输出结果为:

  • 猜测chec函数返回结果为为将1599503850加上第一个参数的值,那么密码为1835996258-1599503850=236492408,输入app中验证,获得flag如下:

  • 当然也可以用爆破获得密码,只不过用时较长。