-
-
[原创] 看雪.京东 2018CTF 第五题 APK-ExecuteTable
-
发表于:
2018-6-26 11:12
4415
-
[原创] 看雪.京东 2018CTF 第五题 APK-ExecuteTable
一开始打算静态逆,结果还是天真了,在错误的道路上奔跑了太久,不调试很难做出来吧。
这个题的难点主要有
Java层比较简单,就是调用native函数lkdakjudajndn
,如果lkdakjudajndn
返回1,则成功。
拖到IDA Pro里,首先是ELF文件.plt.got
部分的函数没有正确命名,不知道为啥,写一个小脚本命名一下,然后就可以得到正确的库函数名。
修复后的结果如下
然后还有4个直接用系统调用实现的函数,sys_openat
, sys_read
, sys_cloase
, sys_mprotect
。
还有一个关键的函数初始化一个结构体,结构体中是函数指针
这些函数很关键。
程序里有明文字符串,所以可以猜想有反调试,然后原JNI_OnLoad
函数看起来不正常,应该有自修改代码。所以在sys_openat
和sys_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编辑
,原因: