计算机系统原理 Bomb实验 炸弹一/phase_1
Bomb 日志
l 实验准备:
打开bomb.c文件,发现文件中只有主函数,没有我们需要闯关的具体代码,所以考虑如何通过bomb文件得到六关的具体代码,在linux中通过反汇编得到bomb的汇编代码,从第一关开始阅读汇编代码,找出闯关的关键代码。
l 具体过程:
打开下载的文件,通过反汇编得到bomb.s反汇编文件:
通过vi指令打开反汇编文件bomb.s:
查看bomb.s文件:
找到关卡1的反汇编代码:
分析此段代码:
push %ebp 将ebp寄存器中的内容入栈
mov %esp,%ebp 将esp中的内容复制到ebp中
sub $0x18,%esp 分配16进制18即24个字节的空间
movl $0x804a15c,0x4(%esp) 将$0x804a15c处值存入esp+4地址处
mov 0x8(%ebp),%eax 将ebp+8处的值存到eax中
mov %eax,(%esp) 将eax中的值传递给esp
call 8048fab<strings_not_equal>
通过8048fab函数判断esp+4和esp中的值是否相等test
%eax,%eax 判读eax值是否为0
je 8048f83 <phase_1+0x22> 若eax为0则跳转到8048f83处
call 80490d1<explode_bomb> 跳转到80490d1通过函数引爆炸弹
leave 结束,eax为0时进入下一关
ret
本题的栈帧结构如下图所示:
拆除炸弹一即不让第一段程序进入爆炸。分析代码,整段代码就是先将存有目标字符串的地址$0x804a15c先存入了当前帧,再将外部输入的字符串存入到ebp+8的位置,即上图所示的参数一,再通过eax将参数一传递到esp中,通过函数调用比较esp与esp+4中的字符串是否相等,如果相等,返回值为0,程序跳转到leave,进入下一进程,反之不相等则引起爆炸,所以我们只需要查看地址$0x804a15c处的值就能解除炸弹危机了。
如下图所示,使用GDB查看指定地址存储的数据:
所以易知:
第一关炸弹可使用字符串“We have to stand with our North Korean allies”来进行拆除。