面向初学者的,进行详细分析的缓冲溢出入门文章还是很少(我还没有看到),所以我下决心写了这篇文章,从c的局部变量分配以及它和堆栈的关系、返回地址和堆栈的关系、局部变量和返回地址以及堆栈的关系开始写起,并在讲述完原理后进行简单的应用,使理论和应用相结合, 以给广大初学缓冲溢出的朋友一点小小的帮助,本文还是具有典型性的,通过本文的学习,可以让我们从一个普通的c程序员,了解到更加底层的技术,本文虽是面向初学者(指初学缓冲溢出,而不是初学c语言),作者假定你(读者)已经是一位熟练的c程序员,并且了解一些asm编程技术。我也是刚学缓冲区溢出不久,这是我第一次写溢出技术,所以难免有错误的地方,还请大家指正,在ipxodi和袁哥的文章中我学到了很多东西,但ipxodi和袁哥和文章比较深比较专业,初学者学习起来有些困难,特别我又是非计算机专业的(我和绿盟的小四哥一样是电脑会计专业的,向小四哥学习,呵呵!).在这里把我学习时的一点理解,一点经验介绍给大家,希望对广大学习缓冲溢出的朋友有所帮助!
一、存储分配,局部内存变量,堆栈和函数调用
1、首先写一个简单的c字符串拷贝程序
| //test.c #include <stdio.h> #include <stdlib.h> #include <string.h> void overflow(void) { char buf[10]; strcpy(buf,"aaaaaaaaaa"); }//end overflow int main(void) { overflow(); return 0; }//end main |
| 1: #include <stdio.h> 2: #include <stdlib.h> 3: #include <string.h> 4: 5: void overflow(void) 6: { 00401020 55 push ebp 00401021 8b ec mov ebp,esp 00401023 83 ec 4c sub esp,4ch 00401026 53 push ebx 00401027 56 push esi 00401028 57 push edi 00401029 8d 7d b4 lea edi,[ebp-4ch] 0040102c b9 13 00 00 00 mov ecx,13h 00401031 b8 cc cc cc cc mov eax,0cccccccch 00401036 f3 ab rep stos dword ptr [edi] 7: char buf[10]; 8: strcpy(buf,"aaaaaaaaaa"); 00401038 68 1c f0 41 00 push offset string "aaaaaaaaaa" (0041f01c) 0040103d 8d 45 f4 lea eax,[ebp-0ch] 00401040 50 push eax 00401041 e8 6a 00 00 00 call strcpy (004010b0) 00401046 83 c4 08 add esp,8 9: 10: }//end overflow 00401049 5f pop edi 0040104a 5e pop esi 0040104b 5b pop ebx 0040104c 83 c4 4c add esp,4ch 0040104f 3b ec cmp ebp,esp 00401051 e8 4a 01 00 00 call __chkesp (004011a0) 00401056 8b e5 mov esp,ebp 00401058 5d pop ebp 00401059 c3 ret 11: 12: int main(void) 13: { 00401070 55 push ebp 00401071 8b ec mov ebp,esp 00401073 83 ec 40 sub esp,40h 00401076 53 push ebx 00401077 56 push esi 00401078 57 push edi 00401079 8d 7d c0 lea edi,[ebp-40h] 0040107c b9 10 00 00 00 mov ecx,10h 00401081 b8 cc cc cc cc mov eax,0cccccccch 00401086 f3 ab rep stos dword ptr [edi] 14: overflow(); 00401088 e8 7d ff ff ff call @ilt+5(overflow) (0040100a) 15: return 0; 0040108d 33 c0 xor eax,eax 16: }//end main 0040108f 5f pop edi 00401090 5e pop esi 00401091 5b pop ebx 00401092 83 c4 40 add esp,40h 00401095 3b ec cmp ebp,esp 00401097 e8 04 01 00 00 call __chkesp (004011a0) 0040109c 8b e5 mov esp,ebp 0040109e 5d pop ebp 0040109f c3 ret |
| esp 0x0012ff34(注意:这些值在不同的机器上运行时可能会不一样) ebp 0x0012ff80 buf 变量尚未分配 overflow 0x00401020 main 0x00401070 |
| 00401026 53 push ebx 00401027 56 push esi 00401028 57 push edi 00401029 8d 7d b4 lea edi,[ebp-4ch] 0040102c b9 13 00 00 00 mov ecx,13h 00401031 b8 cc cc cc cc mov eax,0cccccccch 00401036 f3 ab rep stos dword ptr [edi] |
| ---------------------------------- //程序入口点(program entry point) . . . call _main push eax call _exitprocess . ---------------------------------- //void overflow(void) push ebp . . . call _strcpy . . . ret ---------------------------------- //int main(void) push ebp . . . call _overflow . . . ret ---------------------------------- |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器