CTF-Ogeek之安卓逆向分析
- 0x1:前言
- 0x2:任务要求
- 0x3:分析过程
- 0x4:Python代码编写
- 0x5:总结
0x1:前言
还有半年的时间就要毕业了,目标的职位是移动安全工程师,从今天起开始记录下自己日常的一些工作。今天的这个样本是在吾爱破解论坛(www.52pojie.cn)中看到的一个帖子,该帖子是分析文档。所以在看分析文档前,先自己尝试破解下。
0x2:任务要求
根据软件打开的界面,可以猜测,接下来的任务应该就是当我们点击”CHECK FLAG”按钮的时候,根据我们输入的值,返回一个正确的值即可。
0x3:分析过程
- 使用Jadx打开实验APK “ogeek-mblockchain.apk”。简单的浏览代码,定位到关键的位置。从下图中的“1”处,我们可以看到这边是验证成功的地方,也就是说,当 result = True的时候,我们验证成功。所以向上寻找result赋值的地方。于是乎,我们就看到了“2”的代码位置。我们的突破点或许就在这边。我们“Ctrl +鼠标左键”进入checkFlag中寻找关键信息。
- 我们看到红框选中的代码中,当if中toHex(currPt).equals(“7…”) 的值为真的时候,返回True。那么回溯到我们上面的分析,才可以验证成功。否则失败。 接下来我们看看hash函数的内容。
- Hash的内容其实只是一个简单的MD5而已。所以我们先继续往其他地方分析。
- 然后再仔细看看hash函数,发现它事实上只对3个字符进行MD5加密。因为MD5的加密是不可逆的。所以我们可以使用python来写一个穷举的代码。
byte[] currKey = hash(new byte[]{digest[0], digest[digest.length / 2], digest[digest.length - 1]});
0x4:Python代码编写
import hashlib
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
all='74f0b165db8a628716b53a9d4f6405980db2f833afa1ed5eeb4304c5220bdc0b541f857a7348074b2a7775d691e71b490402621e8a53bad4cf7ad4fcc15f20a8066e087fc1b2ffb21c27463b5737e34738a6244e1630d8fa1bf4f38b7e71d707425c8225f240f4bd2b03d6c2471e900b75154eb6f9dfbdf5a4eca9de5163f9b3ee82959f166924e8ad5f1d744c51416a1db89638bb4d1411aa1b1307d88c1fb5'
enc=a2b_hex(all)
for i in range(256):
print(i)
for j in range(256):
for k in range(256):
dec=enc
key=chr(i)+chr(j)+chr(k)
keys=[hashlib.md5(key.encode("utf8")).digest()]
for x in range(9):
keys.append(hashlib.md5(keys[x]).digest())
for y in range(10):
aes=AES.new(keys[9-y], 1)
dec=aes.decrypt(dec)
if "flag" in dec.decode("utf8","ignore"):
print(b2a_hex(dec))
0x5:总结
学习破解其实和编程也有很大关系. 如果编程语言不过关。那么我们有些可以通过穷举来达到的东西,我们也无法实现。
在攻打这个CTF的几个关键点:
- 反编译APK找到onCreate方法.找到关键函数
- 分析Java伪代码,分析其加密流程
- 编写代码穷举破解。