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

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

2018-6-26 11:12
4384

一开始打算静态逆,结果还是天真了,在错误的道路上奔跑了太久,不调试很难做出来吧。

这个题的难点主要有

Java层比较简单,就是调用native函数lkdakjudajndn,如果lkdakjudajndn返回1,则成功。

拖到IDA Pro里,首先是ELF文件.plt.got部分的函数没有正确命名,不知道为啥,写一个小脚本命名一下,然后就可以得到正确的库函数名。

修复后的结果如下

然后还有4个直接用系统调用实现的函数,sys_openat, sys_read, sys_cloase, sys_mprotect

还有一个关键的函数初始化一个结构体,结构体中是函数指针

这些函数很关键。

程序里有明文字符串,所以可以猜想有反调试,然后原JNI_OnLoad函数看起来不正常,应该有自修改代码。所以在sys_openatsys_mprotect处下断点。

sys_openat处的断点,可以发现sys_openat会打开两个文件,/proc/self/status/proc/self/maps

/proc/self/status

/proc/self/maps

其中,打开/proc/self/maps是用来获取libexecute_table.so的基地址,以便修改JNI_OnLoad的符号表。
打开/proc/self/status是为了读取TracerPid用于反调试,要patch一下这个函数,使其反调试失效。然后用patch过的so文件换掉原so文件。

sys_mprotect处的断点,可以找到修改符号表的地方。

真正的JNI_OnLoad函数是sub_D374B260(这个地址只有260是准确的)。

在真正的JNI_OnLoad中,可以看到函数lkdakjudajndn的注册过程

其地址为0xD374BC98,同样,调试的时候高位地址会随机化。

sys_mprotect处的断点,还可以发现,有自修改代码,但是我没有研究其过程,让它默默的改就好了。

lkdakjudajndn函数的验证过程本身没有那么烦,但是弄了一堆条件分支就很烦了,不过发现规律后可以很明确的判断程序会走哪个分支。

比方说下图中v14的取值,很明显只能是1。

可以看到其验证流程是把输入做一些变换,然后与3ww3U53wOAWG333wwPZ56GGw0PO02OUW对比,如果相同则正确。

其变换过程并不复杂,都是一些异或、置换、替换之类的操作,但是描述起来很麻烦,就不详细写了。直接把解题的IDAPython代码贴出来,其中有几个地址需要根据实际情况替换一下。代码很乱,不要吐槽我,不想整理了。

最后,flag为C0ngRa7U1AtIoN2U

我感觉我要弃赛了。

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-26 14:23 被iweizime编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 82
活跃值: (104)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
分析的很透彻,部分函数没有正确命名可能是因为我改了点section导致的
2018-6-26 14:15
0
雪    币: 930
活跃值: (1328)
能力值: ( LV15,RANK:750 )
在线值:
发帖
回帖
粉丝
3
RorschachL 分析的很透彻,部分函数没有正确命名可能是因为我改了点section导致的
惊现作者
2018-6-26 14:22
0
游客
登录 | 注册 方可回帖
返回
//