Bugku-LoopAndLoop wp题解
tips:本题解需要的工具,都是直接把需要分析的文件拖进工具里面疯狂点击确认直到不需要点确认为止
1.下载后得到一个apk,用PKID对apk查壳,得知无壳
2.将文件丢入jadx进行源码分析,先看main文件
3.对文件分析,上面的都没啥用,主要看红色框框这一部分就可以,大概就进行了这些操作:获取输入->转化为int->进行某个操作后与183...这一串数字比较->将输入的值进行某个操作转化为字符串拼接输出
4.既然知道了他的大概过程,那么我们只需要得知check进行了什么操作就可以了,双击check,查看check做了什么。
check函数只有一行操作,就是运行了一个函数chec,变量为input和s,根据3步骤,得知s的值是99,input的值是我们输入值转化的int实例,其实就是我们的输入值,那么我们就需要知道chec进行了什么操作
5.双击chec,跳转到chec,但是发现这个只是类似c语言里面的一个内置函数,就像printf,scanf一样,并不清楚chec进行了什么操作,这个其实是java里面的原生函数,往下看一行,发现stringFromJNI2也是一个原生函数。
6.现在我们需要关注的就是apk框架的原生层了,apk框架的原生层在资源文件lib里面的xxx.so里面,这是一个二进制文件,jadx无法打开so文件,我们需要借助逆向神器IDA打开
7.先将文件后缀改为zip并解压得到文件夹
8.用IDA打开liblhm.so文件,并切换为字符串视图
9.ctrl+F启用字符串检索,搜索mian
10.这样就看到了我们需要的两个原生函数chec和stringFromJNI2
双击chec那个跳转,很开心的是,两个函数都在这里
11.双击函数,然后按下F5转化为伪代码,结果发现,文件是32位的,无法使用ida64反编译,重新用ida32打开,同样步骤操作就可以得到我们需要的伪代码了
12.对chec分析情况如下,根据下面代码分析,a4与chec(input,s)里面的s有关,最大值可能a4-1=99,a4=99,a4+1=99,经过试验,a4-1=s
13.程序基本分析完毕了,写一下脚本,还原出输入的数字
'''
3个check函数不能原版照抄过来,需要进行一点修改,咱需要得到的值是输入前的
值,需要对代码进行一定的修改,获得的是输入前的值
'''
def check1(input,s):
t = input
for i in range(1,100):t -= i
return t
def check2(input,s):
t = input
if s % 2 == 0 :
for i in range(1,1000):t -= i
return t
for j in range(1,1000): t += j
return t
def check3(input, s):
t = input
for i in range(1,10000):t -= i
return t
eq=1835996258 #正向经过check得到的值,需要逆向回去,将3个函数反向运行,得到原来的值
for i in range(2,100):
if 2 * i % 3 == 0:
eq = check1(eq,i - 1)
elif 2 * i % 3 == 1:
eq= check2(eq,i - 1)
else:
eq = check3(eq,i - 1)
print(eq)
14.运行脚本得到这个需要输入的值
236492408
15.本来这个值经过stringFromJNI2函数转化得到我们需要的flag,但是我们可以不需要去分析这个函数了,直接用模拟器(MuMu,夜神。。等都可以)安装apk,直接运行apk,输入上面得到的值就可以直接得到我们要的flag,手动输入一下,就是下面这个flag了
alictf{Jan6N100p3r}