[原創]CVE-2009-3459漏洞POC分析<已更新POC>

仙果發表於2009-12-05
Author: 仙果
附記:一個月以前分析的,文章中大概以我翻譯的那篇文章為思路,進行分析,補充了文章裡的一些細節,好不容易找到的,POC樣本已經找不到了。
     比較可惜。翻譯文章的連結地址為:對PDF _CVE-2009-3459分析文章的翻譯

[ 目錄 ]

0×00 漏洞公告
0×01 漏洞除錯分析
0×01_0 觸發漏洞
0×01_1 控制程式執行流程
0×02 Adobe Readr堆管理系統
0×03 總結

0×00 漏洞公告
Heap-based buffer overflow in Adobe Reader and Acrobat 7.x

before 7.1.4, 8.x before 8.1.7, and 9.x before 9.2 allows remote

attackers to execute arbitrary code via a crafted PDF file that

triggers memory corruption, as exploited in the wild in October 2009.

NOTE: some of these details are obtained from third party information.

0×01 漏洞除錯分析

0×01_0 觸發漏洞
        在PDF中,由於引數值觸發的初始化整數溢位

25 0 obj<</Length 299/Filter/FlateDecode/DecodeParms<<
/Columns 1
/Predictor 2
/BitsPerComponent 1
/Colors 1073741838          //此處就是為關鍵引數,觸發漏洞的關鍵點.
>>>>stream

Colors 的值被設定為 1073741838,其十六進位制為0x4000000e,沒有弄明白flate

編碼是什麼編碼?查閱相關資料說是"影像解碼器",莫衷一是.

在009f60a5h處地址,Adobe Reader會引用0x4000000e引數進行計算,如下:

009f60a5 8d148d48000000  lea     edx,<Unloaded_util.dll>+0x47 (00000048)[ecx*4]  //ecx=0x4000000e
009f60ac 89442424        mov     dword ptr [esp+24h],eax                         //eax=0x0
009f60b0 8954241c        mov     dword ptr [esp+1Ch],edx                         //0x80儲存到[esp+1ch]中
009f60b4 8b4c2410        mov     ecx,dword ptr [esp+10h]                         //ecx賦值為0x0
009f60b8 8b442414        mov     eax,dword ptr [esp+14h]                         //eax賦值為0x0
009f60bc 83c003          add     eax,3                                           //eax=eax+0x3=0x3
009f60bf 83e0fc          and     eax,0FFFFFFFCh                                  //相與,為0x0
009f60c2 8d6c0703        lea     ebp,[edi+eax+3]                                 //ebp=0x08000005
009f60c6 83e5fc          and     ebp,0FFFFFFFCh                                  //ebp=0x08000004
009f60c9 8bd5            mov     edx,ebp
009f60cb 0faf542470      imul    edx,dword ptr [esp+70h]
009f60d0 03542418        add     edx,dword ptr [esp+18h]                         //edx=0x0
009f60d4 89442414        mov     dword ptr [esp+14h],eax
009f60d8 8d048a          lea     eax,[edx+ecx*4]                                 //eax=0x0
009f60db 0344241c        add     eax,dword ptr [esp+1Ch]                         //eax=0x80
009f60df 8b4c2428        mov     ecx,dword ptr [esp+28h]                         //ecx=0x03ddcf88
009f60e3 50              push    eax
009f60e4 51              push    ecx
009f60e5 e836010000      call    AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x627c1 (009f6220)
009f60ea 8bd8            mov     ebx,eax                                        //eax=0213208c ,0x80大小的緩衝區指標
009f60ec 83c408          add     esp,8
009f60ef 85db            test    ebx,ebx


............................................................................
009f60a5 地址的意思為 ecx*4+48 賦給 edx
ecx=0x4000000e,由於存在進位,最後的值就為0x80
即,0x4000000e*4+48=0x100000080,但持續只讀取到了0x80
在接下來的 call    AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x627c1 (009f6220) 中的一個函式中呼叫API函式MemSet進行堆的分配
Adobe Reader似乎認為 Colors的每一個值都為一個物件,每一個物件都包含有4個位元組即一個DWORD,語句的目的是計算為每個物件分配一個DWORD需要的記憶體大小。
其返回值為eax=0213208c,即0x80大小的緩衝區指標,指向緩衝區的起始位置。
注意這個值,在下面程式進行計算的時候會使用到這個地址。

..............................................................................

009f5e18 33db            xor     ebx,ebx
009f5e1a 83c40c          add     esp,0Ch
009f5e1d 3bc3            cmp     eax,ebx
009f5e1f 8986ac000000    mov     dword ptr <Unloaded_util.dll>+0xab (000000ac)[esi],eax ds:0023:03ddd034=00000000

............................................................................................................

經過幾次跳轉以後,程式會在009f5e1f處,把0x80大小的緩衝區指標(eax=0213208c)儲存在[esi+0ach]中,並在下面的處理過程中進行呼叫

............................................................................................................

009f7854 83c404          add     esp,4
009f7857 8b86ac000000    mov     eax,dword ptr <Unloaded_util.dll>+0xab (000000ac)[esi] ds:0023:03ddd034=0213208c   //[esi+0ach]=0213208c 賦值給eax
009f785d 50              push    eax                                                                                //eax壓入堆疊
009f785e 8d4c2410        lea     ecx,[esp+10h]
009f7862 56              push    esi                                                                                 //esi=03ddcf88,[esi]=0x7
009f7863 51              push    ecx
009f7864 896c2418        mov     dword ptr [esp+18h],ebp
009f7868 e863060000      call    AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x64471 (009f7ed0)                     //發生溢位的函式
009f786d 83c40c          add     esp,0Ch
009f7870 85c0            test    eax,eax
009f7872 7407            je      AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x63e1c (009f787b)


............................................................................................................
0x80大小的緩衝區指標(0213208c)賦值給eax,並壓入堆疊
借用參考資料中相關內容:
1.lpBuff:0x80大小的緩衝區堆塊的指標-------------------eax
2.bits_original_stream:解碼流中的位元(bits)數量-----esi
3.v_counter:從0到bits_original_stream-1的計數器值-----ecx
以下為 函式009f7ed0的彙編程式碼:
............................................................................................................

009f7ed0 83ec2c          sub     esp,2Ch
009f7ed3 8b442430        mov     eax,dword ptr [esp+30h]
009f7ed7 53              push    ebx
009f7ed8 8b18            mov     ebx,dword ptr [eax]
009f7eda 8b442438        mov     eax,dword ptr [esp+38h]
009f7ede 55              push    ebp
009f7edf 56              push    esi
009f7ee0 8b742444        mov     esi,dword ptr [esp+44h]
009f7ee4 0fb70e          movzx   ecx,word ptr [esi]
009f7ee7 57              push    edi
009f7ee8 8b38            mov     edi,dword ptr [eax]
009f7eea 8b4604          mov     eax,dword ptr [esi+4]
009f7eed 33d2            xor     edx,edx
009f7eef 85c0            test    eax,eax
009f7ef1 8954242c        mov     dword ptr [esp+2Ch],edx
009f7ef5 894c241c        mov     dword ptr [esp+1Ch],ecx
009f7ef9 895c2414        mov     dword ptr [esp+14h],ebx
009f7efd 897c2424        mov     dword ptr [esp+24h],edi
009f7f01 0f8c03020000    jl      AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x646ab (009f810a)       //[不跳轉]
009f7f07 83f801          cmp     eax,1
009f7f0a 7e3e            jle     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x644eb (009f7f4a)       //[不跳轉]
009f7f0c 83f802          cmp     eax,2
009f7f0f 0f85f5010000    jne     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x646ab (009f810a)       //[不跳轉]
009f7f15 8b4608          mov     eax,dword ptr [esi+8]
009f7f18 0faf460c        imul    eax,dword ptr [esi+0Ch]
009f7f1c 89442418        mov     dword ptr [esp+18h],eax
009f7f20 8b4610          mov     eax,dword ptr [esi+10h]
009f7f23 83f803          cmp     eax,3
009f7f26 7e07            jle     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x644d0 (009f7f2f)       //[跳轉]

.........
009f7f2f b903000000      mov     ecx,offset <Unloaded_util.dll>+0x2 (00000003)             //ecx=0x3
009f7f34 2bc8            sub     ecx,eax                                                   //eax=0x0,ecx=0x3  
009f7f36 d3e7            shl     edi,cl                                                    //edi=7,邏輯左移3次,即edi=0x7*2*2*2=0x38
009f7f38 897c2428        mov     dword ptr [esp+28h],edi                                   //edi賦值給[esp+28]
009f7f3c 8b442428        mov     eax,dword ptr [esp+28h]
009f7f40 33ff            xor     edi,edi
009f7f42 85c0            test    eax,eax
009f7f44 897c2448        mov     dword ptr [esp+48h],edi
009f7f48 7f0e            jg      AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x644f9 (009f7f58)        //[跳轉]

......... 
009f7f58 8b5620          mov     edx,dword ptr [esi+20h] ds:0023:021320ac=00000000
009f7f5b 2bc7            sub     eax,edi
009f7f5d 8d0c10          lea     ecx,[eax+edx]
009f7f60 89442440        mov     dword ptr [esp+40h],eax
009f7f64 33c0            xor     eax,eax
009f7f66 394c2418        cmp     dword ptr [esp+18h],ecx       //0x4000000e與0x38進行比較
009f7f6a 0f9ec0          setle   al
009f7f6d 0fb7c8          movzx   ecx,ax
009f7f70 6685c9          test    cx,cx
009f7f73 8b442440        mov     eax,dword ptr [esp+40h]
009f7f77 894c2438        mov     dword ptr [esp+38h],ecx
009f7f7b 740c            je      AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x6452a (009f7f89)    //[跳轉]

..........

009f7f89 89442444        mov     dword ptr [esp+44h],eax ss:0023:0012ed40=03ddcf88
009f7f8d 8bc8            mov     ecx,eax
009f7f8f 33c0            xor     eax,eax
009f7f91 39460c          cmp     dword ptr [esi+0Ch],eax                //0x4000000e與0x38進行比較
009f7f94 89442440        mov     dword ptr [esp+40h],eax
009f7f98 0f8e05010000    jle     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x64644 (009f80a3)   //[不跳轉]
009f7f9e 8d2c1f          lea     ebp,[edi+ebx]
009f7fa1 8d1c7b          lea     ebx,[ebx+edi*2]
009f7fa4 2bd7            sub     edx,edi
009f7fa6 896c2420        mov     dword ptr [esp+20h],ebp
009f7faa 895c2424        mov     dword ptr [esp+24h],ebx
009f7fae 89542430        mov     dword ptr [esp+30h],edx
009f7fb2 eb08            jmp     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x6455d (009f7fbc)   //[跳轉]
009f7fb4 8b542430        mov     edx,dword ptr [esp+30h]                                         //迴圈開始
009f7fb8 8b442440        mov     eax,dword ptr [esp+40h]
009f7fbc 3bc1            cmp     eax,ecx                                                         //如果v_counter>bits_original_stream則
009f7fbe 0f8ddf000000    jge     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x64644 (009f80a3)   //迴圈暫停
009f7fc4 8b6e0c          mov     ebp,dword ptr [esi+0Ch]                                        //0x4000000e賦值給ebp
009f7fc7 03c7            add     eax,edi
009f7fc9 03c2            add     eax,edx
009f7fcb 99              cdq
009f7fcc f7fd            idiv    eax,ebp
009f7fce 8d0439          lea     eax,[ecx+edi]                                                  //edx變成v_counter
009f7fd1 8b4e10          mov     ecx,dword ptr [esi+10h]
009f7fd4 83f903          cmp     ecx,3
009f7fd7 8d5c9644        lea     ebx,[esi+edx*4+44h]                                            //0x80大小緩衝區指標+v_counter*4+44h,賦值給ebx.
009f7fdb 7558            jne     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x645d6 (009f8035)   //[跳轉]

..........

009f8035 83f904          cmp     ecx,4
009f8038 7522            jne     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x645fd (009f805c)
009f803a 8b4c241c        mov     ecx,dword ptr [esp+1Ch]
009f803e 8b542414        mov     edx,dword ptr [esp+14h]
009f8042 8d3c42          lea     edi,[edx+eax*2]
009f8045 8b03            mov     eax,dword ptr [ebx]
009f8047 51              push    ecx
009f8048 8b4c2428        mov     ecx,dword ptr [esp+28h]
009f804c 8bd5            mov     edx,ebp
009f804e e88df76200      call    AcroRd32_950000!PDFLTerm+0x23e0d0 (010277e0)
009f8053 8b7c244c        mov     edi,dword ptr [esp+4Ch]
009f8057 83c404          add     esp,4
009f805a eb23            jmp     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x64620 (009f807f)
009f805c 8b13            mov     edx,dword ptr [ebx]
009f805e 52              push    edx
009f805f 8b542420        mov     edx,dword ptr [esp+20h]
009f8063 d3e0            shl     eax,cl
009f8065 52              push    edx
009f8066 8b54241c        mov     edx,dword ptr [esp+1Ch]

................

009f8035 83f904          cmp     ecx,4
009f8038 7522            jne     AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x645fd (009f805c) [br=1]       //[跳轉]

................

009f805c 8b13            mov     edx,dword ptr [ebx]  ds:0023:021320d0=00000000
009f805e 52              push    edx
009f805f 8b542420        mov     edx,dword ptr [esp+20h]
009f8063 d3e0            shl     eax,cl
009f8065 52              push    edx
009f8066 8b54241c        mov     edx,dword ptr [esp+1Ch]
009f806a d3e5            shl     ebp,cl
009f806c 55              push    ebp
009f806d 50              push    eax
009f806e 8b442450        mov     eax,dword ptr [esp+50h]
009f8072 03c7            add     eax,edi
009f8074 d3e0            shl     eax,cl
009f8076 52              push    edx
009f8077 e8d4f76200      call    AcroRd32_950000!PDFLTerm+0x23e140 (01027850)                            //關鍵函式
009f807c 83c414          add     esp,14h
009f807f 8903            mov     dword ptr [ebx],eax                                     //函式返回值覆蓋了一個DWORD
009f8081 8b442440        mov     eax,dword ptr [esp+40h]
009f8085 8344242402      add     dword ptr [esp+24h],2
009f808a 8344242001      add     dword ptr [esp+20h],1
009f808f 8b4c2444        mov     ecx,dword ptr [esp+44h]
009f8093 83c001          add     eax,1
009f8096 3b460c          cmp     eax,dword ptr [esi+0Ch]
009f8099 89442440        mov     dword ptr [esp+40h],eax
009f809d 0f8c11ffffff    jl      AcroRd32_950000!AVAcroALM_IsFeatureEnabled+0x64555 (009f7fb4)  //跳轉回009f7fb4繼續執行。


............................................................................................................

009f7ed8處[eax]=00 00 20 00 00 00 10
009f7f36處指令是對bits_original_stream進行計算 bits_original_stream=0x38,也即是說 編碼00 00 20 00 00 00 10經過解碼
後的值為0x38

009f7fd7 8d5c9644        lea     ebx,[esi+edx*4+44h]
此處指令的為 指標+v_counter*4+44h,得到的值為0x80大小緩衝區指標+0x44處的指標。
記住0x44這個值,在下面除錯過程中需要用到。
虛擬碼如下:

for(;;) {
	if( v_counter >  bits_original_stream ) break;       //對應:009f7f91
	tmp_counter = v_counter % ParamX;                    //對應:009f7fcc
	lpCurrent = lpBuff + tmp_counter * 4 + 0x44;         //對應:009f7fd7
	iRetVal = mystery_func( *lpCurrent, variables...);   //對應:009f804e
	*lpCurrent = iRetVal;				     //對應:009f807f
	v_counter++;                                         //對應:009f8093
	if( v_counter >= ParamX ) break;
}


call    AcroRd32_950000!PDFLTerm+0x23e140 (01027850) 即為mystery_func(神秘函式)
0x80大小的緩衝區假定Colors 引數的每個物件包含一個DWORD(即有0x4000000e個物件,但實際上只分配了0x80大小的緩衝區,很明視訊記憶體在溢位),
因此這裡為整個溢位利用的核心。
因為是整數溢位,分配的緩衝區實際上遠遠小於所需要的大小:0x4000000e*4+44h遠大於0x80,當計數器在列舉物件時,就超出了緩衝區的結尾,觸發溢位。
從虛擬碼可以看出,只有v_counter>=Colors 0x4000000e時,迴圈才會退出,但由於Colors的極大值,迴圈不會退出,這導致在
call    AcroRd32_950000!PDFLTerm+0x23e140 (01027850)
中對每一個物件呼叫了原來的位元流進行處理。
整段記憶體從0x44的偏移開始被bits_original_stream*4覆蓋。這裡的偏移0x44指的的相對於0x80大小緩衝區的指標的偏移,為什麼?
請看這裡:
009f7fd7 lea     ebx,[esi+edx*4+44h] //lpBuff+v_counter*4+44h,賦值給ebx.
0x38*4=0xe0
被分配的堆塊長度只有0x80,call    AcroRd32_950000!PDFLTerm+0x23e140 (01027850) 函式實際覆蓋的大小為0xa4=0x44+0xc-

相關文章