汇编指令:
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}
汇编代码分析及注释:
分析过程:
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.查看数组内容。
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程序,将满足条件的参数输出。