UAF学习之Adobe reader CVE-2013-3346
學習了UAF,分析了幾個漏洞,同時,也熟悉了windbg的用法,收獲挺大。
基本的UAF分析流程如下:
i:找有漏洞的函數
ii:找到被釋放對象的類型,以及被釋放對象在內存中的位置
iii:理解對象的釋放方式
iv:重寫被釋放對象的地址空間
v:理解漏洞的根本成因
i:尋找有漏洞的函數
打開poc.pdf,出現了異常
(2f0.d64): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=0c0c08a8 ebx=00000001 ecx=069d91c0 edx=292885fd esi=069d91c0 edi=00000000 eip=4a82f129 esp=002be1a0 ebp=002be1c4 iopl=0 nv up ei pl nz ac po cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00210213 4a82f129 ?? ???? ? ?查看堆棧,來分析函數調用流程,如下:
0:000> kb ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong. 002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2> 002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1> 002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab 002be1f0 6257d996 6257f409 0681ad20 58e57e21 AcroRd32_623e0000!DllCanUnloadNow+0x1510bc 002be23c 6257c68c 00000000 58e57e71 0681ad20 AcroRd32_623e0000!DllCanUnloadNow+0x14f66f 002be26c 6257c50e 067dc0f0 0690caf0 58e57ee1 AcroRd32_623e0000!DllCanUnloadNow+0x14e365 002be2fc 6257c206 0681ad20 069763f8 002be318 AcroRd32_623e0000!DllCanUnloadNow+0x14e1e7可知,函數是從6257e85d之前調用的:
0:000> ub 6257e85d AcroRd32_623e0000!DllCanUnloadNow+0x150518: 6257e83f 897dfc mov dword ptr [ebp-4],edi 6257e842 ff96d0020000 call dword ptr [esi+2D0h] 6257e848 0fb7d8 movzx ebx,ax 6257e84b 8b06 mov eax,dword ptr [esi] 6257e84d 59 pop ecx 6257e84e 8bce mov ecx,esi 6257e850 66899ecc020000 mov word ptr [esi+2CCh],bx 6257e857 ff9064030000 call dword ptr [eax+364h]可知,6257e857為crashfun
ii:找到被釋放對象的類型
分析上面匯編,易知esi的地址的值為虛表指針:則可以通過esi和windbg來分析被釋放類型,如下
0:000> !heap -p -a esiaddress 069d91c0 found in_HEAP @ 2ea0000HEAP_ENTRY Size Prev Flags UserPtr UserSize - state069d91b8 0071 0000 [00] 069d91c0 00370 - (busy)大小為370,同時,esi的地址也為對象地址069d91c0
,可以得到。
iii:查看被釋放對象在內存中的地址
觀察異常前的堆棧
WARNING: Frame IP not in any known module. Following frames may be wrong. 002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2> 002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1> 002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab采用虛擬機回滾的方法來簡便堆的調試
? 根據猜測,查看<1>的函數的調用處具體代碼,并對該函數下斷點。如下
eax=65f607a4 ebx=00000000 ecx=059f7d48 edx=00000483 esi=059f7d48 edi=00000001 eip=6553e0cc esp=0022ddcc ebp=0022dde8 iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00200202 AcroRd32_653a0000!DllCanUnloadNow+0x14fda5: 6553e0cc ff909c020000 call dword ptr [eax+29Ch] ds:0023:65f60a40=6553e7f8查看esp+8,即為對象地址。如下:
0:000> dd esp 0022ddcc 00000000 05a5bbc8 00000000 00000001 0022dddc 00000000 00000000 00000000 0022ddf0 0:000> !heap -p -a 05a5bbc8 address 05a5bbc8 found in_HEAP @ 10a0000HEAP_ENTRY Size Prev Flags UserPtr UserSize - state05a5bbc0 0071 0000 [00] 05a5bbc8 00370 - (busy)? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+2b41340:000> dd 05a5bbc8 05a5bbc8 65f607a4 00000000 65f6077c 00000000 05a5bbd8 00000000 65f6073c 00000000 65f60728 05a5bbe8 05bc8bc0 00000001 02641ff8 00000001其中,05a5bbc8位置的值即為虛表指針。
iv:理解對象的釋放方式。
直接通過buntdll!RtlFreeHeap ".if(poi(esp+0xc) == 05a5bbc8) {kb} .else{gc}"來查看堆棧的情況,并與crash時的堆棧進行對比,如下
0022d1c4 6553f5ae 00000001 00000000 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0xa5956
0022d218 6553f41b 0022d24c 6553e848 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0x151287
0022d220 6553e848 05dd6c50 2b83a232 00000001 AcroRd32_653a0000!DllCanUnloadNow+0x1510f4
0022d24c 6553e0d2 00000000 05a5c2d8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150521
0022d270 6553f3e3 0022d2c4 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab
0022d278 6553d996 6553f409 05dd6c50 2b83a2ba AcroRd32_653a0000!DllCanUnloadNow+0x1510bc
crash時:
0022dd9c 6553e85d 2b83adba 00000001 05a5bbc8 0x4a82f129 0022ddc4 6553e0d2 00000000 05a5bbc8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150536 0022dde8 6553f3e3 0022de3c 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab 0022ddf0 6553d996 6553f409 05952238 2b83ae42 AcroRd32_653a0000!DllCanUnloadNow+0x1510bc可以得出,函數在堆棧情況如下的函數中進行了釋放
0022d24c 6553e0d2 00000000 05a5c2d8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150521如上所說,即在6553e0d2中釋放,利用ida分析該函數。根據FreeHeap的kv情況,可以得到釋放函數為對象的一個虛函數,如圖所示
6553e82b 7461 je AcroRd32_653a0000!DllCanUnloadNow+0x150567 (6553e88e) 6553e82d 8d45f0 lea eax,[ebp-10h] 6553e830 50 push eax 6553e831 8d4e1c lea ecx,[esi+1Ch] 6553e834 e8e607f5ff call AcroRd32_653a0000!DllCanUnloadNow+0xa0cf8 (6548f01f) 6553e839 ffb6d4020000 push dword ptr [esi+2D4h] 6553e83f 897dfc mov dword ptr [ebp-4],edi 6553e842 ff96d0020000 call dword ptr [esi+2D0h]?
如圖,esi為被攻擊的函數對象的虛表指針。函數流程為[esi+2D0h] ,其中eax為另一個對象虛表指針。根據poc可得,該函數為addButtonFunc()函數,
v:重寫被釋放對象的地址空間
通過下斷點分別查看在6553e0cc,6553e857,crash時對象的情況,可以得出,填充在調用6553e857之后,crash之前,如下:
//斷在6553e00c時 0:000> dd 5c473d0 05c473d0 65f607a4 00000000 65f6077c 00000000 05c473e0 00000000 65f6073c 00000000 65f60728 05c473f0 05c66420 00000001 02642260 00000001//斷在6553e857時 0:000> dd 5c473d0 05c473d0 65f607a4 00000000 65f6077c 00000000 05c473e0 00000000 65f6073c 00000000 65f60728 05c473f0 05c66420 00000001 02642260 00000001//crash時 05c473d0 0c0c08a8 41414141 41414141 41414141 05c473e0 41414141 41414141 41414141 41414141 05c473f0 41414141 41414141 41414141 41414141?
? vi:理解漏洞的根本原因
仔細分析調用流程,函數流程為[esi+2D0h]-->6553f409-->[eax+16]->,在6553f995處下斷點,可得,其中eax為esi的虛表指針,而esi為一個對象的首地址,即在對象被釋放前先生成了一個新對象。
賦值語句如下
.text:6019F595 lea eax, [esi+8Ch] .text:6019F59B mov ecx, [eax]查看esi對象的堆的情況,如下。
0:000> !heap -p -a esiaddress 059fef10 found in_HEAP @ 10a0000HEAP_ENTRY Size Prev Flags UserPtr UserSize - state059fef08 0021 0000 [00] 059fef10 000fc - (busy)? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+28779c?在05ae857設置斷點,可看到釋放對象在生成的對象為參數,且參數中含有對釋放對象的引用,只要對該對象進行應用就可以產生UAF漏洞了。
vii:總結
創建一個父對象,poc所示為ToolButton,然后設置一個函數,函數創建一個子對象,子對象設置函數,對父對象進行刪除,且保留了對父對象的引用,對子對象函數進行調用,即可產生UAF漏洞。
轉載于:https://www.cnblogs.com/0xJDchen/p/5980807.html
總結
以上是生活随笔為你收集整理的UAF学习之Adobe reader CVE-2013-3346的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: post from open live
- 下一篇: 键盘 Input子系统