溢出保存RIP寄存器值和短地址

时间:2016-11-20 02:09:24

标签: null gdb buffer-overflow strcpy eip

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

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

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

这似乎是一个常见的问题,但我想我不是在正确搜索。

1 个答案:

答案 0 :(得分:1)

  

RIP寄存器为16字节,

目前没有128位地址的处理器;上述陈述是错误的。

  

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

使用strcpy以外的其他内容来执行溢出。

  

我不允许更改代码

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

然而,您可能仍然可以通过首先使用指向例如蹦床的蹦床溢出返回地址来达到最终结果。 memcpy(你没有说你正在使用什么操作系统,但是例如Linux memcpy通常会有一个“长”地址),然后让memcpy溢出返回地址一秒钟时间(memcpy不会停留在NUL字符上。

此技术称为return to libc attack