14

gdb 提供读取或写入特定线性地址的功能,例如:

(gdb) x/1wx 0x080483e4
0x80483e4 <main>:       0x83e58955
(gdb) 

但是你如何指定一个逻辑地址?我遇到了以下说明:

   0x0804841a <+6>:     mov    %gs:0x14,%eax

如何在 gdb 中读取“%gs:0x14”处的内存,或者将这个逻辑地址转换为我可以在x命令中使用的线性地址?

注意:我知道在这条指令之后我可以简单地阅读 %eax,但这不是我关心的问题

4

3 回答 3

5

我如何在 gdb 中读取“%gs:0x14”的内存

你不能:GDB 无法知道所%gs引用的段是如何设置的。

或将此逻辑地址转换为我可以在 x 命令中使用的线性地址

同样,您通常不能这样做。但是,您似乎在 32 位 x86 Linux 上,您可以在其中执行此操作 -设置为通过系统调用%gs指向线程描述符。set_thread_area

你可以catch syscall set_thread_area在 GDB 中做,并检查参数(每个线程都会有一个这样的调用)。实际执行此操作的代码在这里。一旦你知道如何%gs设置,只需将 0x14 添加到base_addr,就完成了。

于 2012-04-28T17:56:53.320 回答
3

正如使用 GDB 读取 MSR中所回答的那样,这可以通过 gdb 8 使用寄存器$fs_base$gs_base.

于 2021-06-19T22:31:17.857 回答
1

我认为最简单的方法是读取 EAX 寄存器的内容,因为您可以看到 %gs:0x14 的值已移至 EAX。

在 GDB 中,在 0x0804841a 之后的地址处设置断点并使用 break。例如

break *0x0804841e

然后运行程序,你可以打印 EAX 寄存器的内容

info registers eax
于 2021-01-31T20:12:19.393 回答