我正在尝试进行缓冲区溢出,我需要用地址重写保存的 RIP 寄存器值。
地址较短(8 个字节),例如 0x0000000012345678。RIP 寄存器是 16 字节,但如果我输入 0,它会终止字符串(因为缓冲区溢出strcpy
)。如何在不终止字符串的情况下使用短地址重写?
我通过在 gdb 中的 main 处设置断点来查看该值,并逐步执行直到它复制字符串,然后使用info frame
命令查看保存的 RIP 值。
这似乎是一个常见问题,但我想我没有正确搜索。
我正在尝试进行缓冲区溢出,我需要用地址重写保存的 RIP 寄存器值。
地址较短(8 个字节),例如 0x0000000012345678。RIP 寄存器是 16 字节,但如果我输入 0,它会终止字符串(因为缓冲区溢出strcpy
)。如何在不终止字符串的情况下使用短地址重写?
我通过在 gdb 中的 main 处设置断点来查看该值,并逐步执行直到它复制字符串,然后使用info frame
命令查看保存的 RIP 值。
这似乎是一个常见问题,但我想我没有正确搜索。
RIP寄存器为16字节,
当前没有 128 位地址的处理器;上述说法是错误的。
如何在不终止字符串的情况下使用短地址重写?
使用其他东西strcpy
来执行溢出。
我不允许更改代码
在这种情况下,您的“通过短地址溢出”的任务strcpy
变得不可能。
但是,您仍然可以通过首先用指向 eg 的蹦床溢出返回地址来实现最终结果memcpy
(您没有说您使用的是什么操作系统,但在例如 Linuxmemcpy
上通常会有一个“长”地址),然后第二次memcpy
溢出返回地址(memcpy
不会在NUL
字符上停止)。
这种技术称为返回 libc 攻击。