下载apk文件
先解压安装下看看什么情况
打开文件,得到一个LoopAndLoop的apk,打开进去,让输密码,点击按钮,可以看到Not Right!或者Not a valid integer number的提示,显然,只要找到密码,找到flag就快了
接着直接··载入JEB
双击MainActivity
右键->解析
下面我把文件保存下来,看得舒服一点
其里包含两个原生函数,chec和stringFromJNI2。根据oncreate的setOnClickListener里得到的逻辑可知,通过一个整数,调用chec与一个magic number 1835996258比较,如果比较成功,通过这个整数,代入stringFromJNI2得到flag。
再关注以下3个check函数,循环的执行结果是可以预测到的,分别是从1加到100,从1加到1000,从1加到10000,显然可以换为常数的加减。
经过分析可知重要的chec和stringFromJNI2都在native层
再关注原生层:
Android里的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发里。
IDA打开libs/armaebi/liblhm.so,找到chec(因为如果chec能过,那么这个整数代入stringFromJNI2就可以得到FLAG了)
那么就需要将liblhm.so文件载入IDA进行分析啦
载入后直接shift+F12搜索字符串
双击MainActivity进入
接着双击“蓝色向上的小箭头“ 找到引用
再按F5就可以将chec反汇编成伪代码了
_JNIEnv::GetMethodID:
GetFieldID是得到java类里的参数ID,GetMethodID得到java类里方法的ID,它们只能调用类里声明为 public的参数或方法。
_JNIEnv::CallIntMethod:
得到java类里Int类型的方法
经过分析,可以知道chec方法根据第二个参数乘2对3取模的结果调用Java层的三个check函数对我们的输入进行处理
def getinput():target = 1835996258for i in range(2,100):if 2 * i % 3 == 0:target = check1(target,i - 1)elif 2 * i % 3 == 1:target = check2(target,i - 1)else:target = check3(target,i - 1)print(target)
def check1(input,loopNum):t = inputfor i in range(1,100):t = t - ireturn tdef check3(input,loopNum):t = inputfor i in range(1,10000):t = t - ireturn tdef check2(input, loopNum):t = inputif loopNum % 2 == 0:for i in range(1,1000):t -= ireturn tfor i in range(1,1000):t += ireturn tif __name__ == '__main__':getinput()
运行脚本,得到一个值,输入到输入框里,得到flag
成功截图