缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范

ID:37888536

大小:345.53 KB

页数:11页

时间:2019-06-02

缓冲区溢出攻击原理与防范_第1页
缓冲区溢出攻击原理与防范_第2页
缓冲区溢出攻击原理与防范_第3页
缓冲区溢出攻击原理与防范_第4页
缓冲区溢出攻击原理与防范_第5页
资源描述:

《缓冲区溢出攻击原理与防范》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、缓冲区溢出攻击的原理与防范陈硕2004-7-12读者基础:熟悉C语言及其内存模型,了解x86汇编语言。缓冲区溢出(bufferoverflow)是安全的头号公敌,据报道,有50%以上的安全漏洞和缓冲区溢出有关。C/C++语言对数组下标访问越界不做检查,是引起缓冲区溢出问题的根本原因。本文以LinuxonIA32(32-bitIntelArchitecture,即常说的x86)为平台,介绍缓冲区溢出的原理与防范措施。按照被攻击的缓冲区所处的位置,缓冲区溢出(bufferoverflow)大致可分为两类:堆溢出1(heapov

2、erflow)和栈溢出2(stackoverflow)。栈溢出较为简单,我先以一些实例介绍栈溢出,然后谈一谈堆溢出的一般原理。栈溢出原理我们知道,栈(stack)是一种基本的数据结构,具有后入先出(LIFO,Last-In-First-Out)的性质。在x86平台上,调用函数时实际参数(arguments)、返回地址(returnaddress)、局部变量(localvariables)都位于栈上,栈是自高向低增长(先入栈的地址较高),栈指针(stackpointer)寄存器ESP始终指向栈顶元素。以图表1中的简单程序为例

3、,我们先将它编译为可执行文件,然后在gdb中反汇编并跟踪其运行:$gccstack.c–ostack-ggdb-mperferred-stack-boundary=2在IA32上,gcc默认按8个字节对齐,为了突出主题,我们令它按4字节对齐,最末一个参数的用处在此。图表1在每条语句之后列出对应的汇编指令,注意这是AT&T格式汇编,mov%esp,%ebp是将寄存器ESP的值赋给寄存器EBP(这与常用的Intel汇编格式正好相反)。//stack.c#01intadd(inta,intb)#02{//push%ebp//mo

4、v%esp,%ebp#03intsum;//sub$0x4,%esp#04sum=a+b;//mov0xc(%ebp),%eax//add0x8(%ebp),%eax//mov%eax,0xfffffffc(%ebp)#05returnsum;//mov0xfffffffc(%ebp),%eax1本文把静态存储区溢出也算作一种堆溢出。2Stack通常翻译为“堆栈”,为避免与文中出现的“堆/heap”混淆,这里简称为“栈”。//leave//ret#06}#07#08intmain()#09{//push%ebp//mov%

5、esp,%ebp#10intret=0xDEEDBEEF;//sub$0x4,%esp//movl$0xdeedbeef,0xfffffffc(%ebp)#11ret=add(0x19,0x82);//push$0x82//push$0x19//call80482f4//add$0x8,%esp//mov%eax,0xfffffffc(%ebp)#12returnret;//mov0xfffffffc(%ebp),%eax//leave//ret#13}图表1典型的函数调用当程序执行完第10行时,堆栈如图表2所示

6、。图中每格表示一个doubleword(4字节)。图表2堆栈状况1EBP是栈帧指针(framepointer),在整个函数的运行过程中,它始终指向间于返回地址和局部变量之间的一个doubleword,此处保存着调用端函数(caller)的EBP值(第9行对应的两条指令正是起这个作用)。EBP所指的位置之下是局部变量,例如EBP-4是变量ret的地址,-4的补码表示正好是0xFFFFFFFC,第11行上方的movl指令将0xDEEDBEEF存入变量ret。当函数返回时,须将EBP恢复原值。leave指令相当于:mov%ebp

7、,%esp//先令esp指向savedebppop%ebp//弹出栈顶内容至ebp,此时esp正好指向返回地址,ebp也恢复原值ret指令的作用是将栈顶元素(ESP所指之处)弹出至指令指针EIP,完成函数返回动作。执行第11条语句时,先将add()的两个参数按从右到左的顺序压入堆栈,call指令会先把返回地址(也就是call指令的下一条指令的地址,此处为一条add指令3)压入堆栈,3C语言为了实现变长参数调用(就像printf()),通常规定由调用端负责清理堆栈,这条add指令正是起平衡堆栈的作用。然后修改指令指针EIP,

8、使程序流程(flow)到达被调用函数处(第2行)。当程序运行到第4行时,堆栈的情况如图表3所示。图表3堆栈情况2图中灰色部分是main()的栈帧(stackframe,又称活动记录:activationrecord),其下是add()的栈帧,从中可以看出,保存函数返回地址(returnaddr)的位置比

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

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

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