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

Binary Bomb Phase_5双整数输入爆破求助——汇编分析遇阻

破解Binary Bomb Phase_5的两个输入整数

需要找到符合%d %d格式的两个输入整数来拆除Phase_5炸弹,以下是分析过程:

汇编代码

Dump of assembler code for function phase_5:
   0x00000000004015b9 <+0>:     sub    $0x18,%rsp
   0x00000000004015bd <+4>:     lea    0x8(%rsp),%rcx
   0x00000000004015c2 <+9>:     lea    0xc(%rsp),%rdx
   0x00000000004015c7 <+14>:    mov    $0x402573,%esi
   0x00000000004015cc <+19>:    mov    $0x0,%eax
   0x00000000004015d1 <+24>:    call   0x401150 <__isoc99_sscanf@plt>
   0x00000000004015d6 <+29>:    cmp    $0x1,%eax
   0x00000000004015d9 <+32>:    jle    0x401625 <phase_5+108>
   0x00000000004015db <+34>:    mov    0xc(%rsp),%eax
   0x00000000004015df <+38>:    and    $0xf,%eax
   0x00000000004015e2 <+41>:    mov    %eax,0xc(%rsp)
   0x00000000004015e6 <+45>:    cmp    $0xf,%eax
   0x00000000004015e9 <+48>:    je     0x40161b <phase_5+98>
   0x00000000004015eb <+50>:    mov    $0x0,%ecx
   0x00000000004015f0 <+55>:    mov    $0x0,%edx
   0x00000000004015f5 <+60>:    add    $0x1,%edx
   0x00000000004015f8 <+63>:    cltq   
   0x00000000004015fa <+65>:    mov    0x4022a0(,%rax,4),%eax
   0x0000000000401601 <+72>:    add    %eax,%ecx
   0x0000000000401603 <+74>:    cmp    $0xf,%eax
   0x0000000000401606 <+77>:    jne    0x4015f5 <phase_5+60>
   0x0000000000401608 <+79>:    movl   $0xf,0xc(%rsp)
   0x0000000000401610 <+87>:    cmp    $0xb,%edx
   0x0000000000401613 <+90>:    jne    0x40161b <phase_5+98>
   0x0000000000401615 <+92>:    cmp    %ecx,0x8(%rsp)
   0x0000000000401619 <+96>:    je     0x401620 <phase_5+103>
   0x000000000040161b <+98>:    call   0x401bed <explode_bomb>
   0x0000000000401620 <+103>:   add    $0x18,%rsp
   0x0000000000401624 <+107>:   ret    
   0x0000000000401625 <+108>:   call   0x401bed <explode_bomb>
   0x000000000040162a <+113>:   jmp    0x4015db <phase_5+34>
End of assembler dump.

GDB调试补充信息

(gdb) x/s 0x402573
0x402573:   "%d %d"
(gdb) x/16x 0x4022a0
0x4022a0 <array.0>: 0x0a    0x00    0x00    0x00    0x02    0x00    0x00    0x00
0x4022a8 <array.0+8>:0x0e   0x00    0x00    0x00    0x07    0x00    0x00    0x00

核心逻辑梳理

  • 程序读取两个整数,分别存储在栈上0x8(%rsp)(第一个数)和0xc(%rsp)(第二个数)位置
  • 第二个整数会与0xf按位与,仅保留低4位(取值范围0-15),若结果为15则直接触发炸弹
  • 进入循环:
    • 用处理后的第二个数作为索引访问0x4022a0处的数组
    • 将数组值累加到%ecx寄存器
    • %edx寄存器统计循环次数
    • 直到读取到数组值为0xf(15)时停止循环
  • 循环结束后需满足两个条件:
    1. 循环次数%edx必须等于0xb(11次)
    2. 第一个输入整数必须等于%ecx中的累加和

破解过程

  1. 补全数组:通过x/16w 0x4022a0可查看完整的16个int数组(索引0-15),结合已给出的前4个元素,完整数组如下:

    索引数值索引数值
    010813
    1290
    214106
    371111
    48125
    51139
    612143
    715154
  2. 寻找合法起始索引:需要找到一个起始索引(第二个数&0xf的结果),使得从该索引开始遍历数组,经过11次跳转后到达值为15的元素。反向推导路径:

    • 第11步:值为15,对应索引7
    • 第10步:索引3(数组[3]=7)
    • 第9步:索引14(数组[14]=3)
    • 第8步:索引2(数组[2]=14)
    • 第7步:索引1(数组[1]=2)
    • 第6步:索引5(数组[5]=1)
    • 第5步:索引12(数组[12]=5)
    • 第4步:索引6(数组[6]=12)
    • 第3步:索引10(数组[10]=6)
    • 第2步:索引0(数组[0]=10)
    • 第1步:索引9(数组[9]=0)
      最终起始索引为9,对应第二个输入整数可以是9(或9+16的倍数,如25、41等,通常输入最小的合法值9)。
  3. 计算累加和:遍历路径中的数组值依次为0、10、6、12、5、1、2、14、3、7、15,累加和为:
    0+10+6+12+5+1+2+14+3+7+15=75
    即第一个输入整数为75。

最终输入

75 9

内容的提问来源于stack exchange,提问作者Hsu Wai Hnin Kyaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:59:50