bomb_lab

发布时间 2023-08-16 19:13:57作者: 13763857269

phase_1

%eax 作为上一个函数的返回值,若 %eax 为0,才可以执行跳转

函数 strings_not_equal ,通过阅读代码可以发现这个函数是判断输入的两个字符串是否相等,知道函数传进去的参数分别在寄存器 %edi 和 %es i中,其中 %edi 是我们输入的字符串

寄存器 %esi 里的值就是本题答案,寄存器 %esi 是被地址在 0x402400 的内容赋值,通过gdb查看一下该地址内容

gdb bomb
查看该地址内容

(gdb) x/s 0x402400
出现本题答案:

Border relations with Canada have never been better.

phase_2

%eax = %eax + %eax

当 %rbp 与 %rbx 的值相等,则结束循环

第一个整数必须为1,后面的每一个元素都是前一个元素的两倍

本题答案:

1 2 4 8 16 32

phase_3


首先通过 sscanf 解析字符串,通过 gdb 调试可看出 sscanf 的 format 是%d %d 因此推断输出两个数字

(gdb) x/s 0x4025cf
0x4025cf: "%d %d"
输入的第一个值要大于等于 1

 

 7 必须大于 0x8(%rsp) --就是输入的第一个值,才不会发生爆炸

输入的第一个值存到 %eax 中,然后执行跳转,地址为内存地址 0x402470(,%rax,8)处的值

下面我们用 gdb 调试一下看看内存地址为 0x402470(,%rax,8) 的值

gdb x/s 0x402470(,%rax,8)

当输入值(%rax)为 0 的时候,跳转到 0x400f7c

所以答案:

2 707 ....

phase_4

这里的 sscanf 也是输入两个数字,分别在地址0x8(%rsp)、0xc(%rsp) 上

输入的第一个值不能为 2

输入的第一个值要小于 14(0xe)

将 edx、esi、edi 赋值,将参数传进 func4函数 中

当执行完 func4 函数之后返回的值在寄存器 %eax 中

返回值 %eax 要为 0

并且,0xc(%rsp) --输入的第二个值 也必须为 0

所以解析字符串为两个数字 x、y

x 必须小于等于14

调用 fun​​​​​​​c4,x、0、14 分别为其参数

func4 返回值必须为0,y 必须为0

func4 :

eax = edx
eax = eax - esi
ecx = eax
ecx = 0
eax = eax + ecx
eax = eax / 2
ecx = esi + eax
if(edi >= ecx)
{
return
eax = 0 
edi <= ecx
}

寄存器 %eax 和 %ecx 存了7

答案:

7 0

phase_5