首页 > 代码库 > 逆向工程之二进制炸弹第一发

逆向工程之二进制炸弹第一发

   down了二进制炸弹实验,名字就很酷是不是。简要介绍下,二进制炸弹是一个可执行文件,运行时,提示用户输入6个不同的字符串,如果其中的任何一个不正确,炸弹就会爆炸。初步判断有六个级别,难度逐级递增。这个实验需要学生通过对程序反汇编和逆向工程来判断是哪6个答案,从而拆除它的炸弹。

     文档里面提示用到了gdb和objdump,那么问题来了。第一步怎么做?

照惯例我神游了一番,然后打开objdump –help翻看帮助,有个-t 参数,可以打印程序的符号表,据我所知符号表里面存储的是一些函数名和变量名,或许我可以从这里寻找一些有规律的符号找出线索。开干!

objdump –t  bomb > 1

 

浏览一遍,发现了线索,表里有phase_1到phase_6这类符号,正好和6个层级有点对应,话说这信息有点乱,咱grep一下

很好,结果清晰了,但是这个invalid_phase和secret_phase是做什么的?不大明白。先不管,

objdump – d bomb > 2 

 

反汇编 bomb程序,导入文件2中,找到Phase_1部分

Phase_1里面有调用explode_bomb,那现在确定了就 是这个。

下一步----------->追踪Phase_1

分析下Phase_1部分,逻辑很清楚。调用strings_not_equal,判断字符串是否相等,如果相等,咋跳转到leave语句,返回。不等,则调用explode_bomb,程序结束。

   咱跟进去分析一下strings_not_equal代码:

关键部分我加了注释,strings_not_equal逻辑是这样:

         调用string_length计算用 户输入的字符串长度,然后和密钥长度对比,如果不等,则直接爆炸,相等,则进一步进行比较。

String_length子部分:

好了,关键代码分析的差不多,咱捋一遍,简略画个框图。

phase_1第一个炸弹逻辑:

String_not_equal子模块分析:

好了,迫不及待拆蛋蛋了。

下一步----------->添加断点,利用GDB调试工具单步跟进

在strings_not_equal函数入口处添加断点,其实我想说这里就可以得出密钥了,因为炸弹一的逻辑很简单,传递字符串参数比较嘛,

那么调用函数之前,肯定要将比较值压入栈,例如这条指令:

0x8048b22:   68 78 96 04 08          push   $0x8049678

 

就很可疑。

咱试试打印出来:

果然有戏。:-D

但是这样快就拆掉太没意思了,咱还是跟进去细细分析下吧~

提个问题?如果想知道密钥的长度咱该怎么办?

分析:咱们在string_not_equal函数里面调用了string_length函数来计算长度,函数的结果利用eax寄存器传递出来,那么很简单啦,直接在传递过密钥的string_length函数后面加个断点,然后打印寄存器eax的值就可以了啊!

咱们在string_length函数后面0x8048f49 设定一个断点,打印,怎么样,出来了,密钥长度35!不信一会你数数:-D

那么再问一个问题,我想知道用户输入的数据是什么,应该怎么办???

上面看懂我分析的代码的肯定知道,传递参数无非就是压栈,利用桢指针加上偏移量就求出来了!很快定位到地址0x8048f38,加断点,打印esi寄存器值,bingo!!

I have a dream! 酷绚!

 

这里在告诉大家利用C程序格式化输出字符串的技巧,这个是调试java虚拟机时候,廖博教给我的。

我们刚求出了字符串长度为35,那么我们利用GDB把字符串存储的首地址后35个字符打印出来。

然后写一个C程序:

OK,就是这个。

话说炸弹还没有拆呢,最后运行bomb程序,输入密钥: “ The futre will be better tomorrow.”

至此,炸弹一拆除完毕。

第二个我还没分析,回头继续直播!

逆向工程之二进制炸弹第一发