【发布时间】:2014-02-11 04:00:16
【问题描述】:
我有以下汇编代码:
0x08048d36 <+0>: push %ebp
0x08048d37 <+1>: mov %esp,%ebp
0x08048d39 <+3>: push %esi
0x08048d3a <+4>: push %ebx
0x08048d3b <+5>: sub $0x20,%esp
0x08048d3e <+8>: lea -0x10(%ebp),%eax
0x08048d41 <+11>: mov %eax,0xc(%esp)
0x08048d45 <+15>: lea -0xc(%ebp),%eax
0x08048d48 <+18>: mov %eax,0x8(%esp)
0x08048d4c <+22>: movl $0x804a28a,0x4(%esp)
0x08048d54 <+30>: mov 0x8(%ebp),%eax
0x08048d57 <+33>: mov %eax,(%esp)
0x08048d5a <+36>: call 0x8048758 <__isoc99_sscanf@plt>
0x08048d5f <+41>: cmp $0x1,%eax
0x08048d62 <+44>: jg 0x8048d69 <phase_5+51>
0x08048d64 <+46>: call 0x80491a8 <explode_bomb>
0x08048d69 <+51>: mov -0xc(%ebp),%eax
0x08048d6c <+54>: and $0xf,%eax
0x08048d6f <+57>: mov %eax,-0xc(%ebp)
0x08048d72 <+60>: cmp $0xf,%eax
0x08048d75 <+63>: je 0x8048da0 <phase_5+106>
0x08048d77 <+65>: mov $0x0,%ecx
0x08048d7c <+70>: mov $0x0,%edx
0x08048d81 <+75>: mov $0x804a1e0,%ebx
0x08048d86 <+80>: add $0x1,%edx
0x08048d89 <+83>: mov (%ebx,%eax,4),%eax
0x08048d8c <+86>: add %eax,%ecx
0x08048d8e <+88>: cmp $0xf,%eax
0x08048d91 <+91>: jne 0x8048d86 <phase_5+80>
0x08048d93 <+93>: mov %eax,-0xc(%ebp)
0x08048d96 <+96>: cmp $0xf,%edx
0x08048d99 <+99>: jne 0x8048da0 <phase_5+106>
0x08048d9b <+101>: cmp -0x10(%ebp),%ecx
0x08048d9e <+104>: je 0x8048da5 <phase_5+111>
0x08048da0 <+106>: call 0x80491a8 <explode_bomb>
0x08048da5 <+111>: add $0x20,%esp
0x08048da8 <+114>: pop %ebx
0x08048da9 <+115>: pop %esi
0x08048daa <+116>: pop %ebp
0x08048dab <+117>: ret
Scanf 期望用户提供两个数字。 行中引用的地址 $0x804a1e0 似乎引用了一个数组。当我获取该数组的值时,我得到:
(gdb) x/15dw 0x804a1e0
0x804a1e0 <array.2985>: 10 2 14 7
0x804a1f0 <array.2985+16>: 8 12 15 11
0x804a200 <array.2985+32>: 0 4 1 13
0x804a210 <array.2985+48>: 3 9 6
我不知道我应该如何处理这些信息。我知道这个汇编代码中有一个循环,它会一直回到 行,直到 $eax 保持值 15,但我不知道这个函数需要什么代码才能成功退出。
【问题讨论】:
-
您希望 gdb 命令
x /15dw 0x804a1e0显示数组的内容(字,而不是字节)。 -
感谢您的提示。我已经编辑了问题。