【问题标题】:Stack examining with GDB. What is x/[n][x] $[reg]?使用 GDB 进行堆栈检查。什么是 x/[n][x] $[reg]?
【发布时间】: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 的十六进制数。

标签: c gdb


【解决方案1】:
 0xbffff7c0 is memory address
 0x00000000 0x08049548 0xbffff7d8 0x08048249 is the content of the 0xbffff7c0 in hexa format

一般:

 x/nfu addr 

nfu都是可选参数,指定显示多少内存以及如何格式化; addr 是一个表达式 给出你想开始显示内存的地址。如果你 使用 nfu 的默认值,您不需要键入斜杠“/”。一些 命令为 addr 设置方便的默认值。

阅读摩尔here

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 2017-06-11
    • 2011-02-15
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2016-04-10
    相关资源
    最近更新 更多