Bomb 日志
l 实验准备:
经过第一关炸弹的拆除,我们已经对程序执行时栈帧结构操作有了一部分了解,所以接下来我们只需要依照第一关炸弹的拆除办法依次对后面几关的代码进行反汇编、反汇编分析找出关键字符串即可。
l 具体过程:
通过vi指令打开反汇编得到bomb.s文件:
查看bomb.s文件:
找到关卡2的反汇编代码:
分析此段代码:
push %ebp 将ebp寄存器中的内容入栈
mov %esp,%ebp 将esp中的内容复制到ebp中
push %esi 将esi寄存器中的内容入栈
push %ebx 将ebx寄存器中的内容入栈
sub $0x30,%esp 分配16进制30即48个字节的空间
lea -0x20(%ebp),%eax 取出ebp-32处的值传送到eax中
mov %eax,0x4(%esp) 将eax中的值存入esp+4位置处
mov 0x8(%ebp),%eax 将ebp+8位置处的数据传输到eax中
mov %eax,(%esp) 将eax中的值传输到esp中
call 804910b <read_six_numbers>
过程调用,804910b为被调用过程起始点指令地址,将返回地址入栈,并跳转到被调用过程的起始处
cmpl $OxO,-0x20(%ebp) 将数值0与ebp-32处的值相减
jne 8048d90 <phase_2+0x26>
根据上一步想减的结果进行下一步,如果不等于0,执行jne指令跳转到8048d90
cmpl $0x1,-0x1c(%ebp) 将数值1与ebp-28处的值相减
je 8048d95 <phase_2+0x2b>
根据上一步相减的结果进行下一步,如果相等,执行je指令跳转到8048d95
call 80490d1 <explode_bomb> 跳转到80490d1通过函数引爆炸弹
lea -0x18(%ebp),%ebx 取出ebp-24处的值传送到ebx中
lea -0x8(%ebp),%esi 取出ebp-8处的值传送到esi中
mov -0x4(%ebx),%eax 将ebx-4即ebp-24-4处的数据传输到eax中
add -Ox8(%ebx),%eax 将ebx-8即ebp-24-8处的数与eax中数相加
cmp %eax,(%ebx) 将eax寄存器里的值与ebx寄存器值相减
je 8048daa <phase_2+0x40>
根据上一步相减的结果进行下一步,如果相等,执行je指令跳转到8048daa
call 80490d1 <explode_bomb> 跳转到80490d1通过函数引爆炸弹
add $Ox4,%ebx 将ebx+4即ebp-24+4处中的值相加,结果传回ebx中
cmp %esi,%ebx 将esi寄存器里的值与ebx寄存器值相减
jne 8048d9b <phase_2+0x31>
根据上一步想减的结果进行下一步,如果不相等,执行jne指令跳转到8048d9b
add $Ox30,%esp 将位置48处的值与esp中的值相加,结果传回ebx中
pop %ebx 将ebx从栈中弹出
pop %esi 将esi从栈中弹出
pop %ebp 将ebp从栈中弹出
ret 结束程序
本题的栈帧结构如下图所示:

拆除炸弹二即不让第二段程序进入爆炸。分析代码,程序先将寄存器esi、ebx进行压栈保存,再给整个进程分配3*16即48个字节,所有的准备工作完成。首先,将ebp-2*16处的值传输到eax中,再将eax中的值存入esp+4即edp-32处;将ebp+8中的值传输到eax中,再将eax中的值存入esp处;cmpl指令使0与ebp-2*16处的值相减,根据检查的结果判断下一步的走向,如果上一步相减的结果不为0,就跳到8048d90处即执行炸弹程序,触发炸弹,所以数字串的第一个数字为0;第二个cmpl指令使1与ebp-(16+12)中的值相减,再根据相减结果判断下一步走向,如果结果为0,则跳到8048d95继续执行,就跳过了炸弹。lea将ebp-(16+8)的值存入ebx中,第二个lea将ebp-8的值存入esi中,后面会用到这里的赋值控制循环,再将ebx-4即ebp-24-4的值存入eax中,将ebx-8即ebp-24-8的值与eax中的值相加存入eax中,最后比较eax和ebx中的值,如果相等,跳到add指令行,否则执行call炸弹,触发炸弹。add指令将ebx中的值加上4,最后比较esi与ebx中的值,如果相减不等于0,则进入下一循环,否则循环结束,整个程序结束,综上所述:只要在每一次碰到炸弹时不去触发它,就可以保证程序正常执行,即解除炸弹危机了。
所以易知:
第二关炸弹可使用数字串“011235”来进行拆除。