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
调用 func4,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