0

我正在尝试进行缓冲区溢出,我需要用地址重写保存的 RIP 寄存器值。

地址较短(8 个字节),例如 0x0000000012345678。RIP 寄存器是 16 字节,但如果我输入 0,它会终止字符串(因为缓冲区溢出strcpy)。如何在不终止字符串的情况下使用短地址重写?

我通过在 gdb 中的 main 处设置断点来查看该值,并逐步执行直到它复制字符串,然后使用info frame命令查看保存的 RIP 值。

这似乎是一个常见问题,但我想我没有正确搜索。

4

1 回答 1

2

RIP寄存器为16字节,

当前没有 128 位地址的处理器;上述说法是错误的。

如何在不终止字符串的情况下使用短地址重写?

使用其他东西strcpy来执行溢出。

我不允许更改代码

在这种情况下,您的“通过短地址溢出”的任务strcpy变得不可能。

但是,您仍然可以通过首先用指向 eg 的蹦床溢出返回地址来实现最终结果memcpy(您没有说您使用的是什么操作系统,但在例如 Linuxmemcpy上通常会有一个“长”地址),然后第二次memcpy溢出返回地址(memcpy不会在NUL字符上停止)。

这种技术称为返回 libc 攻击

于 2016-11-20T16:45:44.270 回答