没有合适的资源?快使用搜索试试~ 我知道了~
堆栈溢出技术从入门到高深.doc
需积分: 9 14 下载量 97 浏览量
2009-05-14
15:32:09
上传
评论
收藏 64KB DOC 举报
温馨提示
试读
14页
本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。你必须有堆栈和存储分配方面的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原理,着重在应用。其次,你应该了解linux,本讲中我们的例子将在linux上开发。
资源推荐
资源详情
资源评论
本讲的预备知识:
首先你应该了解 汇编语言,熟悉寄存器的组成和功能。你必须有堆栈和存
储分配方面的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原
理,着重在应用。其次,你应该了解 ,本讲中我们的例子将在 上开
发。
:首先复习一下基础知识。
从物理上讲,堆栈是就是一段连续分配的内存空间。在一个程序中,会声明各
种变量。静态全局变量是位于数据段并且在程序开始运行的时候被加载。而程
序的动态的局部变量则分配在堆栈里面。
从操作上来讲,堆栈是一个先入后出的队列。他的生长方向与内存的生长方向
正好相反。我们规定内存的生长方向为向上,则栈的生长方向为向下。压栈的
操作 =-,出栈的操作是 换句话说,堆栈中老的值,
其内存地址,反而比新的值要大。请牢牢记住这一点,因为这是堆栈溢出的基
本理论依据。
在一次函数调用中,堆栈中将被依次压入:参数,返回地址,。如果函数
有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,
这些局部变量的内容将被丢失。但是不被清除。在函数返回的时候,弹出
,恢复堆栈到函数调用的地址弹出返回地址到 以继续执行程序。
在 语言程序中,参数的压栈顺序是反向的。比如 (。在参数入栈
的时候,是:先压 ,再压 最后 在取参数的时候,由于栈的先入后出,先
取栈顶的 ,再取 最后取 。
(如果你看不懂上面这段概述,请你去看以看关于堆栈的书籍,一般的汇编
语言书籍都会详细的讨论堆栈,必须弄懂它,你才能进行下面的学习)
好了,继续让我们来看一看什么是堆栈溢出。
:运行时的堆栈分配
堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数
据,导致数据越界。结果覆盖了老的堆栈数据。
比如有下面一段程序:
程序一:
!" #$
!%!&!$
'$
(!%)*+,$
(&-!.!.(!%!-,$
/&%,$
(&-0!12-!%,$
((!3,$
4$
编译并且执行,我们输入 就会输出 0 2。程序运行中,堆栈
是怎么操作的呢?
在 % 函数开始运行的时候,堆栈里面将被依次放入返回地址,。
我们用 /!5!来获得汇编语言输出,可以看到 % 函数的开头部分对应如下
语句:
!1$
%6!11$
!7*1$
首先他把 保存下来,,然后 等于现在的 ,这样 就可以用来
访问本函数的局部变量。之后 减 *,就是堆栈向上增长 * 个字节,用来存
放 %)+数组。现在堆栈的布局如下:
内存底部内存顶部
%!!($
"555555!)!+)!+)!+$
89%$
栈顶部堆栈底部
执行完 /&%之后,堆栈如下:
内存底部内存顶部
%!!($
"555555!) :3!+)!+)!+$
89%$
栈顶部堆栈底部
最后,% 返回,弹出 ( 里的地址,赋值给 ,; 继续执行 所指向
的指令。
:堆栈溢出
好,看起来一切顺利。我们再执行一次,输入 <<<<<<<<<<<<<<<
执行完
/(%)之后,堆栈如下:
内存底部内存顶部
%!!($
"555555!) <<+)<<<<+)<<<<+$
89%$
栈顶部堆栈底部
由于我们输入的 % 字符串太长,% 数组容纳不下,只好向内存顶部继
续写
=<>。由于堆栈的生长方向与内存的生长方向相反,这些‘<>覆盖了堆栈的
老的元素。如图
我们可以发现,,( 都已经被‘<>覆盖了。在 % 返回的时候,就会把
=<<<<>的 < 码:3 作为返回地址,; 会试图执行
3 处
的指令,结果出现错误。这就是一次堆栈溢出。
?:如何利用堆栈溢出
我们已经制造了一次堆栈溢出。其原理可以概括为:由于字符串处理函数
(/,(. 等等)没有对数组越界加以监视和限制,我们利用字符数组写
越界,覆盖堆栈中的老元素的值,就可以修改返回地址。
在上面的例子中,这导致 ; 去访问一个不存在的指令,结果出错。
事实上,当堆栈溢出的时候,我们已经完全的控制了这个程序下一步的动作。
如果我们用一个实际存在指令地址来覆盖这个返回地址,; 就会转而执行我
们的指令。
在 ;@A 系统中,我们的指令可以执行一个 ,这个 将获得和被我们
堆
栈溢出的程序相同的权限。如果这个程序是 的,那么我们就可以获得
(!。
下一讲将叙述如何书写一个 ! 。
555555555555555555555555555555555555555555555555555555555555
如何书写一个 ! $
一: 基本算法分析
在程序中,执行一个 的程序是这样写的:
$
555555555555555555555555555555555555555555555555555555555555555555555555$
剩余13页未读,继续阅读
资源评论
wswss11986
- 粉丝: 2
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功