汇编新手在Bomb Lab第二阶段卡于0x555555555612处的问题咨询
关于Bomb Lab Phase 2的调试疑问
我是汇编新手,正在做Bomb Lab实验,卡在地址0x0000555555555612 <+71>处,输入为0 1 1 11 1 11。
对应的汇编代码如下:
0x00005555555555cb <+0>: endbr64 0x00005555555555cf <+4>: push %rbp 0x00005555555555d0 <+5>: push %rbx 0x00005555555555d1 <+6>: sub $0x28,%rsp 0x00005555555555d5 <+10>: mov %fs:0x28,%rax 0x00005555555555de <+19>: mov %rax,0x18(%rsp) 0x00005555555555e3 <+24>: xor %eax,%eax 0x00005555555555e5 <+26>: mov %rsp,%rsi 0x00005555555555e8 <+29>: callq 0x555555555bd6 <read_six_numbers> 0x00005555555555ed <+34>: cmpl $0x0,(%rsp) 0x00005555555555f1 <+38>: jne 0x5555555555fa <phase_2+47> 0x00005555555555f3 <+40>: cmpl $0x1,0x4(%rsp) 0x00005555555555f8 <+45>: je 0x5555555555ff <phase_2+52> 0x00005555555555fa <+47>: callq 0x555555555baa <explode_bomb> 0x00005555555555ff <+52>: mov %rsp,%rbx 0x0000555555555602 <+55>: lea 0x10(%rsp),%rbp 0x0000555555555607 <+60>: jmp 0x555555555617 <phase_2+76> 0x0000555555555609 <+62>: callq 0x555555555baa <explode_bomb> 0x000055555555560e <+67>: add $0x4,%rbx => 0x0000555555555612 <+71>: cmp %rbp,%rbx 0x0000555555555615 <+74>: je 0x555555555623 <phase_2+88> 0x0000555555555617 <+76>: mov 0x4(%rbx),%eax 0x000055555555561a <+79>: add (%rbx),%eax 0x000055555555561c <+81>: cmp %eax,0x8(%rbx) 0x000055555555561f <+84>: je 0x55555555560e <phase_2+67> 0x0000555555555621 <+86>: jmp 0x555555555609 <phase_2+62> 0x0000555555555623 <+88>: mov 0x18(%rsp),%rax 0x0000555555555628 <+93>: xor %fs:0x28,%rax 0x0000555555555631 <+102>: jne 0x55555555563a <phase_2+111> 0x0000555555555633 <+104>: add $0x28,%rsp 0x0000555555555637 <+108>: pop %rbx 0x0000555555555638 <+109>: pop %rbp 0x0000555555555639 <+110>: retq 0x000055555555563a <+111>: callq 0x555555555220 <__stack_chk_fail@plt>
我原本以为0x0000555555555612 <+71>处的cmp %rbp,%rbx指令会比较%rbx和%rbp,相等就跳转到0x0000555555555623 <+88>。但用gdb调试时,查看的数值如下:
x/d $rbp 0x7fffffffd100: 1 (gdb) ni 0x0000555555555615 in phase_2 () (gdb) ni 0x0000555555555617 in phase_2 () (gdb) x/d $rbx 0x7fffffffd0f4: 1
看起来%rbp和%rbx的数值都是1,但程序并没有跳转到目标地址,求解释。
问题解析
- 寄存器查看方式错误:
x/d $rbp查看的是**%rbp寄存器指向的内存地址中的数值**,而非%rbp寄存器本身的地址值;同理x/d $rbx查看的是%rbx指向的内存内容,不是寄存器自身存储的地址。正确查看寄存器值的命令是p $rbp和p $rbx。
从汇编初始化逻辑看:
mov %rsp,%rbx:%rbx被赋值为栈指针地址(第一个输入数字的存储地址)lea 0x10(%rsp),%rbp:%rbp被设置为%rsp + 0x10的地址(对应第五个输入数字的存储地址,因为每个int占4字节,0x10=16,16/4=4,即rsp偏移4个int的位置)
cmp %rbp,%rbx比较的是两个寄存器里的地址值,不是地址指向的内容,所以你之前的数值对比完全错误。
- 输入不符合验证逻辑:
这个Phase 2的验证逻辑是斐波那契数列:
- 第一个数必须为0,第二个必须为1
- 从第三个数开始,每个数必须等于前两个数之和:
第n个数 = 第n-1个数 + 第n-2个数
你的输入0 1 1 11 1 11中,第三个数1符合要求(0+1),但第四个数应该是1+1=2而非11,这才是程序触发爆炸的根本原因,正确输入应为0 1 1 2 3 5。
内容的提问来源于stack exchange,提问作者nicole
相关产品推荐
相关产品推荐

