前言
写这个的目的就是想记录一下自己做过的东西,内容可能比较简单,不喜请略过.
写的比较详细,按步骤大概率可重复进行实验.
本次的内容是CSAPP上的实验Bomb Lab.
部分参考了CSDN上的其他一些文章,感谢大佬们
实验环境
- MobaXterm
- Linux系统
- Objdump命令反汇编
- GDB调试工具
实验内容
准备阶段
(实验所需材料略)
- 登录服务器,解压炸弹压缩包
- 进入bomb22目录,反汇编bomb程序,储存为bomb.s
- 使用vi查看bomb.s
- 再开一个终端,使用gdb调试bomb程序
- Ctrl+c暂停调试
(此处图片[数据删除])
phase_1
- vi中使用
/main
找到主函数
观察到各步骤函数为phase_1,phase_2等等,找到phase_1
- 逐行翻译phase_1,先开辟栈帧,然后保存了一个地址调用了一个函数(从名字可以猜出是比对字符串的函数),之后返回值不相等就调用另一个函数(从名字可以猜出是爆炸的函数),然后还原栈帧结束,因此先在爆炸函数处设断点防止爆炸:
- 再找到strings_not_equal函数:
简单看一下就是逐个比字符,猜测phase_1中保存的地址就是要比较的字符串(根据网上查到的攻略的指示,eax返回的是输入的,直接入栈的是比对的,这样推理也可以)
则用r运行程序,查看此地址,输出为字符串格式:
- 尝试将此字符串输入,通过了第一关
phase_2
- vi 中
/phase_2
定位到phase_2
头开始看,压入两个值(?)后开辟栈帧(这块不是太清楚,不过关系不大),然后调用了read_six_numbers函数,从名字猜出是要读六个数字(注意有四个寄存器是默认作为函数的参数的,这里用到了%rsi) - 先来看这个函数:定位到read_six_numbers函数
开辟栈帧后的操作简单来说就是调用者保存寄存器和参数传递,可以不看(对解题意义不大)
不过要注意一点(根据网上攻略的提醒&#