-
-
[原创]一款最简单的关于动态注册的APP分析
-
发表于:
2020-5-12 23:06
11945
-
题目来自 看雪2w班4月第2题
本来以为凉凉了,但是最后竟然做出来了,惊奇
找出flag
拿到手,一看360加固,先脱壳,发现程序关键步骤native化了,
再打开so文件一看,动态注册
本来想着动态调试吧,可是还得先过360加固的反调试,算了还是静态分析吧
先看.init.array
段
可以看到一一进去查看函数伪代码,发现其实最关键的就是一个字符串动态解密的函数
发现都是一堆异或,没有什么难的算法
直接IDA脚本,一一解密,从解密后的字符串可以看到,这个so存在检测frida的反调试,以及其他不知名的字符串
再之后看.init
函数
实际上最终调用的是创建新线程执行函数sub_E80
,跟进去看看
大概就是检测frida
是否注入进程,以及一些elf魔数的检查和是否存在oat文件的检查
如果检测不通过,则kill掉进程
接下来,看JNI_Onload
函数
就是动态注册而已,我们直接修改源码,跟踪动态注册的函数check
可以观察到check函数地址为0xb39444c9
,
再通过cat /proc/13291/maps | grep native-lib
命令查看libnative-lib.so
的加载基地址为0xb3943000
,这里的13291为进程pid
从而确认check的函数偏移为0x14c9
,找到对应函数
可以发现这个函数做了4件事
检测输入string长度是否为20
再次动态注册check
函数到,新的native函数偏移为0x1234
检测输入的string是否以kanxue
开头
调用新的check
函数,即sub_1234
函数,并传递输入字符串的第六位之后的字符串为参数
再次跟进sub_1234
函数
可以看到同上个函数一样,这个函数也做了四件事
检测输入string长度是否为14
再次动态注册check
函数到,新的native函数偏移为0x1148
检测输入的string是否以training
开头
调用新的check
函数,即sub_1148
函数,并传递输入字符串的第8位之后的字符串为参数
最后再次跟进sub_1148
函数
这个函数只是检测了最后的字符串长度是否为6,并且将之与字符串course
对比
最终,拿到flag为kanxuetrainingcourse
.
验证。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)