欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

CVE公共漏洞和暴露分析報告2012-0774

  發(fā)布時間:2012-05-11 10:37:10   作者:佚名   我要評論
CVE 的英文全稱是Common Vulnerabilities & Exposures公共漏洞和暴露。CVE就好像是一個字典表,為廣泛認(rèn)同的信息安全漏洞或者已經(jīng)暴露出來的弱點給出一個公共的名稱。使用一個共同的名字,可以幫助用戶在各自獨立的各種漏洞數(shù)據(jù)庫中和漏洞評估工具中共享數(shù)據(jù),雖然這些
一.漏洞描述
Adobe Reader在閱讀PDF文件時使用一些公共格式載入字體說明,比如TrueTypeFont (TTF).<TTF是Apple公司和Microsoft公司共同推出的字體文件格式>
TTF中有幾個片段負(fù)責(zé)格式化存儲字體字形的描述,其中一個片段是字節(jié)碼語言,它由TTF渲染器中的一個解釋器執(zhí)行。這個解釋器是一個基于堆棧的虛擬機,因此它使用的大部分指令都以某種方式修改指令。MINDEX指令可以從棧中彈出一個值,并利用這個值作為一個索引進(jìn)入棧區(qū)。該索引上的值被移到棧頂,棧中原有的值依次向下移動以填補移動索引值產(chǎn)生的空間。
MINDEX 指令的偽碼:
     index = stack.pop()
     new_top = stack[index]
     for (i = 1; i<= index; i++)
     stack[i] = stack[i - 1]
     stack[0] = new_top
由于所有的棧操作都以4byte為單位,故而該索引值為了找到用于移動的位偏移值,會在Adobe Reader的解釋器里進(jìn)行乘以4的運算。但卻沒有對這個乘法運算進(jìn)行整數(shù)溢出的檢測。這個“索引”的原始值作為一個數(shù)字元素復(fù)制到一個循環(huán)中,如果這個“索引”足夠大的(在進(jìn)行乘4運算時能溢出一個小數(shù)值的)數(shù)值時,會導(dǎo)致緩沖區(qū)溢出。
1.補充
在解析文件時,首先查看“PDF key /FontFile2”可能會獲得TTF數(shù)據(jù)。
    找到TTF數(shù)據(jù)段后,需要對其進(jìn)行解析,并檢查“glyf”表,每個字形條目都可以包含0個或多個TTF字節(jié)碼格式的指令,需要對他們進(jìn)行解碼和模擬,一次來發(fā)現(xiàn)MINDEX指令。
    找到MINDEX指令后,需要檢查位于棧頂?shù)闹担▽⒈挥米鏊饕?,如果這個值位于下列范圍:0x40000001 <= index <= 0x7fffffff ,那么這個PDF文件應(yīng)標(biāo)記為惡意的PDF文件。
二、   調(diào)試環(huán)境與工具
環(huán)境:Windows XP3 +    AdobeReader9.4.0.195
工具:OllbDBG + IDA Pro + 010 Editer
三、   調(diào)試記錄
載入POC后程序出現(xiàn)內(nèi)存訪問異常:
080079CE  MOV DWORD PTR DS:[ECX],EBX   ;ECX=0823F000,EBX=0
 
 




ALT+M查看內(nèi)存窗口,發(fā)現(xiàn)程序嘗試是向CoolType.dll的.rscr段寫入數(shù)據(jù),而.rscr段內(nèi)存一般都只讀的,在執(zhí)行MOV DWORD PTR DS:[ECX],EBX發(fā)生了內(nèi)存訪問異常。
 
按MAPP的描述,發(fā)生異常的位置在MINDEX 指令處,載入IDA看看這段代碼:
回頭再看看圖1中的EDX,EDX是一個很大的值,而字節(jié)碼解釋器的堆棧位于CoolType.dll的.dada內(nèi)存中。MINDEX 指令處在取棧最上面的索引值后,跟據(jù)索引值計算出偏移量去取值后,堆中的元素向下移動去填補取出值的位置(堆的增長方向是向高地址與windows程序中的堆棧不同),即高地址的4個字節(jié)復(fù)制到相鄰的低地址的4個字節(jié),如果這個棧中的索引沒有驗證大小,MINDEX 指令在移動數(shù)據(jù)直到索引值為0才停下,如果在移動過程中覆蓋到重要的數(shù)據(jù),此漏洞可變?yōu)榭衫玫穆┒础?br /> 
.text:0800798B MINDEX          proc near               ; CODE XREF: sub_800690E+49p
.text:0800798B                                         ; sub_806C605+48p
.text:0800798B                                         ; DATA XREF: .data:0821BF68o
.text:0800798B
.text:0800798B arg_0           = dwordptr  4
.text:0800798B
.text:0800798B                 moveax, StackTop
.text:08007990                 movecx, Var
.text:08007996                 push    ebx
.text:08007997                 push    esi
.text:08007998                 movesi, [ecx]      ; stack.base
.text:0800799A                 lea     edx, [eax-4]
.text:0800799D                 cmpedx, esi        ; 彈出一個值后的堆棧地址是否大于或?;?br />.text:0800799F                 push    edi
.text:080079A0                 jb      short FailRet
.text:080079A0
.text:080079A2                 movedi, [ecx+154h] ; Stack.Limit?
.text:080079A8                 cmpedx, edi        ; 棧頂是否大于stack.limit
.text:080079AA                 jnb     short FailRet
.text:080079AA
.text:080079AC                 add     eax, 0FFFFFFFCh ; -4
.text:080079AF                 movedx, [eax]      ; 取索引
.text:080079B1                 movebx, edx
.text:080079B3                 shlebx, 2          ; 計算出偏移量,偏移量=索引*4
.text:080079B6                 movecx, eax
.text:080079B8                 sub     ecx, ebx         ;ebx=偏移量
.text:080079BA                 cmpecx, esi
.text:080079BC                 jb      short FailRet
.text:080079BC
.text:080079BE                 cmpecx, edi
.text:080079C0                 jnb     short FailRet
.text:080079C0
.text:080079C2                 test    edx, edx
.text:080079C4                 movedi, [ecx]      ; 保存取出的值。
.text:080079C6                 jle     short loc_80079D7
.text:080079C6
.text:080079C8
.text:080079C8 Moving:                                 ; CODE XREF: MINDEX+47j
.text:080079C8                 decedx
.text:080079C9                 lea     esi, [ecx+4]
.text:080079CC                 movebx, [esi]
.text:080079CE                 mov     [ecx], ebx
.text:080079D0                 movecx, esi
.text:080079D2                 jnz     short Moving
.text:080079D2
.text:080079D4                 sub     eax, 4
.text:080079D4
.text:080079D7
.text:080079D7 loc_80079D7:                            ; CODE XREF: MINDEX+3Bj
.text:080079D7                 mov     [eax], edi
.text:080079D9                 add     eax, 4
.text:080079DC                 movStackTop, eax
.text:080079E1                 moveax, [esp+0Ch+arg_0]
.text:080079E5                 jmp     short loc_80079F6
.text:080079E5
.text:080079E7 ; ---------------------------------------------------------------------------
.text:080079E7
.text:080079E7 FailRet:                                ; CODE XREF: MINDEX+15j
.text:080079E7                                         ; MINDEX+1Fj MINDEX+31j
.text:080079E7                                         ; MINDEX+35j
.text:080079E7                 moveax, dwEIP
.text:080079EC                 mov     dword_8232434, 1110h
.text:080079EC
.text:080079F6
.text:080079F6 loc_80079F6:                            ; CODE XREF: MINDEX+5Aj
.text:080079F6                 pop     edi
.text:080079F7                 pop     esi
.text:080079F8                 pop     ebx
.text:080079F9                 retn
.text:080079F9
.text:080079F9 MINDEX          endp
 
四、字節(jié)碼相關(guān)分析
通過日志斷點打印字節(jié)碼信息,發(fā)現(xiàn)此索引是跟據(jù)glyf中的字節(jié)碼數(shù)據(jù)計算出來的。
1.    打PCode長度信息:
 
2.設(shè)置打印PCode地址信息日志斷點:
 
 
 
3.打印虛擬機”指令”信息:
 


4.虛擬機指令執(zhí)行前的當(dāng)前堆棧數(shù)據(jù):
 
 
5.指令結(jié)束后的當(dāng)前虛擬機堆棧的數(shù)據(jù):
 
6.指令分隔符號信息,便于查看信息:
 








OllyDBG重新載入AdobeReade.exe,在MINDEX 指令的首地址下普通斷點后,打開poc文件后開始打印日志,程序停下來之后查看最后的記錄:
08006927  條件: PCode = 02DD6B33
08006928  條件: Instruction = 0026
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 40000001
0800798B  斷點位于<CoolType.MINDEX>
從打印的信息來看MINDEX 指令是0x26,當(dāng)前堆棧為[vm_esp] = 0x40000001.
0x40000001正好當(dāng)前棧的索引值。Eax值指向當(dāng)前PCode的地址。
 
從分析日志來看:
索引的值是7fff + 7fff + 3FFF0003
08006927  條件: PCode = 02DD6B2A
08006928  條件: Instruction = 0078//跳轉(zhuǎn)指令
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 00000000
0800695E  條件: 執(zhí)行后[vm_esp] = 3FFF0003
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DD6B2B
08006928  條件: Instruction = 0041Push_Imm16,將7fff,7fff壓入堆棧再相加
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 3FFF0003
0800695E  條件: 執(zhí)行后[vm_esp] = 00007FFF
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DD6B31
08006928  條件: Instruction = 0060  ADD [ESP-4],[ESP]
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 00007FFF
0800695E  條件: 執(zhí)行后[vm_esp] = 0000FFFE7fff + 7fff = fffe
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DD6B32
08006928  條件: Instruction = 0060ADD [ESP-4],[ESP]
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 0000FFFE 
0800695E  條件: 執(zhí)行后[vm_esp] = 40000001 3FFF0003 + fffe = 40000001
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DD6B33
08006928  條件: Instruction = 0026 MINDEX 指令
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 40000001
0800798B  斷點位于<CoolType.MINDEX>  
 
再往上查看日志3FFF0003是從哪來的:
分析日志得知:00FFFC00 + 3EFF0403 = 3FFF0003
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DED7D2
08006928  條件: Instruction = 0041
08006955  條件: 執(zhí)行前VM_ESP地址= 08236230
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 3EFF0403
0800695E  條件: 執(zhí)行后[vm_esp] = 00007FFF
0800695F  條件: 執(zhí)行后VM_ESP地址= 08236238
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DED7D8
08006928  條件: Instruction = 0063
08006955  條件: 執(zhí)行前VM_ESP地址= 08236238
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 00007FFF
0800695E  條件: 執(zhí)行后[vm_esp] = 00FFFC00
0800695F  條件: 執(zhí)行后VM_ESP地址= 08236234
08006962  條件: **********************************************************************
08006927  條件: PCode = 02DED7D9
08006928  條件: Instruction = 0060ADD [ESP-4],[ESP]
08006955  條件: 執(zhí)行前VM_ESP地址= 0823623408236234的值是7FFF而08236234-4的值是3EFF0403
08006956  條件: 執(zhí)行前堆棧[vm_esp] = 00FFFC00
0800695E  條件: 執(zhí)行后[vm_esp] = 3FFF0003   00FFFC00 + 3EFF0403 = 3FFF0003
0800695F  條件: 執(zhí)行后VM_ESP地址= 08236230
08006962  條件: **********************************************************************
 
日志最開始的地方顯示PCode的長度為0x79:
08006917  條件: Pcode長度= 00000079
 
一直通過追述到源頭到發(fā)現(xiàn)此值是在一個循環(huán)中逐步增加計算索引的一個過程。
復(fù)制內(nèi)存中的PCode在010 Editer中查看:

 
最后此漏洞分析到此完成了,還有很多東西不相關(guān)的分析沒有貼上來,對于文件格式不明白,所以還有很多東西搞不清楚

相關(guān)文章

最新評論