课程实验报告
课 程 名 称: 计算机组成与结构
实验项目名称: bomblab
专 业 班 级:
姓 名:
学 号:
指 导 教 师:
完 成 时 间: 2016 年 4 月 20 日
信息科学与工程学院
实验题目:bomblab
实验目的:程序运行在linux 环境中。程序运行中有6 个关卡(6 个phase),每个phase
需要用户在终端上输入特定的字符或者数字才能通关,否则会引爆炸弹!那么如何才
能知道输入什么内容呢?这需要你使用gdb 工具反汇编出汇编代码,结合c 语言文件
找到每个关卡的入口函数。然后分析汇编代码,找到在每个phase 程序段中,引导程
序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口
寻找应该在命令行输入何种字符通关。
实验环境:ubuntu14.04 虚拟机、gdb 工具
实验内容及操作步骤:
首先打开bomb.c 文件,发现这个文件里只有主函数,没有具体的代码,所以我们
要通过反汇编得到6 关的具体代码。
反汇编有两个具体的方法:
第一种:objdump -d bomb > 1.txt 将反汇编结果输出到1.txt 中
第二种:使用gdb 调试bomb,命令为(gdb)disas func_name,其中func_name
对应于本次实验中的六个函数phase_1~6,再将结果复制到word 中。
我采用第二种方法得到反汇编代码,下面对六个bomb 进行分析、得到我们拆炸弹
所需的密码。
Phase_1 内容如下
0x08048f61 : push %ebp
0x08048f62 : mov %esp,%ebp
0x08048f64 : sub $0x18,%esp 这里对esp-24
0x08048f67 : movl $0x804a15c,0x4(%esp) 这是将$0x804a15c 处的
值存入esp+4 中
0x08048f6f : mov 0x8(%ebp),%eax ebp+8 就是从调用函数处取出第
一个参数,放到eax 寄存器中
0x08048f72 : mov %eax,(%esp) 将eax 的值传给esp
0x08048f75 : call 0x8048fab 此处是入口函
数的地址0x8048fab,该函数要调用的参数为esp+4(即$0x804a15c 处的值),和ebp+8
(即我们输入的值)该函数的作用是 :判断字符串是否相等
考虑一个函数的返回值要存在eax 中,则以下的eax 已经发生改变,是判断字符
串是否相等的结果
0x08048f7a : test %eax,%eax
0x08048f7c : je 0x8048f83
0x08048f7e : call 0x80490d1
以上三句,如果eax 不为0,则引爆炸弹,如果eax 为0,则跳转到leave 语句函
数结束。说明eax 为0 时,可以进入下一关
0x08048f83 : leave
0x08048f84 : ret
解题过程:
本题的栈帧结构如下:
根据以上分析,我们发现,从键盘输入一个值,放到 (新)ebp+8 中,接着函数
进行调用,把他传到esp 中,接着,函数再从$0x804a15c 这个地址取值,放到esp+8
中,接着,程序对这两个参数进行函数调用,调用判断字符串是否相等的程序string
not equal 进行判断,如果二者相等,则返回值为0,不引爆炸弹,反之,只要二者不
相等,则炸弹爆炸。
分析结论:此处的密码存在地址$0x804a15c 中,我们只要查看该地址