使用短地址溢出保存的 RIP 寄存器值

Overflow saved RIP register value with short address

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

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

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

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

The RIP register is 16 bytes,

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

How do I get around rewriting with a short address without terminating the string?

使用 strcpy 以外的东西来执行溢出。

I'm not allowed to change the code

那样的话,你的"overflow with short address via strcpy"任务就不可能完成了。

但是,您仍然可以通过首先使用指向例如 trampoline 的 return 地址溢出来实现最终结果。 memcpy(你没有说你正在使用什么 OS,但是在例如 Linux memcpy 上通常会有一个 "long" 地址),然后 memcpy 第二次溢出 return 地址(memcpy 不会在 NUL 字符处停止)。

此技术称为 return to libc attack