我是靠谱客的博主 乐观曲奇,最近开发中收集的这篇文章主要介绍缓冲区溢出(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


缓冲区溢出(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("%xn",buffer[2]);
return 0;
}


运行结果:



main 函数的反汇编结果:


10:
int main()
11:
{
0040D730
push
ebp
0040D731
mov
ebp,esp
0040D733
sub
esp,44h
0040D736
push
ebx
0040D737
push
esi
0040D738
push
edi
0040D739
lea
edi,[ebp-44h]
0040D73C
mov
ecx,11h
0040D741
mov
eax,0CCCCCCCCh
0040D746
rep stos
dword ptr [edi]
12:
int buffer[1];
13:
buffer[2] = 0x00401020; //0x401020
0040D748
mov
dword ptr [ebp+4],offset jmp (00401020)
14:
//buffer[2] = (int)jmp; //0x401005
15:
//printf("%xn",buffer[2]);
16:
return 0;
0040D74F
xor
eax,eax
17:
}


根据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 去







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








最后

以上就是乐观曲奇为你收集整理的缓冲区溢出(1)的全部内容,希望文章能够帮你解决缓冲区溢出(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部