《0day安全:软件漏洞分析技术》学习笔记·1(需要补充节部分)
文章目錄
- 基礎(chǔ)知識(shí)
- 漏洞概述
- 漏洞挖掘
- 漏洞分析
- 漏洞利用
- 漏洞在安全中的應(yīng)用
- 二進(jìn)制文件概述
- PE文件格式
- 虛擬內(nèi)存
- PE文件與虛擬內(nèi)存之間的映射
基礎(chǔ)知識(shí)
漏洞概述
??通常把這類(lèi)能夠引起軟件做一些“超出設(shè)計(jì)范圍的事情”的bug稱(chēng)為漏洞(vulnerability)。
??功能性邏輯缺陷(bug):影響軟件的正常功能,例如,執(zhí)行結(jié)果錯(cuò)誤,圖標(biāo)顯示錯(cuò)誤
??安全性邏輯缺陷(漏洞):通常情況下不影響軟件的正常功能,但被攻擊者成功利用后,有可能引起軟件去執(zhí)行額外的惡意代碼,常見(jiàn)的漏洞包括軟件中的緩沖區(qū)溢出漏洞、網(wǎng)絡(luò)中的跨站腳本漏洞(XSS)、SQL注入漏洞等。
漏洞挖掘
??技術(shù)角度講,漏洞挖掘?qū)嶋H上是一種高級(jí)的測(cè)試(QA),學(xué)術(shù)界一直熱衷于使用靜態(tài)分析方法尋找源代碼中的漏洞;而在工程界,普遍使用Fuzz,一種“灰”盒測(cè)試。
漏洞分析
??分析漏洞時(shí),如果能夠搜索到POC(proof of concept)代碼,使用POC重現(xiàn)漏洞被觸發(fā)現(xiàn)場(chǎng)。使用調(diào)試器觀察漏洞的細(xì)節(jié),或者利用工具(如Paimei)更方便的找到漏洞觸發(fā)點(diǎn)。當(dāng)無(wú)法獲得POC的時(shí)候,通過(guò)廠商對(duì)漏洞的描述,使用補(bǔ)丁分析的方法,首先比較patch前后可執(zhí)行文件都有哪些地方被修改,利用反匯編工具(IDA OD)重點(diǎn)分析這些地方。
??漏洞分析需要扎實(shí)的逆向基礎(chǔ)和調(diào)試技術(shù),除此之外,還要精通各種場(chǎng)景下的漏洞利用方法。這種技術(shù)更多依靠的是經(jīng)驗(yàn),很難總結(jié)出通用的條款。實(shí)戰(zhàn)為王。
漏洞利用
??漏洞利用技術(shù)可以追溯到20世紀(jì)80年代的緩沖區(qū)溢出漏洞利用,直到Aleph One于1996年在Phrack第49期上發(fā)表《Smashing The Stack For Fun And Profit》,這種技術(shù)才真正流行并日趨完善。包括內(nèi)存漏洞(堆棧溢出)和Web應(yīng)用漏洞(腳本注入)等
漏洞在安全中的應(yīng)用
??1·從不運(yùn)行任何來(lái)歷不明的軟件,為什么還會(huì)中病毒?
??系統(tǒng)漏洞利用引起計(jì)算機(jī)被遠(yuǎn)程控制(沖擊波蠕蟲(chóng)、slammer蠕蟲(chóng));服務(wù)器軟件存在安全漏洞,或者系統(tǒng)中可以被RPC遠(yuǎn)程調(diào)用的函數(shù)中存在緩沖區(qū)溢出漏洞,攻擊者可以發(fā)起“主動(dòng)”進(jìn)攻。
??
??2·只是點(diǎn)擊了URL連接,并沒(méi)有執(zhí)行任何其他操作,為什么會(huì)中木馬?
??瀏覽器在解析html文件時(shí)存在緩沖區(qū)溢出漏洞,可以通過(guò)承載惡意代碼的HTML文件,當(dāng)通過(guò)鏈接點(diǎn)擊訪問(wèn)的時(shí)候漏洞被觸發(fā),導(dǎo)致HTML中所承載的shellcode被執(zhí)行,這段代碼通常是在沒(méi)有任何提示的情況下去指定的地方下載木馬客戶(hù)端并運(yùn)行。
??
??3·本身是數(shù)據(jù)文件的非可執(zhí)行文件,如果解析器在解析數(shù)據(jù)文件的特定數(shù)據(jù)結(jié)構(gòu)時(shí)存在緩沖區(qū)溢出漏洞,則可以通過(guò)構(gòu)造payload觸發(fā)并利用
??4·高強(qiáng)度密碼只能抵抗密碼暴力猜解的攻擊,具體安全還取決于很多其他因素:
??密碼存在哪里,例如,存本地計(jì)算機(jī)還是遠(yuǎn)程服務(wù)器
??密碼怎樣存,例如,明文存放還是加密存放,什么強(qiáng)度的加密算法等
??密碼怎樣傳遞,例如,密鑰交換的過(guò)程是否安全,網(wǎng)絡(luò)通訊是否使用SSL等
二進(jìn)制文件概述
PE文件格式
??PE(Portable Exec utable)是Win32平臺(tái)下可執(zhí)行文件遵守的數(shù)據(jù)格式。一個(gè)可執(zhí)行文件不光包括了二進(jìn)制的機(jī)器代碼,還會(huì)自帶許多其他信息,如字符串、菜單、圖標(biāo)、位圖、字體等。PE文件格式規(guī)定了所有的這些信息在可執(zhí)行文件中如何組織。在程序被執(zhí)行時(shí),操作系統(tǒng)會(huì)按照PE文件格式的約定去相應(yīng)的位置準(zhǔn)確地定位各種類(lèi)型的資源,并分別裝載到內(nèi)存的不同區(qū)域。
??PE文件格式把可執(zhí)行文件分成若干個(gè)數(shù)據(jù)結(jié)(section),不同的資源被存放在不同的節(jié)中。一個(gè)典型的PE文件中包含的節(jié)如下:
??.text 由編譯器產(chǎn)生,存放著二進(jìn)制的機(jī)器代碼,反匯編和調(diào)試的對(duì)象
??.data 初始化的數(shù)據(jù)塊,如宏定義、全局變量、靜態(tài)變量等
??.idata 可執(zhí)行文件所使用的的動(dòng)態(tài)鏈接庫(kù)等外來(lái)函數(shù)與文件的信息
??.rarc 存放程序的資源,如圖標(biāo)、菜單等
??.除此之外,還可能存在的節(jié)包括“reloc”、“edata”、“tls”、“rdata”等,使用Microsoft Visual C++中的編譯指示符#pragma dat a_seg()可以把代碼中的任意部分編譯到PE的任意節(jié)中,節(jié)名也可以自己定義。如果可執(zhí)行文件經(jīng)過(guò)了“加殼”處理,PE的節(jié)信息就可能出現(xiàn)異常。
虛擬內(nèi)存
??.Windows的內(nèi)存可以被氛圍兩個(gè)層面:物理內(nèi)存和虛擬內(nèi)存。其中物理內(nèi)存比較復(fù)雜,需要進(jìn)入Windows內(nèi)核基本Ring0才能看到。通常,在用戶(hù)模式下,我們用調(diào)試器看到的內(nèi)存地址都是虛擬內(nèi)存。
通過(guò)虛擬內(nèi)存管理器映射實(shí)現(xiàn)每個(gè)進(jìn)程分配“獨(dú)立”的4GB空間。當(dāng)需要進(jìn)行實(shí)際的內(nèi)存操作的時(shí)候,內(nèi)存管理器才會(huì)把“虛擬地址”和“物理地址”聯(lián)系起來(lái)。
PE文件與虛擬內(nèi)存之間的映射
??.在調(diào)試漏洞是,可能經(jīng)常需要做這樣兩種操作。
(1)·靜態(tài)反匯編工具看到的PE文件中某條指令的位置是相對(duì)于磁盤(pán)文件而言的,即所謂的文件偏移,我們可能還需要知道這條指令在內(nèi)存中的位置,即虛擬內(nèi)存地址(VA)。
(2)·在調(diào)試時(shí)看到的某條指令的地址是虛擬內(nèi)存地址,也常需要回到PE文件中找到對(duì)應(yīng)的機(jī)器碼。
1·文件偏移地址(File Offset)
??.數(shù)據(jù)在PE文件中的地址叫文件偏移地址,文件在磁盤(pán)存放時(shí)相對(duì)于文件開(kāi)頭的偏移,可能叫做文件地址更準(zhǔn)確。
2·裝載基址(Image Base)
??.PE裝入內(nèi)存時(shí)的基地址。默認(rèn)情況下,EXE文件在內(nèi)存中的基地址是0x0040 0000 ,DLL文件是0x1000 0000 ??梢酝ㄟ^(guò)修改編譯選項(xiàng)更改。
3·虛擬內(nèi)存地址(Virtual Address VA)
PE文件中的指令被裝入內(nèi)存后的地址。
4·相對(duì)虛擬地址(Relative Virtual Address,RVA)
相對(duì)虛擬地址是內(nèi)存地址相對(duì)于映射基址的偏移量。
虛擬內(nèi)存地址、映射基址、相對(duì)虛擬內(nèi)存地址三者之間:
?? VA=Image Base+RVA
?? RVA=VA-Image Base
?? Image Base=VA-RVA
??文件偏移是相對(duì)于文件開(kāi)始出0字節(jié)的偏移,RVA(相對(duì)虛擬地址)是相對(duì)于裝載基址0x0040 0000 處的偏移。由于操作系統(tǒng)在進(jìn)行裝載時(shí)“基本”上保持PE中的各種數(shù)據(jù)結(jié)構(gòu),所以文件偏移地址和RVA有很大的一致性。
??PE文件中的數(shù)據(jù)按照磁盤(pán)數(shù)據(jù)標(biāo)準(zhǔn)存放,以0x200字節(jié)為基本單位進(jìn)行組織。當(dāng)一個(gè)數(shù)據(jù)節(jié)(section)不足0x200字節(jié)時(shí),不足的地方以0x00填充;PE數(shù)據(jù)節(jié)的大小永遠(yuǎn)是0x200的整數(shù)倍。
??當(dāng)代碼裝入內(nèi)存,將按照內(nèi)存數(shù)據(jù)標(biāo)準(zhǔn)存放,并以0x1000字節(jié)為基本單位進(jìn)行組織。內(nèi)存中的節(jié)總是0x1000的整數(shù)倍。
總結(jié)
以上是生活随笔為你收集整理的《0day安全:软件漏洞分析技术》学习笔记·1(需要补充节部分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东搜索布局优化方法(干货)
- 下一篇: WIN7下CS、war3不能全屏的解决方