mips题目,看起来有点难受
想起来前几天defcon的时候刚好把retdec的环境搭起来,虽然还是有点小问题,但是正好借机解决一下嘛
首先看了binary ninja的插件,跑了一下python缺少模块,又找不到它内置的python在哪,查了一下可以在binary ninja的script console窗口中import pip来安装
import pip
pip.main([‘install’, ‘–quiet’, ‘packagename’])
装好以后直接打不开了- =
幸亏有一颗debug的心,把另一个插件generate_index.py移除以后就行了..有点神奇
然后跑一下,log窗口报错架构不支持,明明就是Mips啊╮(╯_╰)╭
去找了init.py来看
self.cmdline = [‘retdec-decompiler.sh’]
self.cmdline.append(‘-m’)
self.cmdline.append(‘raw’)self.cmdline.append(‘-a’)
self.cmdline.append(self.arch)self.cmdline.append(‘-e’)
self.cmdline.append(self.endianness)self.cmdline.append(‘–backend-no-debug-comments’)
self.cmdline.append(‘–cleanup’)
…
p = Popen(self.cmdline, stdout=PIPE, stderr=PIPE)
我这windows怎么用管道跑sh啊?!
这适配简直了……无奈放弃
回头继续搞IDA的插件
它依赖于msys的mingw程序,以前搞gcc的时候也装过一个Mingw的程序,可以在win上运行sh脚本,包括strings\grep等等小程序
IDA这边可以看到log都打完了,Run Decompile已经完成了,最后却报了一个exit code -1
最尴尬的是IDA起的cmd窗口在错误以后直接消失,根本看不到最后出错的log
所以说log是非常重要的orz
还好IDA的报错窗口把idapython的命令 system(sh’xxxx’)显示出来,因此可以在Mingw中手动运行该命令
Running phase: emission of the target code [c] ( 0.11s )
Running phase: finalization ( 0.12s )
Running phase: cleanup ( 0.13s )
/usr/bin/env: ‘python3’: No such file or directory`##### Done!
可以看到,最后一条python3未找到就是报错的原因了
去retdec-decompiler.sh中搜了一下一个python也没有
最后看到开头
`#!/usr/bin/env bash
哦~是某个文件要求用python3来解释失败了
其实也可以直接在env中写入一个python3的,然而我不太会玩这东西..
试了一下发现MingW里有个python3.6,那么只要令这里的对应关系修复就可以了
到文件夹里找一下,果然有个retdec-color-c.py
打开一看,第一行就/是>`#!/usr/bin/env python3
把3去掉,再跑一遍终于成功√
然而IDA里还是报错orz
明天再调试吧
此时命令行跑起来以后,文件夹下已经出现了.c文件,可以勉强用啦~
反编译效果不是很好,但是对于循环和参数的识别帮助比较大
例如main函数中的这段就很明显可以看出是逐字符check
while (true) {
char v4 = *(char *)(v2 + v3); // 0x400d14
int32_t v5 = v3 + 1; // 0x400d30
if (*(char *)(v3 + (int32_t)&g2) != v4) {
// 0x400d20
exit(0);
// UNREACHABLE
}
// 0x400d38
if (v5 >= strlen((char *)v2)) {
// break -> 0x400d58
break;
}
v3 = v5;
// continue -> 0x400cf4
}
关键内容在于这之前的变换sub_400790中
这个函数看起来就很蛋疼了
int32_t sub_400790(