gdb 在 Linux 上设置 fs 寄存器

逆向工程 linux 数据库 x64
2021-06-12 01:43:50

我正在调试一个 ELF 64 位二进制文​​件gdb,我注意到%fs寄存器设置为0x63. 对于我想执行的一些测试,我想将%fs寄存器设置0x00.

我尝试做 aset $fs=0x0但值不会改变。在某些情况下,我得到了一个:

Couldn't write registers: Input/output error.

有什么办法可以设置%fs寄存器的值吗?我也愿意修改二进制文件,向源代码添加内联程序集等。

编辑:目前,我正在尝试通过附加到进程而不是从gdb.

说明问题的屏幕截图: 在此处输入图片说明

1个回答

必须设置低 2 位,否则会EIO出错。无论如何,只有低 16 位设法设置。

片段来自arch/x86_64/kernel/ptrace.c

case offsetof(struct user_regs_struct,fs):
    if (value && (value & 3) != 3)
        return -EIO;
    child->thread.fsindex = value & 0xffff; 
    return 0;

也就是说,0x00根据代码和我的测试,设置为不应该有问题。

(gdb) set $fs=3
(gdb) info register fs
fs             0x3      3
(gdb) set $fs=1
Couldn't write registers: Input/output error.
(gdb) set $fs=0
(gdb) info register fs
fs             0x0      0
(gdb) set $fs=0xffffffff
(gdb) info register fs
fs             0xffff   65535