20155306 白皎 0day漏洞——基礎知識


20155306 白皎 0day漏洞——(第一篇)基礎知識

寫在前面:

本次免考實踐方向是0day漏洞,以博客的形式記錄了我的學習實踐過程。第一篇博客主要圍繞什么是0day漏洞以及一些以后學習中需要的基礎知識和必備工具進行簡單介紹和具體的操作。

一、漏洞概述

1. 漏洞與bug

我們通常把一些引起系統軟件做“超出設計范圍內的事情”的bug稱作是漏洞,實際上漏洞和bug也是有一些區別的。

  • 功能性的缺陷(bug):影響軟件的正常功能,例如執行結果錯誤、圖標顯示錯誤等。
  • 安全性邏輯缺陷(漏洞):通常情況下不影響軟件的正常功能,但被攻擊者成功利用后,有可能引起軟件去執行額外的惡意代碼。例如很常見的緩沖區漏洞、SQL注入漏洞等。

2. 0day漏洞

  • 定義:0day漏洞就是未被公布、未被修復的漏洞稱作0day漏洞。

它是危害最大的漏洞,對攻擊者來說也是最有價值的漏洞。如果被曝光,那么在廣商的官方補丁發布之前,整個網絡都處於高危預警狀態。

  • 公布漏洞的權威機構:
    • CVE:CVE對每個公布的漏洞確定了唯一的名稱和編號。因此,其編號也是引用漏洞的標准方式。
    • CERT:計算甲應急響應組往往會在第一時間跟進當前的嚴重漏洞,包括描述信息、用戶應該才去的臨時性防范措施等。

二、二進制文件概述

1.PE文件

PE是win32平台下可執行文件遵守的數據格式。常見的格式有exe文件、dll文件等。

PE文件格式把可執行文件分為若干個數據節(section),不同的資源放在不同的節中,一個典型的PE文件包含的節如下:

* .text:由編譯器產生,存放着二進制的機器代碼,反匯編和調試的對象。
* .data:初始化的數據塊,如宏定義、全局變量、靜態變量等
* .idata:可執行文件所使用的動態鏈接庫等外來函數與文件的信息。
* .rsrc:存放程序的資源,如圖標、菜單等。
* 除此之外,還可能出現“.rdata",".tls"等。

2.虛擬內存

windows的內存被分為了兩個層面。通常在用戶模式下,我們用調試器看到的內存都是虛擬內存。

* 物理內存:需要進入內核級別ring0才能看到。
* 虛擬內存:在用戶態ring3下,就可以通過調試器來看到內存地址。

如下圖所示,是windows虛擬內存和物理內存的示意圖。windows讓所有進程都相信自己擁有獨立都有4GB的內存空間【這些空間包含了程序運行所必需的資源,如代碼、棧空間、堆空間等】,都是可以訪問的,但實際上運行時能用到的空間根本沒有這么多。只有需要進行實際的內存操作的時候,內存管理器才會將“虛擬地址”和“物理地址”相聯系起來。

3.PE文件與虛擬內存之間的映射

2.3.1重要概念

首先,要理解幾個概念,我們才可以弄清楚PE文件地址和虛擬內存地址之間的映射關系。

  • 文件偏移地址(File Offset):數據在PE文件中的地址叫文件便宜地址,是磁盤上存放時相對於文件開頭的偏移地址。

  • 裝載基址(Image Base):PE裝入內存時的基地址。
    * EXE文件在內存中的基地址是0x00400000
    * DLL文件在內存中的基地址是0x10000000
    * 基地址是可以通過修改編譯選項來更改

  • 虛擬內存地址(Virtual Address,VA):PE文件中的指令被裝入內存后的地址。

  • 相對虛擬地址(Relative Virtual Address,RVA):內存地址相對於映射基址的偏移量。.

虛擬內存地址、映射基址、相對虛擬內存地址之間的關系:
VA=Image Base + RVA

2.3.2文件數據存放和內存存放的不同

PE文件按照兩種數據標准存放:

  • 磁盤數據標准存放:以0x200字節為基本單位進行組織,若數據不足200字節,則用0x00來填充。
  • 內存數據標准存放:以0x1000字節為基本單位進行,同樣,不足被補全,超出則分配下一個0x1000為其所用,內存中的節是0x1000的整數倍。

所以當把文件便宜到虛擬內存地址的換算時,還要看所轉換的地址位於第幾個節內,這種由存儲單位引起的節基址差叫做節偏移

.text節偏移=0x1000-0x400=0xc00
.rdata節偏移=0x7000-0x6200=0xE00
.data節偏移=0x9000-0x7400=0x1C00
節偏移=相對虛擬偏移量RVA-文件偏移量
文件偏移地址=虛擬內存地址(VA)-裝載基址(IB)-節偏移=RVA-節偏移

三、必備工具及簡單操作

1. OllyDbg

OllyDbg是一個集成了反匯編分析、十六進制編輯、動態調試等多種功能於一身的功能強大的調試器。

主界面共有五個窗口:

  • 反匯編窗口:顯示被調試程序的反匯編代碼,標題欄上的地址、HEX數據、反匯編、注釋可以通過在【窗口中右擊出現的菜單界面選項->隱藏標題或顯示標題來進行切換是否顯示。用鼠標左鍵點擊注釋標簽可以切換注釋顯示的方式。】
  • 寄存器窗口:顯示當前所選線程的CPU寄存器內容。同樣點擊標簽寄存器(FPU)可以切換顯示寄存器的方式。
  • 信息窗口:顯示反匯編窗口中選中的第一個命令的參數及一些跳轉目標地址、字串等。
  • 數據窗口:顯示內存或文件的內容。右鍵菜單可用於切換顯示方式。
  • 堆棧窗口:顯示當前線程的堆棧。

主要的快捷鍵:

  • F8:單步執行(Stepover),跳過函數
  • F7:單步執行(Step in),跟入函數
  • F2:按一下設置斷點,再按一下取消斷點
  • F4:執行到當前光標所選中的指令,可以在遇到循環的時候按下達到一直執行到循環結束后的指令的效果
  • F9:運行程序直到遇到斷點
  • Ctrl+G:查看任意位置的數據

2. IDA Pro

IDA Pro是一款反匯編的軟件,在大多數情況下用於靜態反匯編。
它可以對代碼單元進行標注。使用IDA對函數進行標注和注解可以做到全文交叉調用,能夠自動識別出系統調用。並且,目前的IDA可以用圖形的方式顯示出一個函數內部的執行流程,在反匯編界面中按空格鍵進行匯編代碼和圖形顯示兩種模式的切換。

3. Ultra Edit

Ultra Edit是IDM Computer Solutions公司出品的著名文本編輯器。 這款功能強大的文本編輯器,可以編輯文字、Hex、ASCII碼,可以取代記事本,內建英文單字檢查、C++ 、Java、HTML、VB等多種語言的指令突顯,可同時編輯多個文件,而且即使開啟很大的文件速度也不會慢。

4. Lord PE

Lord PE是一款強大的可執行文件分析輔助脫殼工具,附帶16進制編輯器.不包括反匯編模塊。字啊本次學習中,我們用它來查找虛擬內存地址和文件偏移地址來進行地址轉換。

四、crack實驗

本實驗的目的是通過應用剛才介紹的工具來破解程序的密碼。

首先我們看一下源碼:

	#include <stdio.h>
	#define PASSWORD "1234567"
	int verify_password (char *password)
	{
		int authenticated;
		authenticated=strcmp(password,PASSWORD);
		return authenticated;
	}

	main()
	{
		int valid_flag=0;
		char password[1024];
		while(1)
		{
			printf("please input password:       ");
			scanf("%s",password);
			valid_flag = verify_password(password);
			if(valid_flag)
			{
				printf("incorrect password!\n\n");
			}
			else
			{
				printf("Congratulation! You have passed the verification!\n");
				break;
			}
		}
	}

功能是一個密碼的驗證。我們必須輸入正確的密碼“1234567”時,才能得以確定成功,跳出循環,否則會一直提示密碼錯誤請求再次輸入。

step1:用IDA,查找跳轉指令的內存地址

  • 打開IDA,將在vc6.0下已經得到的exe文件再用IDA打開,按下F12輸出更加詳細的流程圖:

  • 從流程圖可以清晰地看到,if語句的分支語句為"jz short"。

  • 按下空格鍵切換到匯編指令界面,即可找到該語句所在的內存地址,即在.text節0x004010D5,如下圖所示:

step2:用ollydbg,在內存中修改程序

  • 關閉IDA,用ollydbg打開crack.exe文件
  • 按Ctrl+G,輸入0x004010D5,找到關鍵指令

  • 選中指令,按下F2設置斷點,可以看到該行內存地址變紅
  • 按F9執行,打開命令調試行,輸入一個錯誤的密碼,再按F9運行程序,會發現提示“跳轉未實現”,如下圖:

  • 雙擊jz,修改jz為jnz,點擊assemble寫入內存,如圖:

  • 此時,可以看到原來內存中的機器碼從74也變到了75。
    step3:用LordPE,查看PE節信息

  • 用LordPE打開.exe文件,查看文件節信息

  • 根據公式:文件偏移地址=VA-IB-節偏移=0x004010D5-0x00400000-(0x00001000-0x00001000)=0x10D5,也就是說這條指令在PE文件中位於距離文件開頭10D5字節的地方。

step4:用Ultra,修改.exe文件的十六進制代碼

  • 用UEdit打開crack.exe文件,用快捷鍵ctrl+G,輸入0x10D5直接跳到JE指令處,將下圖中的74(JE)改為75(JNE),保存后可重新執行文件。

  • 打開VC,重新運行文件,可以發現輸入正確密碼,反而提示密碼錯誤:

回顧整個實驗,其實我們就是將整個程序的邏輯反了過來。將機器代碼修改從JE修改為JNE,把邏輯變成非0則進行跳轉。因此,輸入正確密碼判斷為0,當然會提示密碼錯誤啦!

本博客主要記錄了學習0day的一些准備工具,以及一個小實驗來感受一下突然接觸這么多陌生的工具具體應該怎么使用。最后的一個小實驗還是很有趣的,應該是第一次接觸通過這樣的方式來修改匯編代碼,從而達到繞過驗證,成功攻擊的目的。希望之后可以利用好這些工具,順利學習下去吧!

參考文獻:
[1]王清.《0day安全:軟件漏洞分析技術》[M].中國:電子工業出版社,2008.
[2]王清.《0day安全:軟件漏洞分析技術(第2版)》[M].中國:電子工業出版社,2011.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM