n1cef1sh's Blog

前言

源于一道QCTF的babymips题目,一直没找到很好的反编译工具,也没配好动态调试的环境(配置环境真是麻烦啊),生啃指令集也没把逻辑通顺,结束后参考一些wp和之前的Mips题目重新找了找工具和配环境,希望再碰到Mips题目能有所帮助。

题目

直接先附上赛后公布的源码

jeb-MIPS

下载地址 这是个官方给的JEB Decompiler for MIPS,只支持32位。填个邮箱就会把下载链接发给你,可以试用Demo版本。

将程序放进jeb,先看一下大概的界面。 感觉还是比较友好的,左上方是项目分支,左下方是函数列表,右上方是主窗口,包括很多分窗口,类似IDA,右下方就是日志信息。 只不过实际用起来的时候因为是demo版本所以很多功能受限。

我们根据之前的分析找到关键函数进行反汇编 按空格还可查看结构图

先借助这个工具的反汇编效果分析一下这个题目。主函数比较好理解,输入32位字符串,对于每一位进行和(32-i)异或操作,然后将处理后的前五位和fdata的值比较,相等的话进入4007F0函数进行第二段判断 在一个循环里判断,循环变量var10是5,递增1,直至大于等于输入的字符串长度32。用var10&1判断奇偶,因为奇数二进制最后一位一定是1,只有1&1才是1,而偶数&1就是0。 如果是奇数的话,s[i] = (s[i]/4)|(s[i]1073741824»24) = (s[i]/4)|(s[i]64). 如果是偶数的话,s[i] = (s[i]/64)|(s[i]6710884»24) = (s[i]/64)|(s[i]4) 这样处理以后,将后27位和另一个字符串比较,相等则success 对比源码发现基本逻辑都是没问题的,就是源码里多了一个&0xff的操作,这个之前没注意过,在此解释一下。它就像一把剪刀,当‘&’操作符两边数的bit位数相同时不改变数的大小,只是专门截出一个字节的长度。一般在移位操作的时候都会&0xff,以保证二进制数据的一致性。

最后附官方爆破脚本

Retdec

再说了解一下另个工具,一个ida插件。 https://bbs.pediy.com/thread-227079-1.htm 具体的介绍和方法可以参考这篇博文或者看gayhub的使用说明。 大概说一下步骤:

感觉效果不是很好,和jeb比起来各有优劣吧。仅就这个题而言,可以对比看一下。

比如主函数部分 效果看起来更罗嗦,特别是循环的处理上。不过它能展示的信息更具体,个别的地址和函数也能表示出来,可能对于复杂的逻辑更适合吧。还是更习惯jeb那种类似IDA的界面和操作。

9.12

新版本更新,从shell脚本迁移到Python脚本,因此Windows用户将不再需要安装MSYS2来运行RetDec。 直接下载最新版RetDec3.2和retdec-idaplugin-v0.7-windows,插件配置到IDA7.0,然后解压retdec3.2。 在IDA的option里设置 最后选中需要反编译的函数,CTRL+D即可。

docker

multiarch-docker 都说docker是专治环境配置的,但docker实在还是玩不转,这个是可以动调的环境,第一次搞的时候磕磕绊绊的能用了,想写一下的时候又出问题了。就放一下这个docker吧,如果用的时候再调。简单的mips只要反出来静态分析应该就差不多。