如何在 gdb 中使用带有 FS 或 GS​​ 基址的逻辑地址?

2024-01-16

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

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

但如何指定逻辑地址呢?我遇到了以下指令:

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

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

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


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

你不能:GDB 无法知道该段如何到达哪个%gs指已经设立。

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

再说一遍,一般情况下你不能这样做。然而,您似乎使用的是 32 位 x86 Linux,并且您can这样做——%gs设置为通过以下方式指向线程描述符set_thread_area系统调用。

你可以做catch syscall set_thread_area在 GDB 中,并检查参数(每个线程都会有一个这样的调用)。实际执行此操作的代码是here http://repo.or.cz/w/glibc.git/blob/HEAD:/nptl/sysdeps/i386/tls.h#l230。一旦你知道如何%gs已经设置好了,只需添加0x14即可base_addr,你就完成了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 gdb 中使用带有 FS 或 GS​​ 基址的逻辑地址? 的相关文章

随机推荐