首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第五题 APK-ExecuteTable ------ WriteUp
发表于: 2018-6-26 11:20 5291

[原创]看雪.京东 2018CTF 第五题 APK-ExecuteTable ------ WriteUp

2018-6-26 11:20
5291

拿到apk直接丢Jeb查看,可以看到java层代码注册了几个native函数,验证也是交给native函数进行的,所以转移关注点到apk加载的so上。

解压apk文件,只有一个libexecute_table.so,先用readelf查看动态段

可以看到INIT_ARRAY0x34cd0处,直接丢到IDA查看,可以看到相关的初始化函数列表,为了方便观察交叉引用,我给每个函数重命了名。

初看觉得每个函数都很复杂,只注意到了proc_4开头处new了一段空间并且存入了几个关键函数

接下来就动态调试了,修改proc_1开头两字节为FE E7,使so在此处死循环,然后IDA附加之后再修改回原指令,别的先不管,对上面的几个关键函数下断点,特别关注pthread_createmprotect__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 在这个函数中可以看到JNIEnvFindClassRegisterNatives,所以可以拿到验证keynative函数地址0xAC98

直接去到0xAC98发现代码无法解析,应该是加密了。

所以第二次mprotect调用就是解密0xAC98中被加密的代码。

接下来调试验证函数的代码。直接在0xAC98下断,然后随便输入一个key点注册即可断下。
经过调试分析后总结的验证流程如下:

所以只用根据上面的计算过程,反向计算3ww3U53wOAWG333wwPZ56GGw0PO02OUW的原始输入即可。

写了个按照每一步操作反向计算的脚本,输入最终串直接打印出key

最终key为:C0ngRa7U1AtIoN2U

 
 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 82
活跃值: (104)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
2018-6-26 14:18
0
雪    币: 8231
活跃值: (1301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害了,,,
2018-6-27 21:04
0
游客
登录 | 注册 方可回帖
返回
//