缓冲区溢出(1)

来源:互联网 发布:行知职高图片 编辑:程序博客网 时间:2024/05/20 05:10


缓冲区溢出(1)


最最简单的第一次实验....


环境:VC 6.0 


程序:


#include<stdio.h>#include<stdlib.h>void jmp(){printf("success!\n");_exit(0);}int main(){int buffer[1];buffer[2] = 0x00401020;//0x401020//buffer[2] = (int)jmp; //0x401005//printf("%x\n",buffer[2]);return 0;}


运行结果:



main 函数的反汇编结果:


10:   int main()11:   {0040D730   push        ebp0040D731   mov         ebp,esp0040D733   sub         esp,44h0040D736   push        ebx0040D737   push        esi0040D738   push        edi0040D739   lea         edi,[ebp-44h]0040D73C   mov         ecx,11h0040D741   mov         eax,0CCCCCCCCh0040D746   rep stos    dword ptr [edi]12:       int buffer[1];13:       buffer[2] = 0x00401020; //0x4010200040D748   mov         dword ptr [ebp+4],offset jmp (00401020)14:       //buffer[2] = (int)jmp; //0x40100515:       //printf("%x\n",buffer[2]);16:       return 0;0040D74F   xor         eax,eax17:   }


根据11 ~ 12行之间的指令可以推断出当前的栈是这样的:





其中一条指令

rep stos dword ptr [edi] 

的意思是 : 重复执行 stos dword ptr [edi]  11h次 ,rep就是repeat

前面的 ecx 表示重复次数

0CCCCCCCCH 这个值表示未被初始化(初始化为0xcc, 使用这个值是因为0xcc对应汇编代码int 3,而且这个值很大容易引起程序员的注意,检查未初始化的问题

总的来说即 从 ebp-44H 的地方向高地址的内存赋值,每次为四个字节赋值,每个字节赋值为 CCH,重复 11h 次 ,

执行完毕后 44h 的空间都是 CCh


从栈的情况可以推断出 存放下一条指令地址的寄存器 eip 的地址和 buffer[2] 的地址是相同的


在监视窗口中查看函数 jmp 的地址:




然后将 buffer[2] 赋值为 0x00401020 即可。



-------------------------------------分割线-------------------------------------------


buffer[2] = 0x00401020;//0x401020

buffer[2] = (int)jmp; //0x401005

的效果是一样的,但是两个的地址值却不相同


在汇编代码中分别查看两个地址对应的代码:




可以看到 00401005 处的只是一条跳转语句,跳转到 真实的 地址 00401020 去







~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~








0 0