使用短地址溢出保存的 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。
我正在尝试进行缓冲区溢出,我需要用地址重写保存的 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。