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

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

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

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

objdump –t  bomb > 1

 

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

很好,结果清晰了,可是这个invalid_phase和secret_phase是作什么的?不大明白。先无论,3d

objdump – d bomb > 2 

 

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

Phase_1里面有调用explode_bomb,那如今肯定了就 是这个。调试

下一步----------->追踪Phase_1blog

分析下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.”

至此,炸弹一拆除完毕。

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

相关文章
相关标签/搜索