实验介绍
- 使用所学知识拆除Binary Bombs来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解 。
- Binary Bombs(二进制炸弹)是一个可执行程序,是C语言编译链接成的,包含phase1~phase6共6个阶段(还有隐藏阶段) 。
- 各阶段要求输入一个答案,若正确,该阶段炸弹被拆除,否则爆炸 。
- 你需要拆除尽可能多的炸弹
- 实验提供一个bomb.c和bomb可执行文件,但是,bomb.c中只有主函数,和一些彩蛋 。
- bomb有一个命令行参数,为读入的文件 。所以你可以将答案写入到一个txt文件,每个答案一行 。
- (gdb)info reg查看所有寄存器的信息
- (gdb)info frame查看栈的信息
- (gdb)b * 0x405040在0x405040处设置断点
- (gdb)b phase_1在函数phase_1处设置断点
- (gdb)x/2s 0x405010输出0x405010开始的两个字符串
- (gdb)stepi执行一条指令
- (gdb)nexti类似于stepi,但以函数调用为单位
- 【二进制炸弹实验 BinaryBombs】(gdb)c继续(遇到断点后)
- (gdb)run ans.txt命令行参数运行
- (gdb)q退出
- (gdb)finish运行到当前函数返回
- (gdb)delete删除所有断点
- (gdb)delete 5删除断点 5
- (gdb)layout asm展示当前的汇编语言(非常的好用,ctrl + L 刷新)
- (gdb)p *(int *) 0x405012输出位于地址0x405012的整数
- (gdb)p $rax输出%rax的值
- (gdb)p /x $rax以十六进制输出%rax的值
- (gdb)p *(int *)($rbp + 0x8)输出地址%rbp + 0x8的整数
- (gdb)disas phase_1反汇编phase_1函数
- 先反汇编objdump -d bomb > asm.txt 。然后把asm.txt的内容复制粘贴到word 。用word来看汇编语言,方便涂色标注
- 一边分析汇编语言,一边利用gdb调试 。
- 先熟读CSAPP第三章,最好把习题做完
文章插图
- 在phase_1函数处设置断点 。
- 随便输出一个答案,如 abcdef 。
- 观察断点信息,input_strings可知,答案确实是一个字符串 。
- 反汇编观察到 strings_not_equal,推测是在判断字符串是否相等 。然后,test命令测试返回值,如果非0,则爆炸 。
- 0为真,1为假,那么非0对于strings_not_equal,应该是字符串不等,所以现在要找到那个与输出的字符串匹配的字符串 。
- 观察到,传递给寄存器%esi的值0x403150
- 打印此处的字符串: x/2s 0x403150
- 得到答案
点击查看代码00000000004013f9 <phase_1>: 4013f9: 55 push %rbp 4013fa: 48 89 e5 mov %rsp,%rbp 4013fd: be 50 31 40 00 mov $0x403150,%esi 401402: e8 3d 04 00 00 callq 401844 <strings_not_equal> 401407: 85 c0 test %eax,%eax 401409: 75 02 jne 40140d <phase_1+0x14> 40140b: 5d pop %rbp 40140c: c3 retq 40140d: e8 2e 05 00 00 callq 401940 <explode_bomb> 401412: eb f7 jmp 40140b <phase_1+0x12>****
经验总结扩展阅读
- 公鸡为啥要打鸣
- 天空为什么是蓝的
- 有趣实验 .NET下数据库的负载均衡(续)
- 第五周 python实验报告
- 测定水中声速的实验
- 实验02_Proteus仿真数码管显示代码
- 独立动画是不是实验动画
- 风洞实验室是干嘛的
- 实验02_Proteus仿真数码管显示报告
- 有趣实验 .NET下数据库的负载均衡