《深入理解计算机系统》实验二Bomb Lab的下载和官网文档的机翻请看 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻
用的调试工具是gdb,用到的指令如下
根据bomb.c的内容判断出第一个炸弹的函数是phase_1。 反编译bomb 找到main()随便看看 第一个参数通过寄存器%rdi传递 找到关键函数phase_1的信息 发现有个strings_not_equal函数根据它的名字意思是判断字符串相不相等,上面有个"mov $0x402400,%esi"指令,而寄存器%esi表示第二个参数,第一个参数%rdi是我们输入的字符串,那就应该是判断输入的字符串和寄存器%esi的值相不相等。 用gdb调试bomb 在phase_1函数打上断点,运行程序,随便输入一个字符串 到phase_1函数中查看一下0x402400地址中的值 这个就是我们需要相等的值。 找到ASCII找到0x7220726564726f42对应的字符 小端机器所以即
42 6f 72 64 65 72 20 72 B o r d e r r Border r
直觉告诉我这答案不太对,感觉少了点啥。 试一下,炸了。 看到文档的 就试了一下 划了一下,居然给我看见了 看来就是这个字符串没错了
Border relations with Canada have never been better.
第一阶段拆除完毕。 后面发现在这里不应该查看十六进制 可以直接查看字符
写第二炸之前我们先把第一炸的答案放入一个txt文件中 按照下面的方式运行就可以直接进入第二炸,不用在输一遍第一炸的答案 后同。
反汇编bomb找到phase_2函数 看到跳转去了read_six_numbers函数,看其意是输入六个数字。 在反编译bomb里找到read_six_numbers函数,看到这么多lea而且获取的地址间隔没有那么有规律,有点懵 查一下 地址的值。果然是输入六个数字,还是整数 反过来看phase_2函数,用gdb来调试看清楚点,看输入完六个字符后进行了什么操作。 把它大概用语言描述出来,还是有点懵
if(%rsp的值==1){ %rbx=0x4(%rsp) %rbp=0x18(%rsp) do{ %eax=-0x4(rbx) %eax+=%eax if(%eax==%rbx){ %rbx+=4 } }while(%rbp!=%rbx) //%rbp==%rbx通关 }else{ //%rsp的值!=1