【发布时间】:2017-02-03 21:08:43
【问题描述】:
我是 GDB 的新手,不熟悉软件如何在底层工作。
目前我正在阅读 Jon Erickson 的书《HACKING the art of expoitation》。
我知道什么是堆栈,什么是堆栈指针,基指针等等。我可以很容易地理解info stack 命令,但x/[n][x] $[reg] 是什么?
书中示例:
0x08048344 <test_function+0>: push ebp
0x08048345 <test_function+1>: mov ebp,esp
0x08048347 <test_function+3>: sub esp,0x28
0x0804834a <test_function+6>: mov DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>: mov BYTE PTR [ebp-40],0x41
0x08048355 <test_function+17>: leave
0x08048356 <test_function+18>: ret
...
(gdb) x/16xw $esp
0xbffff7c0: 0x00000000 0x08049548 0xbffff7d8 0x08048249
0xbffff7d0: 0xb7f9f729 0xb7fd6ff4 0xbffff808 0x080483b9
0xbffff7e0: 0xb7fd6ff4 0xbffff89c 0xbffff808 0x0804838b
0xbffff7f0: 0x00000001 0x00000002 0x00000003 0x00000004
那是什么?据我所知,这个命令显示了 16 个最后一个 var 存储在堆栈中的地址。
但是0xbffff7c0 0xbffff7d0 0xbffff7ce 是什么?怎么读?为什么总是有 10 个字节的移位?
请解释一下。
【问题讨论】:
-
左边部分是内存地址。每行是 16 个字节,所以数字增加了 16,即 10 的十六进制数。