资源描述:
《缓冲区溢出笔记之---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