-
-
[原创]看雪.京东 2018CTF 第五题 APK-ExecuteTable ------ WriteUp
-
发表于:
2018-6-26 11:20
5291
-
[原创]看雪.京东 2018CTF 第五题 APK-ExecuteTable ------ WriteUp
拿到apk直接丢Jeb查看,可以看到java层代码注册了几个native
函数,验证也是交给native
函数进行的,所以转移关注点到apk加载的so上。
解压apk文件,只有一个libexecute_table.so
,先用readelf
查看动态段
可以看到INIT_ARRAY
在0x34cd0
处,直接丢到IDA查看,可以看到相关的初始化函数列表,为了方便观察交叉引用,我给每个函数重命了名。
初看觉得每个函数都很复杂,只注意到了proc_4开头处new
了一段空间并且存入了几个关键函数
接下来就动态调试了,修改proc_1
开头两字节为FE E7
,使so在此处死循环,然后IDA附加之后再修改回原指令,别的先不管,对上面的几个关键函数下断点,特别关注pthread_create
,mprotect
与__NR_openat
分析后发现__NR_openat
打开过/proc/self/maps
与/proc/self/status
, 而mprotect
有修改JNI_OnLoad
偏移与代码解密
操作
推测打开/proc/self/maps
是为了拿到基址,/proc/self/status/
是反调试, 后面实际解key
时感觉应该是检测到调试,就把解密中需要用到的一个全局变量修改掉。导致得到错误的结果。
mprotect
调用了两次,第一次修改JNI_OnLoad
的偏移,由0x8205
修改为0xA260
在这个函数中可以看到JNIEnv
的FindClass
与RegisterNatives
,所以可以拿到验证key
的native
函数地址0xAC98
直接去到0xAC98
发现代码无法解析,应该是加密了。
所以第二次mprotect
调用就是解密0xAC98
中被加密的代码。
接下来调试验证函数的代码。直接在0xAC98
下断,然后随便输入一个key
点注册即可断下。
经过调试分析后总结的验证流程如下:
所以只用根据上面的计算过程,反向计算3ww3U53wOAWG333wwPZ56GGw0PO02OUW
的原始输入即可。
写了个按照每一步操作反向计算的脚本,输入最终串直接打印出key
最终key为:C0ngRa7U1AtIoN2U
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)