二进制炸弹 phase(5)

Posted by SGQ on March 26, 2020

汇编指令:

AND指令:

AND 指令在两个操作数的对应位之间进行(按位)逻辑与(AND)操作,并将结果存放在目标操作数中: AND destination,source

mov 0x804a2a0(, %eax, 4), %eax

offset(base, index, width)
//其值为 base+index*width+offset
//所以对于
	mov 0x804a460(, %eax, 4), %eax
//可翻译为
	eax = eax*4+804a2a0

GDB调试器

在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:

    p *array@len

@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:
  
    (gdb) p *array@len
    $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}

汇编代码分析及注释:

enter description here enter description here

分析过程:

1. 首先查看$0x804a3ef,%d %d 输入两个数字。

2.大于1跳转,不大于1就爆炸,说明至少输入两个数。

8048e34: 83 f8 01 cmp $0x1,%eax

8048e37: 7f 05 jg 8048e3e <phase_5+0x31>

3.此处为循环的开始进行初始化。

8048e4e: b9 00 00 00 00 mov $0x0,%ecx

` 8048e53: ba 00 00 00 00 mov $0x0,%edx`

8048e58: 83 c2 01 add $0x1,%edx //类似i++,edx+1

4.跳出循环条件:eax=15

8048e64: 83 f8 0f cmp $0xf,%eax //eax不等15继续

8048e67: 75 ef jne 8048e58 <phase_5+0x4b>

5.循环次数:15

8048e6d: 83 fa 0f cmp $0xf,%edx //edx不等于15引爆炸弹,循环15次

8048e70: 75 06 jne 8048e78 <phase_5+0x6b>

所以需要在循环十五次的条件下,并且eax最终结果为15.

6.循环主体部分。

8048e5b: 8b 04 85 a0 a2 04 08 mov 0x804a2a0(,%eax,4),%eax //eax=eax*4+0x804a2a0 数组

8048e62: 01 c1 add %eax,%ecx //进行累加

7.查看数组内容。

enter description here

8.输入的第二个参数是循环十五次eax的累加和。

8048e72: 3b 4c 24 1c cmp 0x1c(%esp),%ecx //ecx等于输入的第二个数结束。

` 8048e76: 74 05 je 8048e7d <phase_5+0x70>`

总结

通过分析,目前还没有得到最终结果,刚开始我假设输入的参数1为0,然后计算累加和,作为第参数2,发现并不对。遗漏了一个重要条件:循环十五次

如何找到参数1,使它循环十五次在数组中所取的数为15呢,目前我还没有解决,但只是有一个思路,写一个c或者python程序,将满足条件的参数输出。


参考链接:

GDB调试教程

gdb中查看数组各项的值

感谢您的查阅,欢迎来访!