gdb提供读取或写入特定线性地址的功能,例如:
(gdb) x/1wx 0x080483e4
0x80483e4 <main>: 0x83e58955
(gdb)
但是如何指定逻辑地址?我按照以下说明来了:
0x0804841a <+6>: mov %gs:0x14,%eax
如何读取gdb中“%gs:0x14”的内存,或者将此逻辑地址转换为我可以在x
命令中使用的线性地址?
注意:我知道在这条指令之后我可以简单地阅读%eax,但这不是我关心的问题
答案 0 :(得分:4)
如何读取gdb中“%gs:0x14”的内存
您不能:GDB无法知道%gs
引用的细分如何设置。
或将此逻辑地址转换为我可以在x命令中使用的线性地址
同样,你不能一般地做到这一点。但是,您似乎在32位x86 Linux上,并且可以那样做 - %gs
设置为通过set_thread_area
系统指向线程描述符调用
您可以在GDB中执行catch syscall set_thread_area
,并检查参数(每个线程都有一个这样的调用)。实际执行此操作的代码是here。一旦你知道%gs
的设置方式,只需在base_addr
添加0x14,就可以了。
答案 1 :(得分:1)
如 Using GDB to read MSRs 中所回答,使用寄存器 $fs_base
和 $gs_base
在 gdb 8 中是可能的。
答案 2 :(得分:0)
我认为最简单的方法是读取 EAX 寄存器的内容,因为您可以看到 %gs:0x14 的值已移至 EAX。
在 GDB 中,使用 break 在 0x0804841a 之后的地址处设置断点。例如
break *0x0804841e
然后运行程序就可以用
打印EAX寄存器的内容info registers eax