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)时停止循环
- 用处理后的第二个数作为索引访问
- 循环结束后需满足两个条件:
- 循环次数
%edx必须等于0xb(11次) - 第一个输入整数必须等于
%ecx中的累加和
- 循环次数
破解过程
补全数组:通过
x/16w 0x4022a0可查看完整的16个int数组(索引0-15),结合已给出的前4个元素,完整数组如下:索引 数值 索引 数值 0 10 8 13 1 2 9 0 2 14 10 6 3 7 11 11 4 8 12 5 5 1 13 9 6 12 14 3 7 15 15 4 寻找合法起始索引:需要找到一个起始索引(第二个数&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)。
计算累加和:遍历路径中的数组值依次为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
相关产品推荐
相关产品推荐

