You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编新手在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,但程序并没有跳转到目标地址,求解释。


问题解析

  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比较的是两个寄存器里的地址值,不是地址指向的内容,所以你之前的数值对比完全错误。

  1. 输入不符合验证逻辑:
    这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:10:09