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,输入如下内容。

#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 ******

原创粉丝点击