深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_5)

时间:2021-03-06 01:13:47

本文接 深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_4)写,已经坚持写了四个部分,最近把第五关破解了,发现这次的关卡是和数组相关的,接下来简单讲讲破解的过程。

在反汇编出来的代码中查找到函数phase_5,代码如下:

08048db8 <phase_5>:
8048db8: 55 push %ebp
8048db9: 89 e5 mov %esp,%ebp
8048dbb: 56 push %esi
8048dbc: 53 push %ebx
8048dbd: 83 ec 20 sub $0x20,%esp
8048dc0: 8d 45 f0 lea -0x10(%ebp),%eax
8048dc3: 89 44 24 0c mov %eax,0xc(%esp)
8048dc7: 8d 45 f4 lea -0xc(%ebp),%eax
8048dca: 89 44 24 08 mov %eax,0x8(%esp)
8048dce: c7 44 24 04 3e a2 04 movl $0x804a23e,0x4(%esp)
8048dd5: 08
8048dd6: 8b 45 08 mov 0x8(%ebp),%eax
8048dd9: 89 04 24 mov %eax,(%esp)
8048ddc: e8 5f fa ff ff call 8048840 <__isoc99_sscanf@plt>
8048de1: 83 f8 01 cmp $0x1,%eax
8048de4: 7f 05 jg 8048deb <phase_5+0x33>
8048de6: e8 e6 02 00 00 call 80490d1 <explode_bomb>
8048deb: 8b 45 f4 mov -0xc(%ebp),%eax
8048dee: 83 e0 0f and $0xf,%eax
8048df1: 89 45 f4 mov %eax,-0xc(%ebp)
8048df4: 83 f8 0f cmp $0xf,%eax
8048df7: 74 29 je 8048e22 <phase_5+0x6a>
8048df9: b9 00 00 00 00 mov $0x0,%ecx
8048dfe: ba 00 00 00 00 mov $0x0,%edx
8048e03: bb c0 a1 04 08 mov $0x804a1c0,%ebx
8048e08: 83 c2 01 add $0x1,%edx
8048e0b: 8b 04 83 mov (%ebx,%eax,4),%eax
8048e0e: 01 c1 add %eax,%ecx
8048e10: 83 f8 0f cmp $0xf,%eax
8048e13: 75 f3 jne 8048e08 <phase_5+0x50>
8048e15: 89 45 f4 mov %eax,-0xc(%ebp)
8048e18: 83 fa 0f cmp $0xf,%edx
8048e1b: 75 05 jne 8048e22 <phase_5+0x6a>
8048e1d: 39 4d f0 cmp %ecx,-0x10(%ebp)
8048e20: 74 05 je 8048e27 <phase_5+0x6f>
8048e22: e8 aa 02 00 00 call 80490d1 <explode_bomb>
8048e27: 83 c4 20 add $0x20,%esp
8048e2a: 5b pop %ebx
8048e2b: 5e pop %esi
8048e2c: 5d pop %ebp
8048e2d: c3 ret

前面新空间的开辟依然是一样的的过程,0x8048de1开始,eax中存储的应该也是输入数据的个数,要求必须是大于1个输入,否则炸弹爆炸。

设-0xc(%ebp)和-0x10(%ebp)位置的两个参数值分别为val1和val2,0x8048deb位置将val1的值放入寄存器eax,0x8048dee将val1和0xf做与操作后传回val所在的内存地址-0xc(%ebp)处。

0x8048df4位置的cmp指令将eax中val1的值和15(十进制)作比较,若val1等于15,则跳转到爆炸函数,引爆炸弹,这说明val1的值不能是15。

0x8048df9位置开始运算,设寄存器%ecx,%edx,%ebx中的值分别为x,y,z。

接下来0x8048e03位置传入了一个地址,然后看到0x8048e0b位置对这个地址进行操作,以4单位为增长,可以猜测这是一个数组操作。

从0x8048df9开始继续往下读代码,把对应的汇编代码转化为等价的C语言代码:

深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_5)


总结来说,这是一个实现数组元素累加的程序。参数val1被用来计算每次的地址偏移量,初始的val1值由输入给出,参数val2被用来存放累加的结果。

可以看出,每次被加上的数组元素的下标是不连续的。循环进行了15次加法,且加上去的最后一个元素是15。所以可以通过第一个元素逆推出之前累加了哪些元素。

当前元素的地址是由上一个元素的值×4+基地址组成的,从地址0x804a1c0开始查看内存:

深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_5)

深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_5)

所以按照最后取出到最先取出的顺序,取出元素的值依次为:

15 6 14 2 1 10 0 8 4 9 13 11 7 3 12

最先取出的值是12,偏移量为20,即4×5,说明第一个参数的值是5。

对取出的元素求和,答案是115,这是第二个参数的值。

所以答案应该是5 115。

验证一下:

深入理解计算机系统(CSAPP)课程实验bomb程序炸弹实验日志(phase_5)