easy-dex
题目来源: 高校网络信息安全运维挑战赛
题目描述:无
下载下来发现是一个apk文件,放入jadx查看AndroidManifest.xml却发现
hasCode=false并且是NativeActivity,看来是纯c++的,因此把native库放入IDA
这种入口其实是ANativeActivity_onCreate,不过最终还是会进入android_main
发现这里面的逻辑是如果在10秒之内摇手机100次,就将加密后的dex先拷贝下来解密并解压缩,写入/data/data/com.a.sample.findmydex/files下面的class.dex和odex,然后再移除
因此我们可以将加密后的dex dump下来然后自行解密解压缩
这部分说明了要拷贝的起始是0x7004,长度是v2也就是0x3CA10
在IDA内通过Shift+F2快捷键,或者File/Script command运行下列脚本即可dump下来
import idaapi addr = 0x7004 size = 0x3CA10 with open('d:/ctf/share/dump', 'wb') as f: f.write(idaapi.get_bytes(addr,size)) print('dump finished')
解密部分直接根据程序逻辑原样弄下来即可,最后解压缩,脚本如下:
import zlib with open('dump', 'rb') as f: data1 = f.read() data = list(data1) v14 = 0 while True: if (v14 - 1) <= 0x58: v15 = v14 // 10 if v14 % 10 == 9: v16 = 0x3CA10 v17 = 0x3CA10 // 10 v18 = (v15 + 1) * (0x3CA10 // 10) if 0x3CA10 // 10 * v15 < v18: v19 = v17 * v15 v17 -= 1 data[v19] ^= v14 v19 += 1 while v17: v17 -= 1 data[v19] ^= v14 v19 += 1 if v14 == 89: while v18 < v16: data[v18] ^= 0x59 v18 += 1 else: break v14 += 1 filebytes = bytes(data) with open('easy-dex.dex', 'wb') as w: w.write(zlib.decompress(filebytes)) print('decrypt finished')
之后jadx查看该dex,发现逻辑是将输入与一个字符串一起进行处理之后与程序内的一个数组进行比较
资源具体的在原apk内
一起处理的字符串标签叫做two_fish,内容是I have a male fish and a female fish.
提示我们是Twofish加密,密钥是I have a male fish and a female fish.
要比较的数组内有负数,因此可以将其&0xff变成正数,然后base64.b64encode(bytes(m))得到
iE3y2hEF1izgbVUfGKWQrUCtgFQFop7iEkbmRwWdwsZ1HdQGcPxRVAkWzV/eDC9N
解密得到flag
qwb{TH3y_Io<e_EACh_OTh3r_FOrEUER}