【问题标题】:how to resolve segment:offset address in GDB如何解析段:GDB中的偏移地址
【发布时间】:2011-04-29 17:35:06
【问题描述】:
(gdb) info registers ds
   ds             0x7b  123
(gdb) disassemble
   Dump of assembler code for function printf@plt:
   0x0804831c <+0>: jmp    DWORD PTR ds:0x804a008
=> 0x08048322 <+6>: push   0x10
   0x08048327 <+11>:    jmp    0x80482ec
End of assembler dump.

谁能描述我如何将 ds:0x804a008 地址映射到线性地址?我可以使用“x/xw 地址”命令吗?如果不清楚,我想知道代码跳转中第一个 jmp 函数的位置。

【问题讨论】:

  • 这是针对不使用平面地址空间的平台吗?
  • ds:是默认数据段,在指令中没有指明其他段寄存器时使用。虽然可以为段设置偏移量,但所有 x86 架构都将其设置为零,因此您可以忽略段前缀。

标签: memory-management gdb


【解决方案1】:

0x804a008 是进程线性地址空间中的一个地址 - 该内存位置中的 DWORD 是要跳转到的地址(即,0x804a008 是一个指针)。 `

所以

x/xw 0x804a008

将转储指针的内容,并且

disasm *0x804a008

将反汇编跳过该指针将执行的代码。

【讨论】:

  • (gdb) x/xw 0x804a008 0x804a008 <_global_offset_table_>: 0x08048322
  • @user480162:阅读thexploit.com/sploitdev/how-is-glibc-loaded-at-runtime 上的文章,了解这里发生了什么。基本上第一次,它执行0x08048322 处的代码,解析printf() 的实际位置并将其放入指针中。所以下次调用它时,它会直接跳转到printf()
  • 这仅回答如果ds段的基地址是0x0的问题。对于现代操作系统来说就是这种情况,但是如果有人试图在 TLS 段(如 gs 或 fs)的偏移处获取地址,其中基数是任意的,则此答案无济于事。
【解决方案2】:

现代 x86 操作系统不使用分段寻址。实模式分段地址只能代表 1Mb 的地址空间。出于兼容性原因,此寻址方案仅在引导过程中使用。

操作系统将所有段寄存器设置为一个选择器,它代表您的进程的平面 32 位地址空间,但您不必担心这一点。

ds:0x804a008 与 0x804a008 相同

【讨论】:

  • 这并不完全正确。现代 x86 操作系统确实将段用于线程本地存储。虽然段寄存器本身的实际值在 64 位模式下实际上并不相关,但使用 FS 或 GS​​ 前缀操作码会导致 CPU 将 FSBASE 或 GS​​BASE MSR 值添加到线性地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2017-01-30
  • 2021-04-28
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多