没有合适的资源?快使用搜索试试~ 我知道了~
CSAPP bomblab实验报告
5星 · 超过95%的资源 需积分: 12 119 下载量 127 浏览量
2012-04-29
10:15:47
上传
评论
收藏 343KB PDF 举报
温馨提示
试读
14页
二进制炸弹实验的实验报告,自己写的,包括关键的phase代码和相应函数代码。
资源推荐
资源详情
资源评论
进制炸弹实验报告
登录putty服务器后,首先运行静态分析工具OBJDUMP 来获得程序的反汇编版本bomb.txt,
用 notepad++ 打开便可通过汇编代码来分析程序。
运行gdb bomb,开始进行动态调试。
首先找到explode_bomb的地址0x80492ab, 在爆炸函数的的入口设置断点,输入break
*0x80492ab 这样就可以避免调试过程中各种原因引起的爆炸。
首先来看 phase1 的代码:
08048f19 <phase_1>:
8048f19: 55 push %ebp
8048f1a: 89 e5 mov %esp,%ebp
8048f1c: 83 ec 08 sub $0x8,%esp
8048f1f: c7 44 24 04 ec 98 04 movl $0x80498ec,0x4(%esp)
8048f26: 08
8048f27: 8b 45 08 mov 0x8(%ebp),%eax
8048f2a: 89 04 24 mov %eax,(%esp)
8048f2d: e8 39 00 00 00 call 8048f6b <strings_not_equal>
8048f32: 85 c0 test %eax,%eax
8048f34: 74 05 je 8048f3b <phase_1+0x22>
8048f36: e8 70 03 00 00 call 80492ab <explode_bomb>
8048f3b: c9 leave
8048f3c: 8d 74 26 00 lea 0x0(%esi),%esi
8048f40: c3 ret
注意 strings_not_equal 这个函数,从字面上可以猜想地理解为:把输入的字符串和内存
某处字符串相比较,不相等的时候函数返回值的为 1。再看接下来两句:
test %eax,%eax
je 8048f3b <phase_1+0x22>
Test 是把两个操作数进行与运算,而通常这两个操作数是一样的,此操作的意义就在于影
响标志位,当%eax 为 0 时,零标志位置 1,否则零标志为 0。而从 je 指令可以知道当%eax
为 0 时程序会跳过接下来一句对爆炸函数的引用,所以我们的目标就是要是 %eax 即
strings_not_equal 的返回值为 0,即要是输入的字符串与内存某处的存放的字符串相等。
于是现在的关键就是找出那个字符串是放在内存的哪个地方。其实非常明显,$0x80498ec 这
个地址在程序里实在太显眼,用 x/s 0x80498ec 命令一查,果然那里存放有一句话:"The
future will be better tomorrow."
输入进去之后出现如下提示开始第二个炸弹:
然后来看 phase2:
08048eb9 <phase_2>:
8048eb9: 55 push %ebp
8048eba: 89 e5 mov %esp,%ebp
8048ebc: 56 push %esi
8048ebd: 53 push %ebx
8048ebe: 83 ec 30 sub $0x30,%esp
8048ec1: 8d 45 e0 lea -0x20(%ebp),%eax
8048ec4: 89 44 24 04 mov %eax,0x4(%esp)
8048ec8: 8b 45 08 mov 0x8(%ebp),%eax
8048ecb: 89 04 24 mov %eax,(%esp)
8048ece: e8 1a 04 00 00 call 80492ed <read_six_numbers>
8048ed3: 83 7d e0 01 cmpl $0x1,-0x20(%ebp)
8048ed7: 74 29 je 8048f02 <phase_2+0x49>
8048ed9: e8 cd 03 00 00 call 80492ab <explode_bomb>
8048ede: 66 90 xchg %ax,%ax
8048ee0: eb 20 jmp 8048f02 <phase_2+0x49>
8048ee2: 89 da mov %ebx,%edx
8048ee4: 83 c3 01 add $0x1,%ebx
8048ee7: 89 d8 mov %ebx,%eax
8048ee9: 0f af 44 96 fc imul -0x4(%esi,%edx,4),%eax
8048eee: 39 04 96 cmp %eax,(%esi,%edx,4)
8048ef1: 74 05 je 8048ef8 <phase_2+0x3f>
8048ef3: e8 b3 03 00 00 call 80492ab <explode_bomb>
8048ef8: 83 fb 06 cmp $0x6,%ebx
8048efb: 75 e5 jne 8048ee2 <phase_2+0x29>
8048efd: 8d 76 00 lea 0x0(%esi),%esi
8048f00: eb 10 jmp 8048f12 <phase_2+0x59>
8048f02: bb 01 00 00 00 mov $0x1,%ebx
8048f07: 8d 75 e0 lea -0x20(%ebp),%esi
8048f0a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
8048f10: eb d0 jmp 8048ee2 <phase_2+0x29>
8048f12: 83 c4 30 add $0x30,%esp
8048f15: 5b pop %ebx
8048f16: 5e pop %esi
8048f17: 5d pop %ebp
8048f18: c3 ret
分析解答:
注意到 read_six_numbers 这个函数,同样顾名思义我先猜他为输入 6 个数字。暂且不看
read_six_numbers 函数的内容,先注意 8048ed3 这句,cmpl 显然是要引起我高度注意的,
因为比较的结果往往直接关系到爆不爆的问题。这条指令的内容很明确,就是看 -0x20(%ebp)
处的数字是否为 1,不是的话就会调用爆炸函数。于是我非常坚定地认为 1 便是我该输入的
第一个数字,而输入的数字是存放在 -0x20(%ebp) 开始的地址处的。
接着看下去:
8048ee9: 0f af 44 96 fc imul -0x4(%esi,%edx,4),%eax
8048eee: 39 04 96 cmp %eax,(%esi,%edx,4)
及
8048f07: 8d 75 e0 lea -0x20(%ebp),%esi
8048ee9 这句中的 -0x4(%esi,%edx,4) 这个存储器操作数稍作思考便可以知道其实就是
-0x20(%ebp),即是我们要输入的第一个数字,因为此时%eax 为 2。所以这句是将第一个数
字乘以 2 放入%eax。8048eee 中将 %eax 和 (%esi,%edx,4)进行比较,相等则继续运行,
很容易看出(%esi,%edx,4)即-0x1c(%ebp)是我们输入第 2 个数字的地方。
8048ef8 和 8048efb 两句告诉我们从%ebx 等于 1 到 5 进行以上操作,即后面一个数字由
前面一个数字乘以%eax 得到,而每次的乘数%eax 为%ebx 加 1,即乘数分别为 2,3,4,5,
6,所以可以确定这六个数字分别为 1,2,3,4,5,6 的阶乘,即 1 2 6 24 120 720。
于是输入,果然:That's number 2. Keep going!
剩余13页未读,继续阅读
xperia
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页