bomb Lab
这个题解主要看大体思路,还是需要自己去看汇编代码对照的。
0.分析前的准备
-
下载好bomb文件
http://csapp.cs.cmu.edu/3e/labs.html
下载Self-Study Handout
-
解压
tar -xzvf bomb.tar
即可
-
文件含义
bomb
可执行文件,我们要找的炸弹就在其中bomb.c
源文件,包含部分bomb代码,同时缺少某些部分,不能编译成bomb可执行文件。如其中support.h phases.h都没有。
README
lab介绍 -
gcc必需命令(以下命令基本够用)
-
运行
-
打断点
-
打印值
-
-
取得静态汇编代码
$ objdump -d bomb >bomb.asm -d 表示取汇编代码 >bomb.asm 是重定位输出到文件,单纯执行objdump -d bomb 会将汇编显示到标准输出设备上(显示器) $ objdump -t bomb >bomb_tab.asm 得到bomb的符号表,其内有bomb的所有函数名、全局变量、静态变量常量名...(第7章会学)
至此,已准备完成。
1.正式开始
整理格式
打开bomb.asm,整理下格式,可以在vim中
gg=G #对整个文件进行格式化。
最好用带行号、智能提示的编辑器来分析。
(我将该文本从虚拟机拿出到了win10)
这里使用的编辑器为notepad2
bomb 符号表
从反汇编得到的符号表bomb_tab.asm 中可以知道,其内的关卡函数名称。phase_1 phase_2...
phase_1
-
使用Ctrl+F快速找到phase_1反汇编代码
-
汇编分析
这个地址十分可疑,因为整个phase_1函数只有这一个地方写了究竟从哪比较数据。所以我们首要目标就是去看看这地址有什么。
-
开拆
gdb bomb
先打个断点
运行起来(gdb bomb 只是将文件加载进来,并没有运行)
run #运行到第一个断点处
随便输入一些内容。
断点中了。此时我们就可以看看地址0x402400
存了什么信息。
x/s 0x402400 #以字符串格式读地址0x402400处
好,得到phase_1题解。
phase_2
-
汇编分析
大意为:
1.输入6个数
2.第一个数为1
3.后面每个数都要为前一个数的2倍
所以我们需要确定输入值在栈中的顺序,因为它可能是1 2 4 8 16 32
也可能是32 16 8 4 2 1
-
开拆
输入6个数后,查看栈中值。使用该命令,读取寄存器中地址的值。
但是很奇怪,输入的值没有出现。
我们看看汇编指令执行到哪了,可以这样:(gdb) break phase_2 Breakpoint 3 at 0x400efc #取得phase_2函数地址 display /20i 0x400efc #每次执行一条指令就会打印在0x400efc处后20条汇编指令
还在这,没有执行read_six_numbers函数,可能该函数将值读到栈中。
所以我们先执行完该函数试试。使用ni
单步执行汇编指令,不要用n
,这个单步执行一条c指令,可能对应好几条汇编指令。
再次查看栈空间格式化一下
可知,最先输入的在栈顶
这不就是1 2 4 8 16 32
好,phase_2解决。
phase_3
-
汇编分析
看完后,我们需要做:
1.查看地址0x4025cf
*0x402470(,%rax,8)
2.查看栈元素
3.__isoc99_sscanf@plt函数返回值是什么 -
开拆
输入值运行到此处
-
栈空间
7为第一参数 9为第二个参数 ,10不在
-
__isoc99_sscanf@plt函数返回值
参数个数
-
0x4025cf
可能是对输入值的表示方式,用十进制表示,2个参数
-
*0x402470(,%rax,8)
0x00400f7c
与0x00400fb9
就是phase_3的代码也就是说该跳转语句就是跳到后面的区域为eax赋值。
0x00400f7c
处,那么使得第二个参数为0xcf即可过关
-
答案为0 207
phase_4
-
汇编分析
func4函数
由上我们可知:
1.由func4可知,edi需为0,即第一个参数要为0
2.由phase_4可知,第二个次数要为0
直接出答案,就是0 0
- 开拆
…
phase_5
-
汇编分析
我们需要知道:
1.0x4024b0
0x40245e
处的值是什么 -
开拆
-
0x4024b0
-
0x40245e
-
再分析可知,输入的字符串经过处理(x&=00001111)作为一个偏移值,再去取0x4024b0
处的值,存放在(rsp+0x10)处,与"flyers"比较是否相等。
而"flyers"在其中索引为9 F E 5 6 7
。
而(x&=1111)后为9 F E 5 6 7
的有
在此,选取ionefg
作为答案
phase_6
-
汇编分析
上面代码很多,可以直接看大体步骤再去核对下就好。
从上可知,主要过程为:
1.读6个数字
2.判断每个数字都不相同
3.判断每个数字在(0,7)之间
4.值=7-本身,并保存起来
5.按照保存起来的数排序,对链表进行排序
6.重排后链表值需要为升序排序
我们只需要知道0x6032d0
处是什么 -
开拆
也就是说,我们需要给节点值排序,使其升序排列
node3 > node4 > node5 > node6 > node1 > node2
考虑到前面有x=7-x
进行过处理,我们应当输入432165
。
phase_6题解为432165
。
拆完![在这里插入图片描述](https://img-blog.csdnimg.cn/c1acf3300e0045928dc9f42a64719f0e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6JaH5bCU6I6J54m5a2tr,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
secret_phase
在bomb.asm
文件中看到了secret_phase
和fun7
俩函数。
其实除了前面的phase_1~6还有一个隐藏关卡。
但phase_6做起来已经让我分析了好久好久。
所以,这个隐藏关卡再等我积累下再来完成。