Windows缓冲区溢出从零开始[0]
来源:互联网 发布:淘宝刻假公章价格 编辑:程序博客网 时间:2024/06/05 19:38
Windows缓冲区溢出从零开始[0]
作者:coolend
目的:了解缓冲区溢出的原理并简单实现
工具:vc++
1、c语言基础
1.1 c中数据的几个存储区。
1.栈: 有编译器自动分配释放
2.堆: 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块
区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
一般而言:
1. 函数内部的局部自动变量,使用进程或线程的栈空间。
2. 动态内存分配使用堆空间。不同的操作系统对堆有不同的管理方式。
3. 初始化的全局变量,放在数据段,DATA段。未初始化的全局变量,放在未初始化数据段,一般为BSS段。 vc++6.0中建一个Win32 console Application,输入如下内容。
1、c语言基础
1.1 c中数据的几个存储区。
1.栈: 有编译器自动分配释放
2.堆: 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块
区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
一般而言:
1. 函数内部的局部自动变量,使用进程或线程的栈空间。
2. 动态内存分配使用堆空间。不同的操作系统对堆有不同的管理方式。
3. 初始化的全局变量,放在数据段,DATA段。未初始化的全局变量,放在未初始化数据段,一般为BSS段。 vc++6.0中建一个Win32 console Application,输入如下内容。
#include <stdio.h> #defined BUFFERLEN 100 int gGlobal = 0; int *gpPoint; main() { int mVar1; char mVar2[] = "qazqazqaz"; char *pPoint1; char *pPoint2 = "qazqazqaz"; static int mConst = 0; pPoint1 = (char *)malloc(BUFFERLEN*sizeof(char)); pPoint2 = (char *)malloc(BUFFERLEN*sizeof(char)); printf("0x%08x/n",&gGlobal); printf("0x%08x/n",&gpPoint); printf("0x%08x/n",&mVar1); printf("0x%08x/n",&mVar2); printf("0x%08x/n",&pPoint1); printf("0x%08x/n",&pPoint2); printf("0x%08x/n",&mConst); printf("0x%08x/n",pPoint1); printf("0x%08x/n",pPoint1); } |
输出:
0x00406910 0x00406acc 0x0012ff7c 0x0012ff70 0x0012ff68 0x0012ff6c 0x00406914 0x00410510 0x00410510 |
说明:
堆: *pPoint1,*pPoint2 栈: mVar1,mVar2,pPoint1,pPoint2 DATA段: gGlobal,mConst BSS段: gpPoint |
1.2c语言中函数调用机制
vc++6.0中建一个Win32 console Application,输入如下内容。
//example.c int add(int number1,int number2) { int result = 0; result = number1 + number2; return result; } int main(int argc, char* argv[]) { int a,b,res=0; a = 0x100; b = 0x200; res = add(a,b); return 0; } |
在res = add(a,b);处设断点,F5,再Alt+8,看到如下的汇编代码。
main函数的汇编代码:
main: 00401060 55 push ebp 00401061 8B EC mov ebp,esp 00401063 83 EC 4C sub esp,4Ch 00401066 53 push ebx 00401067 56 push esi 00401068 57 push edi 00401069 8D 7D B4 lea edi,[ebp-4Ch] 0040106C B9 13 00 00 00 mov ecx,13h 00401071 B8 CC CC CC CC mov eax,0CCCCCCCCh 00401076 F3 AB rep stos dword ptr [edi] 00401078 C7 45 F4 00 00 00 00 mov dword ptr [ebp-0Ch],0 0040107F C7 45 FC 00 01 00 00 mov dword ptr [ebp-4],100h 00401086 C7 45 F8 00 02 00 00 mov dword ptr [ebp-8],200h 0040108D 8B 45 F8 mov eax,dword ptr [ebp-8] 00401090 50 push eax 00401091 8B 4D FC mov ecx,dword ptr [ebp-4] 00401094 51 push ecx 00401095 E8 6B FF FF FF call @ILT+0(add) (00401005) 0040109A 83 C4 08 add esp,8 0040109D 89 45 F4 mov dword ptr [ebp-0Ch],eax 004010A0 33 C0 xor eax,eax 004010A2 5F pop edi 004010A3 5E pop esi 004010A4 5B pop ebx 004010A5 83 C4 4C add esp,4Ch 004010A8 3B EC cmp ebp,esp 004010AA E8 21 00 00 00 call __chkesp (004010d0) 004010AF 8B E5 mov esp,ebp 004010B1 5D pop ebp 004010B2 C3 ret |
add函数的汇编代码:
add: 00401020 55 push ebp 00401021 8B EC mov ebp,esp 00401023 83 EC 44 sub esp,44h 00401026 53 push ebx 00401027 56 push esi 00401028 57 push edi 00401029 8D 7D BC lea edi,[ebp-44h] 0040102C B9 11 00 00 00 mov ecx,11h 00401031 B8 CC CC CC CC mov eax,0CCCCCCCCh 00401036 F3 AB rep stos dword ptr [edi] 00401038 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0 0040103F 8B 45 08 mov eax,dword ptr [ebp+8] 00401042 03 45 0C add eax,dword ptr [ebp+0Ch] 00401045 89 45 FC mov dword ptr [ebp-4],eax 00401048 8B 45 FC mov eax,dword ptr [ebp-4] 0040104B 5F pop edi 0040104C 5E pop esi 0040104D 5B pop ebx 0040104E 8B E5 mov esp,ebp 00401050 5D pop ebp 00401051 C3 ret |
以及
@ILT+0(?add@@YAHHH@Z): 00401005 E9 16 00 00 00 jmp add (00401020) @ILT+5(_main): 0040100A E9 51 00 00 00 jmp main (00401060) |
刚才按F5,程序停在0040108D 8B 45 F8 mov eax,dword ptr [ebp-8],
再按F10到00401095 E8 6B FF FF FF call @ILT+0(add) (00401005),
接着按F11,看到[esp]里是不是显示9A 10 40 00 00,这说明call ******
相当于push call下面一条指令的地址,再jmp ******
- Windows缓冲区溢出从零开始[0]
- windows下缓冲区溢出
- windows下缓冲区溢出
- Windows 2000缓冲区溢出入门
- Windows 2000缓冲区溢出入门
- Windows 2000缓冲区溢出入门
- Windows 2000缓冲区溢出入门
- Windows 2000缓冲区溢出入门
- Windows 2000缓冲区溢出入门
- windows 缓冲区溢出 简单例子
- 学习windows驱动(缓冲区溢出)
- windows缓冲区溢出漏洞攻击
- 从零开始学Win32平台缓冲区溢出(Part1)
- Windows 2000缓冲区溢出技术原理
- Windows 2000缓冲区溢出入门 (zt)
- Windows 2000缓冲区溢出技术原理
- 缓冲区溢出
- 缓冲区溢出
- Oracle最新技术网站
- asp.net 2.0中TREEVIEW中动态增加结点
- 实战JBOSS――教你写第一个EJB----2
- Java语言之父James Gosling
- 实战JBOSS――教你写第一个EJB-----3
- Windows缓冲区溢出从零开始[0]
- 实例讲解:Java中的SOAP技术
- 英业达笔试总结,又一种风格的笔试。
- Java精品网站
- 2003年所发现的20本好新书 [ZT]
- 用Java的New IO开发网络协议
- JDK 1.5 新功能使用实例之Generics (转)
- Java语言中链表和双向链表的实现
- 续:利用XML实现通用WEB报表打印(实现篇)