網(wǎng)絡(luò)安全丨為神馬二進(jìn)制學(xué)習(xí)周期長?

作者丨黑蛋
今天的話題主要針對二進(jìn)制小白,來聊一下二進(jìn)制為什么是眾所周知學(xué)習(xí)周期是相對較長的一個學(xué)習(xí)方向,沒有啥捷徑可以走。我們以分析漏洞這個方向為一個突破口來講講。就像分析漏洞CVE-2012-0158這個經(jīng)典的棧溢出漏洞,CVE-2012-0158是一個office棧溢出漏洞,Microsoft Office 2003 sp3是2007年9月18日由微軟公司創(chuàng)作的一個辦公軟件,他的MSCOMCTL.ocx中的MSCOMCTL.ListView控件檢查失誤,讀取數(shù)據(jù)時,讀取長度和驗證長度都在文件中,這樣參數(shù)可以人為修改,觸發(fā)緩沖區(qū)溢出漏洞。具體漏洞分析可以閱讀我們公眾號前期文章。
分析漏洞首先我們需要進(jìn)行漏洞驗證,找到已有的POC,驗證漏洞是否存在。而涉及到POC,就得說到Payload的構(gòu)造,然后就要談到Shellcode,而對于編寫一段簡單的彈窗Shellcode,我們首先需要編程能力,無論是使用何種,這里都需要我們有一定的編程能力,而要構(gòu)造類似萬金油的彈窗Shellcode,我們更需要擁有系統(tǒng)編程的知識,以及PE結(jié)構(gòu)的知識,去動態(tài)獲取所需要的各種函數(shù)。匯編寫Shellcode部分代碼如下:
void main()
{
??? _asm{
?????? nop
?????? nop
?????? nop
?????? nop
?????? nop
?????? nop
?????? nop
?
?????? CLD
?????? push 0x1e380a6a
?????? push 0x4fd18963
?????? push 0x0c917432
?????? mov esi,esp
?????? lea edi,[esi-0xC]
?????? ?
?????? xor ebx,ebx
?????? mov bh,0x4
?????? sub esp,ebx
?
?????? mov bx,0x3233
?????? push ebx
?????? push 0x72657375
?????? push esp
?????? xor edx,edx
?????? ?
?????? mov ebx,fs:[edx + 0x30]
?????? mov ecx,[ebx + 0x0C]
?????? mov ecx,[ecx + 0x1C]
?????? mov ecx,[ecx]
?????? mov ebp,[ecx + 0x08]
?????? ?
find_lib_functions:
?????? lodsd
?????? cmp eax,0x1e380a6a
?????? jne find_functions
?????? xchg eax,ebp
?????? call [edi - 0x8]
?????? xchg eax,ebp
?
find_functions:
?????? pushad
?????? mov eax,[ebp + 0x3c]
?????? mov ecx,[ebp + eax + 0x78]?
?????? add ecx,ebp
?????? mov ebx,[ecx+0x20]
?????? add ebx,ebp
?????? xor edi,edi
?
next_Function_loop:
?????? inc edi
?????? mov esi,[ebx + edi * 4]
?????? add esi,ebp
?????? cdq
?????? 。
?????? 。
?????? 。
這里流程就是通過FS寄存器指向TEB結(jié)構(gòu),然后偏移0x30的地址找到PEB結(jié)構(gòu),然后再到偏移0x0C的地址找到PEB_LDR_DATA結(jié)構(gòu)體的指針,然后找到模塊初始化鏈表,找到第二個鏈表節(jié)點Kernel32.dll,隨后找到Kernel32.dll基址,通過遍歷導(dǎo)出表,找到LoadLibrary函數(shù)和GetProAddress函數(shù),獲取我們所需要的所有函數(shù)。這樣的Shellcode可以不依靠任何環(huán)境進(jìn)行運行,缺啥就可以自己找啥。隨后我們借助調(diào)試工具OD和16進(jìn)制編輯器010Editor扣出我們所需要的硬編碼如下:
FC 68 6A 0A 38 1E 68 63 89 D1 4F 68 32 74 91 0C
8B F4 8D 7E F4 33 DB B7 04 2B E3 66 BB 33 32 53
68 75 73 65 72 54 33 D2 64 8B 5A 30 8B 4B 0C 8B
49 1C 8B 09 8B 69 08 AD 3D 6A 0A 38 1E 75 05 95
FF 57 F8 95 60 8B 45 3C 8B 4C 05 78 03 CD 8B 59
20 03 DD 33 FF 47 8B 34 BB 03 F5 99 0F BE 06 3A
C4 74 08 C1 CA 07 03 D0 46 EB F1 3B 54 24 1C 75
E4 8B 59 24 03 DD 66 8B 3C 7B 8B 59 1C 03 DD 03
2C BB 95 5F AB 57 61 3D 6A 0A 38 1E 75 A9 33 DB
53 68 66 66 66 66 68 66 66 66 66 8B C4 53 50 50
53 FF 57 FC 53 FF 57 F8
有了Shellcode,我們可以開始進(jìn)行漏洞分析,這里就需要動態(tài)調(diào)試工具OD了,去附加有漏洞的進(jìn)程,通過附加Office2003,找到漏洞溢出點,所以研究漏洞,我們還需要對匯編語言的學(xué)習(xí),以及對調(diào)試工具的熟練使用,而熟練使用調(diào)試工具,我們是必備一定的正向開發(fā)基礎(chǔ),以及扎實的匯編基礎(chǔ),隨后才可以對調(diào)試工具的使用進(jìn)行學(xué)習(xí)練習(xí)。然后才可以通過對漏洞軟件的調(diào)試,找到溢出點,然后構(gòu)造我們的Payload,完成我們一次對漏洞Exp的編寫,完成我們一次對漏洞的分析利用。

這只是一次很簡單的漏洞分析,所需要的基礎(chǔ)知識就有匯編,C語言,數(shù)據(jù)結(jié)構(gòu),系統(tǒng)編程,PE結(jié)構(gòu),而這里每一個知識點都需要一段時間去學(xué)習(xí),鞏固。而這僅僅是對基礎(chǔ)知識的要求,也僅僅是一個基本漏洞所需要的知識點,如果缺少任意一個環(huán)節(jié)的知識點,我們都是寸步難行,而擁有這些知識點,我們還要去學(xué)習(xí)把基礎(chǔ)知識全部融合起來,綜合的去運用,然后才可以用到實踐過程中去。而無論是研究二進(jìn)制大方向中的任何一個方向,前面所說的基礎(chǔ)知識都是必備的東西,隨后才可以根據(jù)不同方向進(jìn)行學(xué)習(xí)探索。