Binary Bomb第五阶段:求解让循环执行15次的输入值
Binary Bomb第五阶段破解步骤
核心逻辑分析
先拆解汇编代码的关键流程:
- 输入读取:通过
sscanf读取两个整数,分别存在栈上0x8(%rsp)(记为input1)和0xc(%rsp)(记为input2),读取数量不足2则触发炸弹。 - 输入预处理:
input2会被做& 0xf操作(仅保留低4位,取值范围0-15),如果结果为15(0xf)直接触发炸弹。 - 循环逻辑:
- 初始化
ecx=0x64(十进制100),edx=0 - 循环体:
edx +=1(循环计数)- 以当前
eax为索引,取数组值到eax ecx -= eax- 如果
eax !=15,继续循环
- 初始化
- 验证条件:循环结束后,需同时满足:
edx ==15(循环执行15次)ecx == input1(计算后的结果匹配第一个输入)
数组对应关系(索引→值):
0:10, 1:2, 2:14, 3:7, 4:8, 5:12, 6:15, 7:11, 8:0, 9:4, 10:1, 11:13, 12:3, 13:9, 14:6, 15:5
寻找符合要求的input2
我们需要找到一个初始索引s0(input2&0xf = s0),使得从s0开始遍历数组,刚好执行15次循环后遇到值15:
- 第15次循环必须取到值15(对应索引6),前14次取到的值都不能是15
- 正向推导路径:
s0=5 → arr[5]=12(edx=1) → arr[12]=3(edx=2) → arr[3]=7(edx=3) → arr[7]=11(edx=4) → arr[11]=13(edx=5) → arr[13]=9(edx=6) → arr[9]=4(edx=7) → arr[4]=8(edx=8) → arr[8]=0(edx=9) → arr[0]=10(edx=10) → arr[10]=1(edx=11) → arr[1]=2(edx=12) → arr[2]=14(edx=13) → arr[14]=6(edx=14) → arr[6]=15(edx=15,退出循环) - 满足条件的
s0=5,因此input2可以是任何低4位为5的整数(如5、21等,通常输入5即可)
计算input1
input1等于初始ecx(100)减去循环中所有取到的数组值之和:
- 循环中取到的值依次为:12、3、7、11、13、9、4、8、0、10、1、2、14、6、15
- 总和:
12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115 input1=100-115=-15
最终输入
输入两个数:-15 5(或-15搭配任何低4位为5的数)即可通过第五阶段。
内容的提问来源于stack exchange,提问作者ThoughtOverflow
相关产品推荐
相关产品推荐

