网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | 防火墙 | IDS/IPS | VPN | PKI | Honeypot | Hacker/Intruder | 黑客技术 | 破解技术 | 加密技术 | 病毒防护 | 木马 | 反垃圾邮件 | 反流氓软件 | 漏洞 | 无线安全 | UNIX | Windows | 安全编程 | 安全软件 | TPM/TCG | 数据恢复 | 企业信息安全 | 个人信息安全
 当前位置: Home > 黑客技术 > 文章  
黑客经典教程之缓冲区溢出解密(一)
文章来源: 赛迪网 文章作者: 丁丁 发布时间: 2006-09-12   字体: [ ]
 

  EIP寄存器,CALL和RET指令

  在每一个机器周期中,CPU查询指令指针寄存器存储中存储的内容(在ix86 32位保护模式中是EIP-扩展指令指针)来知道下一步要执行什么。下一个将要执行的指令地址存储在EIP寄存器中。通常,地址是连续的,意味着下个将要执行的下个指令在内存中比当前指令靠前几个字节。CPU根据当前指令是几个字节长度计算出”靠前的几个字节”,然后把这几个字节值加到当前地址。举个例子,假设当前指令地址是0x8048438。这是写在EIP中的值。因此,CPU执行在内存地址:0x8048438中找到的指令。比方说,是一个 PUSH指令:

push   %ebp 

CPU知道一个PUSH指令是1字节长,因此下一个指令将在0x8048439,可能是

mov    %esp,%ebp

  在执行PUSH时,CPU将把MOV地址放到EIP中。

  好了,我们说将被放到EIP中的值是CPU自身计算出来的。如果我们JMP到一个函数又是什么样子的呢?函数中指令的地址将在内存中的其它地方。它们执行后,CPU是如何知道到哪里继续调用程序执行呢?为了这个目的,在我们JMP到函数前,我们在一个临时寄存器中保存下一个指令地址,比如说在EDX中;并且在从函数返回之前,我们又把EDX中的地址写回EIP。如果我们使用JMP来跳转到函数地址,那将可能实际上是一个非常烦人的工作。

  然而,ix86处理器家族给我们提供了两个指令:CALL和RET,使我们的生活简单!CALL指令把”函数返回后下个要被执行的指令”写入堆栈。它PUSH地址到堆栈,并且把函数地址写入EIP。因而,一个函数调用就产生了。另一方面,RET指令从堆栈中POP出”返回地址”,并且把地址写入EIP。因而,我们将从函数安全地返回,而且继续了程序的下一步执行。

  让我们看看下面的代码片段:

x = 0;
        function(1, 2, 3);
        x = 1;

  在几个汇编指令运行(x=0)之后,我们需要到function()所在的内存位置。就如我前面所说的,为了实现这一目标,首先我们拷贝返回地址的地址(在这个例子里是x=1的指令地址。)到一些临时空间(可能是一个寄存器)用JMP 跳转到函数的地址空间,而且,在函数结束时我们恢复我们将要拷贝到EIP的返回地址。

  感谢上帝,所有这些麻烦的操作都由CPU自身通过CALL和RET为我们做了,而你能从上面的篇章中得到相关细节。

  一般地,程序堆栈区域能够象这样表示:

|_parameter_I____| ESP+8
|_parameter II___| ESP+4
|_return address_| ESP

Figure X : Stack

  ESP,EBP

  如我们已经说过的,堆栈同样被用来存储动态变量。动态地,程序请求新的空间时, CPU PUSH一些数据而我们的程序释放一些数据时它就POP一些数据。为了给内存编址,我们使用”相对寻址”。也就是说,我们在我们的堆栈中给数据编址,与一些标准相关。而这个标准就是ESP,它是Extended Stack Pointer首字母缩写。这个寄存器指向堆栈的顶端。考虑这个:

void f()
{
	int a;
}

  可以看出,在f()函数中,我们为一个名为a的整型变量分配空间。整型变量a的空间将在堆栈中分配。而计算机将引用它的地址作为ESP- 的一些字节。因此堆栈指针对程序执行是非常重要的。若我们调用一个函数呢?这个调用的函数有一个堆栈,它有一些局部变量,意味着它将要利用堆栈指针寄存器。同样地,内部被调用的函数将有局部变量而且它也将需要堆栈指针。

  为了克服这个,我们保存老的堆栈指针。就象我们对返回地址所做的那样,我们PUSH老的ESP到堆栈,并且利用另外一个名为EBP的寄存器来引用被调用函数的局部变量。

  黑客经典教程之缓冲区溢出解密(二)

--
原文作者: Murat
原文链接: http://www.enderunix.org/documents/eng/bof-eng.txt
引用链接: http://industry.ccidnet.com/art/1101/20060911/897045_1.html

 
推荐文章
·骇客学堂:灰鸽子VIP2006终极免
·黑客攻破SQL服务器系统的十种方
·黑客的攻击:WEB入侵的过程
·Web环境下SQL注入攻击的检测与防
·黑客经典教程之理解地址解析协议
·黑客经典教程之缓冲区溢出解密(
·黑客基础内容:21种RING的提权方
·网络孙子兵法!黑客攻防也有三十
·黑客攻击常见方法及安全策略制订
·黑客技巧 使用Google黑掉Windows
 
 
共3页: 上一页 [1] [2] 3 下一页
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
热点文章
·黑客基础内容 DOS常见命
·攻防秘技:彻底防范网络
·黑客教程:黑客入侵个人
·很多人的Hack经历第一次
·黑客基础内容 IPC$空连
·黑客经典教程之理解地址
·黑客技巧 使用Google黑
·黑客攻击常见方法及安全
相关分类
相关文章
·黑客经典教程之缓冲区溢
·黑客经典教程之理解地址
·菜鸟都学会 十三步简单
·骇客学堂:跨站攻击偷取
·黑客的攻击:WEB入侵的
·黑客攻破SQL服务器系统
·黑客新人必学的网站入侵
·攻防秘技:彻底防范网络
更多...
 
 

Copyright(c) 2001-2008 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统
$Id: article_article.html,v 1.3 2007/02/10 12:00:37 yjs Exp $