我用gdb调试程序,纯粹是为了好玩。这个程序有堆栈保护功能,会把canary写入fs:28h指向的堆栈地址中。出于好奇,我试图找出fs:28h指向的内存地址。
我遇到了两个问题。首先,由于gdb不能在ring zero中运行,所以无法显示gdtr/ldtr中的值。其次,在使用gdb读取fs时,它显示为0,这怎么解释呢?我知道gdt/ldt在第一个索引处包含0,用于返回无效地址,并且RPL已关闭,那么我错过了什么吗?如果有人知道如何找到段寄存器fs指向的地址,我想了解一下。
我遇到了两个问题。首先,由于gdb不能在ring zero中运行,所以无法显示gdtr/ldtr中的值。其次,在使用gdb读取fs时,它显示为0,这怎么解释呢?我知道gdt/ldt在第一个索引处包含0,用于返回无效地址,并且RPL已关闭,那么我错过了什么吗?如果有人知道如何找到段寄存器fs指向的地址,我想了解一下。
file: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked
wrfsbase
单独设置。相关链接:读取包含指向列表的段寄存器(%gs)。 - Peter Cordes