王朝网络
分享
 
 
 

Windows缓冲区溢出从零开始[0]

王朝system·作者佚名  2006-01-09
宽屏版  字体: |||超大  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<!-- saved from url=(0045)http://www.yourblog.org/Data/20044/35012.html -->

<HTML><HEAD><TITLE>Windows缓冲区溢出从零开始</TITLE>

<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK

href="articles/01.css" type=text/css

rel=stylesheet>

<META content="MSHTML 6.00.2900.2523" name=GENERATOR>

</HEAD>

<BODY leftMargin=10 topMargin=10 marginheight="0" marginwidth="0">

<TABLE cellSpacing=0 cellPadding=0 width=580 align=center border=0>

<TBODY>

<TR>

<TD

background="./articles/01view_line.gif"

height=1></TD>

<TD width=559 bgColor=#666666></TD>

<TD width=1 bgColor=#666666 rowSpan=5></TD></TR>

<TR>

<TD width=22

background="./articles/01view_b.gif"

height=5></TD>

<TD></TD></TR>

<TR>

<TD

background="./articles/01view_bg.gif"></TD>

<TD vAlign=top>

<TABLE cellSpacing=0 cellPadding=0 width=550 align=center

border=0>

<TBODY>

<TR>

<TD id=zoom>

<DIV align=left><STRONG><FONT

size=2>Windows缓冲区溢出从零开始[0]</FONT></STRONG> </DIV>

<DIV align=left>作者:coolend

<HR align=center width="98%" color=#666666 SIZE=1>

<DIV align=left>目的:了解缓冲区溢出的原理并简单实现

<DIV align=left>工具:nasm,ollydbg,vc++

<br>

<strong>1、</strong>c语言基础<br>

<strong>1.1</strong> c中数据的几个存储区。<br>

1.栈: 有编译器自动分配释放 <br>

2.堆: 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 <br>

3.全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块 <br>

区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 <br>

一般而言: <br>

1. 函数内部的局部自动变量,使用进程或线程的栈空间。 <br>

2. 动态内存分配使用堆空间。不同的操作系统对堆有不同的管理方式。<br>

3. 初始化的全局变量,放在数据段,DATA段。未初始化的全局变量,放在未初始化数据段,一般为BSS段。</p>

&nbsp;vc++6.0中建一个Win32 console Application,输入如下内容。<br>

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee><BR>

#include &lt;stdio.h&gt;<br>

#defined BUFFERLEN 100<br>

int gGlobal = 0; <br>

int *gpPoint; <br>

main() <br>

{ <br>

int mVar1; <br>

char mVar2[] = &quot;qazqazqaz&quot;; <br>

char *pPoint1; <br>

char *pPoint2 = &quot;qazqazqaz&quot;; <br>

static int mConst = 0; <br>

pPoint1 = (char *)malloc(BUFFERLEN*sizeof(char)); <br>

pPoint2 = (char *)malloc(BUFFERLEN*sizeof(char)); <br>

printf(&quot;0x%08x\n&quot;,&amp;gGlobal);<br>

printf(&quot;0x%08x\n&quot;,&amp;gpPoint);<br>

printf(&quot;0x%08x\n&quot;,&amp;mVar1);<br>

printf(&quot;0x%08x\n&quot;,&amp;mVar2);<br>

printf(&quot;0x%08x\n&quot;,&amp;pPoint1);<br>

printf(&quot;0x%08x\n&quot;,&amp;pPoint2);<br>

printf(&quot;0x%08x\n&quot;,&amp;mConst);<br>

printf(&quot;0x%08x\n&quot;,pPoint1);<br>

printf(&quot;0x%08x\n&quot;,pPoint1);<br>

} </TD>

</TR>

</TBODY>

</TABLE> <br>

&nbsp;输出: <TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>0x00406910<br>

0x00406acc<br>

0x0012ff7c<br>

0x0012ff70<br>

0x0012ff68<br>

0x0012ff6c<br>

0x00406914<br>

0x00410510<br>

0x00410510</TD>

</TR>

</TBODY>

</TABLE>

<br>

&nbsp;说明: <TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>堆: *pPoint1,*pPoint2<br>

栈: mVar1,mVar2,pPoint1,pPoint2<br>

DATA段: gGlobal,mConst <br>

BSS段: gpPoint</TD>

</TR>

</TBODY>

</TABLE> <br><strong>&nbsp;1.2</strong>c语言中函数调用机制<br>

&nbsp;vc++6.0中建一个Win32 console Application,输入如下内容。<br>

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>//example.c<br>

int add(int number1,int number2)<br>

{<br>

int result = 0;<br>

result = number1 + number2;<br>

return result;<br>

}<br>

int main(int argc, char* argv[])<br>

{<br>

int a,b,res=0;<br>

a = 0x100;<br>

b = 0x200;<br>

res = add(a,b);<br>

return 0;<br>

}</TD>

</TR>

</TBODY>

</TABLE> <p>&nbsp;在res = add(a,b);处设断点,F5,再Alt+8,看到如下的汇编代码。<br>

&nbsp;main函数的汇编代码:<br>

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>main:<br>

00401060 55 push ebp<br>

00401061 8B EC mov ebp,esp<br>

00401063 83 EC 4C sub esp,4Ch<br>

00401066 53 push ebx<br>

00401067 56 push esi<br>

00401068 57 push edi<br>

00401069 8D 7D B4 lea edi,[ebp-4Ch]<br>

0040106C B9 13 00 00 00 mov ecx,13h<br>

00401071 B8 CC CC CC CC mov eax,0CCCCCCCCh<br>

00401076 F3 AB rep stos dword ptr [edi]<br>

00401078 C7 45 F4 00 00 00 00 mov dword ptr [ebp-0Ch],0<br>

0040107F C7 45 FC 00 01 00 00 mov dword ptr [ebp-4],100h<br>

00401086 C7 45 F8 00 02 00 00 mov dword ptr [ebp-8],200h<br>

0040108D 8B 45 F8 mov eax,dword ptr [ebp-8]<br>

00401090 50 push eax<br>

00401091 8B 4D FC mov ecx,dword ptr [ebp-4]<br>

00401094 51 push ecx<br>

00401095 E8 6B FF FF FF call @ILT+0(add) (00401005)<br>

0040109A 83 C4 08 add esp,8<br>

0040109D 89 45 F4 mov dword ptr [ebp-0Ch],eax<br>

004010A0 33 C0 xor eax,eax<br>

004010A2 5F pop edi<br>

004010A3 5E pop esi<br>

004010A4 5B pop ebx<br>

004010A5 83 C4 4C add esp,4Ch<br>

004010A8 3B EC cmp ebp,esp<br>

004010AA E8 21 00 00 00 call __chkesp (004010d0)<br>

004010AF 8B E5 mov esp,ebp<br>

004010B1 5D pop ebp<br>

004010B2 C3 ret</TD>

</TR>

</TBODY>

</TABLE>

<p>&nbsp;add函数的汇编代码:<br>

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>add:<br>

00401020 55 push ebp<br>

00401021 8B EC mov ebp,esp<br>

00401023 83 EC 44 sub esp,44h<br>

00401026 53 push ebx<br>

00401027 56 push esi<br>

00401028 57 push edi<br>

00401029 8D 7D BC lea edi,[ebp-44h]<br>

0040102C B9 11 00 00 00 mov ecx,11h<br>

00401031 B8 CC CC CC CC mov eax,0CCCCCCCCh<br>

00401036 F3 AB rep stos dword ptr [edi]<br>

00401038 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0<br>

0040103F 8B 45 08 mov eax,dword ptr [ebp+8]<br>

00401042 03 45 0C add eax,dword ptr [ebp+0Ch]<br>

00401045 89 45 FC mov dword ptr [ebp-4],eax<br>

00401048 8B 45 FC mov eax,dword ptr [ebp-4]<br>

0040104B 5F pop edi<br>

0040104C 5E pop esi<br>

0040104D 5B pop ebx<br>

0040104E 8B E5 mov esp,ebp<br>

00401050 5D pop ebp<br>

00401051 C3 ret</TD>

</TR>

</TBODY>

</TABLE>

<p>&nbsp;以及<br>

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>@ILT+0(?add@@YAHHH@Z):<br>

00401005 E9 16 00 00 00 jmp add (00401020)<br>

@ILT+5(_main):<br>

0040100A E9 51 00 00 00 jmp main (00401060)</TD>

</TR>

</TBODY>

</TABLE>

<p>&nbsp;刚才按F5,程序停在0040108D 8B 45 F8 mov eax,dword ptr [ebp-8],

<br>&nbsp;再按F10到00401095 E8 6B FF FF FF call @ILT+0(add) (00401005),

<br>&nbsp;接着按F11,看到[esp]里是不是显示9A 10 40 00 00,这说明call ******

<br>&nbsp;相当于push call下面一条指令的地址,再jmp ******

<TABLE cellSpacing=1 cellPadding=0 width="98%" align=center

bgColor=#cccccc border=0>

<TBODY>

<TR>

<TD

style="PADDING-RIGHT: 10px; PADDING-LEFT: 15px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px"

bgColor=#eeffee>堆: *pPoint1,*pPoint2<br>

栈: mVar1,mVar2,pPoint1,pPoint2<br>

DATA段: gGlobal,mConst <br>

BSS段: gpPoint</TD>

</TR>

</TBODY>

</TABLE> <p>&nbsp;</p>

<p>&nbsp;</p> <p>&nbsp;</p>

<p>&nbsp; </p>

<p><BR>

</p> </TD></TR>

<TR>

<TD style="PADDING-TOP: 16px" align = center><FONT color=#ff6600>...待续...</FONT></TD></TR></TBODY></TABLE></TD></TR>

<TR>

<TD width=22

background="./articles/01view_b.gif"

height=5></TD>

<TD></TD></TR>

<TR>

<TD

background="./articles/01view_line.gif"

height=1></TD>

<TD bgColor=#666666 height=1></TD></TR></TBODY></TABLE>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有