hitbctf 2018 android writeup

HITB-CTF 2018 有2个安卓题《multicheck》、《kivy_simple》,抽空稍微做了一下,挺简单的。

文件链接:https://github.com/LeadroyaL/attachment_repo/tree/master/hitbctf_2018

一、multi-check

上来先加载了个 so,init_array里有内容,看起来是在读一些数据,也可能把write函数给 hook 掉了,对将来文件名为claz.dex的文件做一些操作,似乎是把全部数据 xor 了233。

之后在 java 层,把assets 里放的 claz.dex  拿出来,放到私有目录下,这时候会触发之前写的 hook,将文件内容改变。

对其进行动态 dex 加载,加载完成后删除,并且调用里面的 com.a.Check.check(String) 方法。

也就是说,如果你手速足够快,是可以在私有目录下把这个文件复制出来的,就免得手动去解密了,还好手动也不复杂。

拿到解密后的 dex 文件,看一下,这次真的没有什么骚操作了,都是简单运算,送分题,解密代码找不到了。

二、kivy_simple

kivy 是跨平台用 python 写 GUI 的东西,同样安卓也有,所以这个题目的文件应该有大量冗余了,找到核心内容即可。

Java 层,太乱了不知道在干嘛,主要是资源文件全找不到,就猜是mp3里有东西,搜了一下发现果然是藏了东西的,tar zxvf解压一下,一堆文件,记得 chmod 一下,不然有文件没权限查看。

再看看shared_library,怕是在里面藏东西,绕了一圈,反正啥也看不懂。。。修改了解释器我估计也看不出来。

在解压出来的文件里,放了个main.pyo,使用 uncompyle反汇编一下。

看起来是制定了那段b64,我对python 不熟,查了一下就是反序列化一个code object,然后 eval 一下。

经过很多很多次测试,终于让这段 python 运行起来了,发现这段代码似乎覆盖了原来的变量screen。

正确使用方式是使用 python 自带的 dis 库

发现确实是这样,然后 dump 出真正的 screen,再对 screen 的 check 方法进行 dis.dis,可以拿到 python 的 bytecode。

之后对这段 bytecode 进行阅读即可,发现是逐字节比较,写段正则什么的处理一下就好。

后来看别人的 writeup,说这段 code_object 其实也可以被反汇编,就不用读汇编了,赞。

在 ap 大佬的帮助下, 成功创建了 pyc 文件,参考这两个链接

https://stackoverflow.com/questions/8627835/generate-pyc-from-python-ast

https://www.jianshu.com/p/152820587935

按照顺序写入4byte 的 magic,4byte 的创建时间,和整个code_object即可。

然后就可以使用uncompyle来反汇编check.pyc了~

最后 flag 是

// HITB{SEe!N9_IsN’T_bELIEV1Ng}
// HITB{1!F3_1S_&H%r7_v$3_pY7#ON!}


=============================================================
随着访客的增多,LeadroyaL在本站流量的开支越来越多了,曾经1元能用1个月,现在1元只能用3天。如果觉得本文帮到了你,希望能够为服务器的流量稍微打赏一点,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code