考虑以下易受攻击的代码/程序:
#include <string.h>
int main(int argc, char *argv[]) {
char buf[16];
strcpy(buf, argv[1]);
return 0;
}
在启用了 NX 和 ASLR 的运行 Linux 的 IA-32(x86、32 位)上,我将使用 GOT 覆盖技术来利用这一点,该技术主要包括以下步骤:
- 缓冲区溢出直至 RIP
- 用以下地址覆盖 RIP
strcpy@plt
- 使用干净的小工具
.text
, e.g. pop edi ; pop ebp ; ret
,作为返回地址strcpy
- 写下论据
strcpy
: &bss
-地址作为目的地和一个字节/bin/sh
using .text
- 重复步骤2-4,直到
/bin/sh
已完全写入&bss
- 覆盖 GOT 条目
strcpy
with system
(使用偏移量,需要了解所使用的 Libc 版本 - 让我们在这里忽略这一点)
- Write
strcpy@plt
在堆栈上,后面是一些 4 字节块,最后是地址&bss
这指向/bin/sh
- Profit
我想在 x86-64 上利用此漏洞,并启用相同的缓解措施。但这比想象的要困难。基本上有以下几个原因:
-
x86-64 基于寄存器的调用约定:函数参数使用寄存器传递,而不是堆栈。因此,需要一些额外的 ROP-gadget 将参数从堆栈传输到适当的寄存器中。这是一个小问题,但也受到以下问题的影响:
-
64位返回地址:x86-64 中的 RIP 指向.text
它甚至不是 32 位长。因此,必须在堆栈上写入 NULL 字节以链接函数调用。基本上,可以使用链式调用根据需要写入尽可能多的 NULL 字节strcpy
并利用 NULL 终止字符strcpy
总是写。但一个人只能打电话strcpy
仅覆盖 RIP 的最低有效字节一次。
|0x00000000| (most significant bytes)
|0x00deadbe| <- RIP (least significant bytes)
|0x41414141|
|0x41414141| <- SFP
| ... |
这些是我在启用 NX 和 ASLR 的 x86-64 上利用该程序时遇到的主要问题。有什么技术可以解决这些问题吗?或者 x86-64 真的可以阻止有效的 shell 打开漏洞吗?
x86-64 无法阻止此类攻击。看到这个tutorial https://blog.techorganic.com/2015/10/09/a-rop-primer-solution-64-bit-style/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)