实验目的:
通过二进制炸弹实验,熟悉汇编语言,反汇编工具objdump以及gdb调试工具。
实验内容:
1、eflags标志位的查看。
2、backtrace指令学习。
3、炸弹实验第3、4关。
实验过程:
1、进入gdb调试命令,设置断点运行之前课上得到的hello文件,然后输入i r指令即可查看寄存器的内容,当然也包括eflags标志位寄存器的值。
32位CPU的标志位寄存器的主要标志位分布如下:
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
VM |
RF |
|
NT |
IOPL |
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
|
|
|
|
|
|
|
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
在上面我查出的标志位寄存器eflags的值为0x286转化为二进制形式即为001010000110,对应到相应位即可知道哪些标志位值为1,我们也可以通过例如set eflags=0x206语句来设置标志位的值,至于你想要什么标志位值为1,则可以通过把上表中对应位的值置为1,再转化为16进制数来改变标志位的值。
2、backtrace指令可以查看程序所有函数的栈帧,简写为bt,以下显示的即为main函数和sum函数栈帧的返回地址。
也可以通过以下指令查看帧的详细信息:
3、
第三关:
1)、有了前面两关的经验,在过第三关的时候,一开始我就直接进入bomb文件的gdb调试界面,反汇编得到phase_3函数的汇编代码,代码很长一次性显示不完全,回车即可接着显示余下的代码直到显示完(这里没有截完所有的图)。
观察整个phase_3函数的汇编代码,我发现它跟前面两关有一个相似之处,调用了两个函数,其中一个仍是爆炸函数,另一个是__isoc99_sscanf@plt函数,现在猜不出这个函数要干嘛了,所以,我索性直接开始分析phase_3函数汇编代码,希望能发现一些线索。
2)、开始分析phase_3函数的反汇编代码:
首先是为函数准备堆栈,这里开辟了40个字节的内存。