考虑以下易受攻击的代码/程序:
#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覆盖技术来利用它,它基本上包括以下步骤:
strcpy@plt
.text
中的干净小工具,例如pop edi ; pop ebp ; ret
,作为strcpy
strcpy
撰写论据:&bss
- 使用/bin/sh
作为目的地的地址和.text
的一个字节/bin/sh
完全写入&bss
strcpy
覆盖system
的GOT条目(使用偏移量,需要了解Libc的使用版本 - 让我们忽略这一点)strcpy@plt
,然后是一些4字节的块,最后是&bss
的地址,指向/bin/sh
我希望在x86-64上利用此功能,同时启用相同的缓解措施。但这更像想象的那样困难。基本上由于以下原因:
64位返回地址:x86-64中的RIP指向.text
,它甚至不是32位长。因此,必须在堆栈上写入NULL字节以进行链函数调用。基本上,可以使用对strcpy
的链式调用来编写尽可能多的NULL字节,并利用NULL终止字符strcpy
始终写入。但是,只能通过覆盖RIP的最低有效字节来调用strcpy
一次。
|0x00000000| (most significant bytes)
|0x00deadbe| <- RIP (least significant bytes)
|0x41414141|
|0x41414141| <- SFP
| ... |
这些是我在启用NX和ASLR的x86-64上利用该程序时遇到的主要问题。有没有解决这些问题的技术?或者x86-64真的阻止了一个可行的,开壳的漏洞吗?