|
| |
精品推荐 |
 |
|
| |
|
|
|
|
软件漏洞及缓冲区溢出
|
日期:2007年3月20日 作者: 查看:[大字体
中字体 小字体]
|
(3) 控制程序溢出,并控制程序流程 由于堆栈空间的不确定性,每次溢出时堆栈所处的地址都不一样,所以不能直接将返回值重定向到堆栈中,但是因为当前esp指向的是堆栈空间,并且该空间位于我们可控区域,这样,溢出以后可以先返回到一条"jmp esp"或"call esp"处,然后利用跳转指令来实现shellcode的定位。 一般来说,栈溢出的通用性与jmp esp指令的通用地址有关,很多语言版本的2000和XP都有通用的jmp esp地址,但是在英文版和韩文版的系统中暂时未发现。对于这两种语言版本的系统,可以有针对性的进行溢出。 注意区分可利用溢出与不可利用溢出。有些漏洞在溢出发生后程序会访问已经被更改的变量,会导致程序在没有返回以前出错,出现不可利用的情况。
3、 堆溢出的利用 现在堆溢出的漏洞也越来越多,对于堆溢出漏洞,没有一种比较固定的利用方法,比较流行的就是利用SEH来实现对堆溢出漏洞的利用。 堆管理结构是一种双向链表。结构如下: //插入堆结构双向链表图 当堆溢出后,会覆盖堆管理结构,当系统释放或再次分配堆的时候,就会产生错误,这就是堆溢出。 堆溢出的利用方式一般有两种,一种是在堆回收时利用,一种是在下一个堆分配时利用。 在堆分配是利用: mov [eax], ecx mov [ecx+4], eax 其中eax,和ecx的值都可以控制。这样,实际上我们可以控制当前系统中任意一个4字节的值,利用这4个字节来进行利用。 利用这4个字节可以改写某个常用函数的导出表,或者改写SEH的链表节点,利用SEH的特性来进行利用。比较有效的利用方法就是利用SEH来进行利用。 JPEG 漏洞就属于堆溢出漏洞。根据分析,可以发现配合word使用的jpeg环境比较固定,也就是说溢出时的seh结构固定,并且esi指向原来的堆中,我们可控位置,这样,利用更改4个字节的功能将第一个SHE的处理函数改为一条call[esi+48]指令。因为在进入异常处理后所有的寄存器都会改变,而 [esp+48]时原来的esi的值。 堆溢出比较灵活,利用方法很多,但是能够通用的比较少,受限制条件比较多。 参考资料: http://www.w00w00.org/files/articles/heaptut.txt 四、 如何编写shellcode 1、 根据自己的需要编写shellcode 根据需求编写shellcode。比如说下载木马执行,绑定木马执行,返回一个shell,上传木马执行等。 2、 用win32汇编编写shelcode 现在一般都采用Win32汇编或者C语言编写shellcode.使用汇编语言编写shellcode比较简单,同时对编译器的编译行为也比较容易把握,汇编编译器一般尊重源程序,不会进行太多的优化。 首先,Shellocde涉及到一个代码自定位的问题。在x86体系中程序执行时,对数据段的访问默认使用绝对寻址方式,也就是说在我们编写shellcode时的数据地址在其他系统中使用时要通过其他的方法来进行定位。 通过下面的语句可以定位当前的shellcode所处的位置: call @F @@: pop ebx sub ebx, offset @B 其中offset @B是编译时就已经固化的一个地址,当访问数据时,就使用:[ebx + _testData]这种形式。其中,testData也是一个编译时固化的地址。 其次就是在shellcode中确定当前系统的kernel32.dll地址。然后再到kernel32.dll导出表中去寻找我们所需要的函数地址。 定位kernel32.dll地址的方法很多,最有效的一种就是利用当前进程的TEB/PEB定位,还有一种就是程序自己搜索进程空间,找到shellcode的起始地址。 ;获得Kernel32.dll起始地址 assume fs:nothing mov eax, fs:30h mov eax, [eax + 0ch] mov esi, [eax + 1ch] lodsd mov edx, [eax + 8h] ;edx 就是kernel32.dll的地址 mov @hModule, edx 获得GetProcAddress和LoadLibrary,GetModuleHandle函数地址。 在取得kernel32.dll起始地址后,可以通过搜索dll导出表的方法获得函数地址。 shellcode具体写法参考实例。
3、 从程序中提取Shellcode shellcode编写好以后,还得将其从程序中倒出来,经过编码,最后才能使用到溢出程序中。 这里要注意的一点就是有些漏洞对shellcode有特殊的要求,比如不能有0,不能有0xff,等等。这时候就要先将shellcode编码成满足需求的代码,然后专门写一段解码程序添加到shellcode的前面,在溢出后先执行解码程序,将shellcode解码成为正常的指令,然后执行。
4、 编写sehllcode时的注意事项 在编写shellcode时,由于溢出的原因,堆栈空间已经被破坏,这时候必须保证堆栈空间是以4字节对齐,否则在调用某些函数时会有莫名其妙的错误。 其次就是要为shellcode中使用的局部变量预留足够的空间。 http://www.phrack.org/show.php?p=62&a=7
上一篇:phpwind1.3.6论坛利用程序
下一篇:世界上最好的磁盘碎片整理工具原版+汉化+注册机
|
| 软件漏洞及缓冲区溢出 相关文章: |
|
|
|
| 软件漏洞及缓冲区溢出 相关软件: |
|
|
|
|