缓冲区溢出笔记之---stack溢出

缓冲区溢出笔记之---stack溢出

ID:17799684

大小:73.00 KB

页数:33页

时间:2018-09-05

缓冲区溢出笔记之---stack溢出_第1页
缓冲区溢出笔记之---stack溢出_第2页
缓冲区溢出笔记之---stack溢出_第3页
缓冲区溢出笔记之---stack溢出_第4页
缓冲区溢出笔记之---stack溢出_第5页
资源描述:

《缓冲区溢出笔记之---stack溢出》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、缓冲区溢出笔记之---STACK溢出缓冲区溢出笔记之---STACK溢出i.预备知识ii.溢出原理演示iii.三种常用溢出方法演示及实例分析本来预备讲的东西很多,后来由于篇幅过长原因,所以其他一些内容就没有再讲了,比如与环境变量传递的BUF有关的溢出(通过setenv(),putenv()等函数传递环境变量到BUF),以及一些实例分析.这篇是我在学习BUFFEROVERFLOW过程中的一些心得,算是一个总结,同时也希望能帮助那些需要的朋友们.1.预备知识由于篇幅问题,在这里就省略了,具体可以参照汇编教程,或其他缓冲区溢出教程中的预备知识.这里

2、仅仅请不太清楚的朋友先弄懂STACK,ESP,EBP,EIP等基本概念.#%esp是堆栈指针寄存器,它指向当前堆栈储存区域的顶部.#%ebp是基址寄存器,它指向当前堆栈储存区域的底部.#%eip是指令指针(在缓冲区溢出中对我们最有用的寄存器)2.三种常用溢出方法.首先,我们来看一个有漏洞的程序[tt@ph4nt0mexplab]$catstack1.c#includeintmain(intargc,char**argv){charbuf[10];strcpy(buf,argv[1]);printf("buf's0x%8x

3、",&buf);return0;}[tt@ph4nt0mexplab]$这里做了什么呢?就是构造一个10BYTES的BUFFER,然后把命令行的第一个参数拷贝进缓冲区由于没有进行边界检察,所以当argv[1]超过10bytes时,就会造成缓冲区溢出.当然,在理论上是只需要超过10BYTES,但是,实际上由于GCC的版本问题,所以往往在BUFFER后面添加了很多填充物,所以实际上我们需要28BYTES才能真正覆盖BUFFER,我们还是实际来看一下[tt@ph4nt0mexplab]$./stack1`perl-e'print"A"x10'`bu

4、f's0xbfffec30[tt@ph4nt0mexplab]$./stack1`perl-e'print"A"x24'`buf's0xbffff220[tt@ph4nt0mexplab]$./stack1`perl-e'print"A"x28'`buf's0xbfffe020段错误[tt@ph4nt0mexplab]$可见当覆盖10BYTES的"A"时,程序正常退出,24BYTES也是如此,直到28BYTES时,才发生SEGMENTFAULT我们用GDB来调试一下会比较清楚[tt@ph4nt0mexplab]$gdbstack1GNUgdb

5、RedHatLinux(5.3post-0.20021129.18rh)Copyright2003FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.ThereisabsolutelynowarrantyforGDB

6、.Type"showwarranty"fordetails.ThisGDBwasconfiguredas"i386-redhat-linux-gnu"...(gdb)disassmainDumpofassemblercodeforfunctionmain:0x0804835c:push%ebp0x0804835d:mov%esp,%ebp0x0804835f:sub$0x18,%esp0x08048362:and$0xfffffff0,%esp0x08048365

7、:mov$0x0,%eax0x0804836a:sub%eax,%esp0x0804836c:sub$0x8,%esp0x0804836f:mov0xc(%ebp),%eax0x08048372:add$0x4,%eax......<以下略>......这里我们只需要注意到0x0804835f:sub$0x18,%esp0x18等于10进制的24事实上,内存中为BUFFER分配了24字节的空间,所以就不难解释上面的结论了.那么接下来的4BYTES当然就造成

8、了SEGMENTFAULT那么,我们到底覆盖了什么呢?重新运行程序,用28BYTES覆盖(gdb)r`perl-e'print"A"x28'`Startingpro

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。