Googlectf 2017 food writeup
google ctf 2017出了道安卓题,就一道,唉,拿了个三血。。。不难,从头到尾仔细分析了一遍。
转载请联系本人,否则作侵权处理。 相关文件链接:https://github.com/LeadroyaL/attachment_repo/tree/master/googlectf-food/
在Java层渲染GUI渲染到一半就跑到JNI里了,
1 | protected void onCreate(Bundle arg2) { |
我所有的手机全部都无法运行,崩在了so里面,也不知道是什么骚套路,只能静态分析,不能偷鸡了。
下面是JNI,每个const-string均被加密处理过,需要手动解掉它们,例如
1 | ddex = dec_string( |
解出来是
/data/data/com.google.ctf.food/files/d.dex
使用的脚本为
1 | def dec_string(enc_data): |
之后一行一行看代码,总体流程为:
- 解密一段数据后,创建并且写文件,是0x1770006大小的、在so中存放的明文,以dex035开头;
- 拿到systemClassLoader,加载创建好的d.dex文件,新建一个classloader;
- 删掉dex和odex的文件和目录
- 加载com/google/ctf/food/S这个类,调用其构造方法,参数用反射的方式拿到老的Activity
- 0x1098进行热补丁,通过读取/proc/self/maps,对内存中,距离dex035为0x720的位置,写为unk_2E88 xor 0x90,最后写到原来的位置。我们观察一下dex文件,刚好写掉了一个空的方法体,位于com/google/ctf/food/Broadcast的cc方法。
- 之后继续渲染即可。
全部修好的dex可以拖到JEB去查看(详见附件),显然是个RC4
1 | rc4 |
用python解一下
1 | key = ''.join(chr(k) for k in key) |
flag为
CTF{bacon_lettuce_tomato_lobster_soul}
搞定。。。