缓冲区溢出

                                                                   缓冲区溢出
    缓冲区溢出,大家都比较熟悉吧!有时候电脑突然条出来一个框框!什么读XXXXXXXX地址出错,或者写XXXXXXXX地址出错,这就是数据溢出了!但这些只是一些应用程序导致的出错!这是WINDOWS异常的处理结果!
    缓冲区溢出已经成为了现在攻击的主要流行方法!所以也成为高手的必要技术!缓冲区溢出是一门很深奥的技术!不过一些基本的原理,我相信大家还是懂的!就比如说,用一个小的杯子装比这个杯子的容积大的水,肯定后来装进的水会溢出的!计算机里面的溢出和这个是差不多的意思!但我们为数据分配了一定的空间,在装入数据的时候,有的函数不检测溢出,不管能不能容纳,都往分配的内存空间里面装!导致了容不下了数据装入外部内存空间,覆盖了原来空间的数据,导致发生了溢出!(简单吧)。
   但是怎么让缓冲区溢出,成为我们攻击的方法了!这是我们学习的重点!首先来了解一下WINDOWS系统的结构咯!首先了解一下堆栈!计算机在调用中断,,就必须把原来的指令的指针EIP保存在堆栈里面,当程序完成要回到原来的地方就把保存在堆栈中的EIP恢复,这样就可以回到原来的程序,继续执行原来的程序!
   在程序执行的时候,WINDOWS把先EIP和EBP,再把函数的参数压入堆栈中!这样,溢出的数据会把EBP和EIP覆盖,在程序返回的时候程序返回EIP的地址,但EPI的数据改变了,程序转向了一些不可读或者写的地址!所以出现了WINDOWS的异常处理!对溢出有了准确的了解吧!
   但真正难的是如何利用溢出进行我们学要的服务了!所以我们必须了解有问题程序的返回地址,把那个EIP覆盖为我们我们自己SHELLCODE(机器码哦)的地址!这样就成功的利用了缓冲区溢出!
   以前很多人提出了很多的办法来定位SHELLCODE,但都不是而后内精确。随着技术的发展,1999年dark spyrit AKA Barnaby Jack提出了一个比较好的想法,使用系统内核DLL里的指令来完成跳转!这一技巧开创了一个崭新的WINDOWS缓冲区溢出的思路!
我们用系统核心DLL中的JMP ESP来覆盖返回地址,而把SHELLCODE紧跟其后,这样就可以完成跳转到我们的SHELLCODE。至于为什么用JMP ESP的地址覆盖?那是因为在程序返回的时候执行 POP RET,这样EIP为JMP ESP地址,而ESP指向SHELLCODE的第一个字节!但,计算机不知道我们做了手脚,继续往下执行,这样就执行了我们的SHELLCODE。
其实简单的道理就是把EIP覆盖为JMP ESP,而ESP却指向我们的SHELLCODE。
   但JMP ESP因为不同的版本而不同,比如在WIN2K的user.dll里面,JMP ESP 指令的地址分别为:sp0:0x77e2e32a,sp1:0x77e8898b,sp2:0x77e0492b,sp3:0x77e188a7,sp4:0x77e22c75.所以有的溢出工具里面必须指明对方系统的版本!
   但我们编写溢出程序的时候必须知道有问题程序返回地址(EIP)的精确位置,这样我们就可以把他覆盖为JMP ESP的地址,再得知道JMP ESP的地址,不过现在不要我们去找了,lion大哥给我们找出来了WIN2K/XP/2003的通用地址:0x7ffa4512
不过,在写SHELLCODE的时候有3种方法:第一种,覆盖参数为可写的地址,保证参数是可写的,不会出现write错误(SHELLCODE没写到堆栈中),但这种方法麻烦,需要知道不能写的参数的所有位置,不让它出现write错误,不过当空间足够写还是可以的,这样ESP就指向ESI后面的SHELLCODE。第二种:覆盖异常,这种方法也很高明,等会在说,第三种就是把SHELLCODE放在中断返回前面,根本不覆盖参数。但在ESP的地址中的值是JMP XX,往前跳到SHELLCODE,在这种格式下,这样就可以执行我们的SHELLCODE。
   刚刚说的第二种方法是覆盖异常!这就是JMP/CALL EBX!JMP/CALL EBX不是覆盖返回地址,而是覆盖异常处理的地址!很多大型的程序内部都有自己健全的异常处理程序,如果运行的时候有错误产生,WINDOWS就回跳到一个专门的错误处理的地方,对应不同的错误,执行不同的代码!当系统遇到一个它不知道如何处理的异常时,那它就会查找异常处理链表,找对应这种异常处理程序,找到了对应的处理程序后,就把保存的处理程序地址赋给EIP,这样系统就会执行处理程序,以免系统崩溃!
没找到时,一直找到异常处理链表的最后,直到最后的处理程序,然后把最后的处理程序地址给EIP,执行EIP处的异常处理程序。如果我们要把EIP指向我们的SHELLCODE地址,我们把最后的处理程序的地址改为我们的SHELLCODE的地址,这样就可以了。但我们必须知道SHELLCODE的地址,但在WINDOWS系统里面,在判断是否使用现在指向的异常处理程序的时候,EBX会自动指向下一个处理程序的地址。当系统判断不使用处理程序1是,就重EBX得到处理程序2的地址,并对程序2进行判断,而EBX又自动变为处理程序3的地址。这样就形成了一个异常处理串,可以最后寻找链表结束而不中断!我们故意把返回地址覆盖成了一个错误的地址,这样WIDOWS就会条到错误的入口点,而EBX就在入口前面4个字节的地方!那我们把错误入口处覆盖为JMP EBX的地址,就会条到前面4个字节了!而在这里我们写入JMP 0004,往后跳4个字节,正好跳过了覆盖值,到达我们的SHELLCODE!这样就成功了!
但必须知道异常处理入口点在哪里。这个的技术含量就比较高了,一般用工具跟踪有问题的服务,反汇编,跟踪进去!找到有问题的点,然后找到该服务的异常处理入口!直接分析异常处理口位置距离溢出点的长度!
   溢出是很深奥的技术,这里知识给大家大概讲明溢出的原理和一些溢出的简单技术,如果想真正深入研究溢出的话,那需要更高的知识!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值