缓冲区溢出攻防
2010-02-19 20:33:10 来源:WEB开发网核心提示:victim程序的本意是从网络上接收一个UNC(Universal Naming Convention)形式的文件名,然后从中分离出机器名并打印在屏幕上,缓冲区溢出攻防(2),由于正常情况下,机器名最多只有16个字节,下图从左至右分别是程序执行完三个标号对应的代码后堆栈的状态及esp寄存器的指向,其中每个小格代表一个字
victim程序的本意是从网络上接收一个UNC(Universal Naming Convention)形式的文件名,然后从中分离出机器名并打印在屏幕上。由于正常情况下,机器名最多只有16个字节,所以ShowComputerName函数也只给szComputer分配了16个字节长的缓冲区,并且GetComputerName也没有对缓冲区的长度做任何检查。这样,ShowComputerName中就出现了一个缓冲区溢出漏洞。
找到了漏洞,下一步要做的就是分析漏洞来找到具体的攻击方法。我们来看一下ShowComputerName的编译结果,每条c/c++语句下面注释中就是其编译后对应的汇编代码。对这些代码,我要说明两点:①这里使用的是stdcall调用约定,它是windows程序中最常用的调用约定,下文中的示例代码如果没有特别说明都将使用这种约定。有关各种调用约定的含义和区别,请参考相关资料。②因编译器、编译选项的不同,编译结果也可能不一样,后面的攻击代码是根据上面的编译结果编写的,我无法保证它在你的环境中也能正确执行。
我在程序中标注了三个标号,下图从左至右分别是程序执行完三个标号对应的代码后堆栈的状态及esp寄存器的指向,其中每个小格代表一个字,即四字节。
更多精彩
赞助商链接