逆向與反匯編工具


http://blog.163.com/shanshenye2k@yeah/blog/static/823405412012930555115/

 

第 1 章           逆向與反匯編工具

了解反匯編的一些背景知識后,再深入學習IDA Pro之前,介紹其他一些用於二進制文件的逆向工程工具,會對我們學習有所幫助。這些工具大多在IDA之前發布,並且仍然可用於快速分析二進制文件,以及審查IDA的分析結果。如我們所見,IDA將這些工具的諸多功能整合到它的用戶界面中,為逆向工程提供了一個集成環境。最后,盡管IDA確實包含一個集成調試器,在這里我們不會討論,因為在第24、25和26章專門討論這個主題。

1.1     分類工具

通常,第一次面對一個未知文件時,有必要問一些簡單問題是有益的,如“這是個什么東西?”回答這個問題的首要原則,是不要依賴文件擴展名來確定文件的類型。這是最基本的原則。在腦子里建立起“文件擴展名並無實際意義”的印象后,你就會開始考慮學習下面幾個實用工具。

1.1.1    file

file命令是一個標准的實用工具,大多數*NIX風格的操作系統和Windows下的Cygwin[1]或MinGW[2]工具都帶有這個實用工具。file試圖通過檢查文件中某些特定字段來確定文件類型。在某些情況下,file能夠識別常見的字符串,如#!/bin/sh(shell腳本文件)或<html>(HTML文檔)。但是,識別那些包含非ASCII內容的文件要困難得多,在這種情況下,file會設法判斷,該文件的結構是否符合某種已知的文件格式。多數情況下,它會搜索某些文件類型所特有的標簽值(通常稱為幻數[3])。下面的十六進制表列出了幾個用於判斷常見文件類型的幻數。

Windows PE executable file

00000000      4D 5A 90 00 03 00 00 00  04 00 00 00 FF FF 00 00   MZ..............

00000010 B8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......

Jpeg image file

00000000 FF D8 FF E0 00 10 4A 46  49 46 00 01 01 01 00 60   ......JFIF.....`

00000010 00 60 00 00 FF DB 00 43  00 0A 07 07 08 07 06 0A   .`.....C........

Java .class file

00000000 CA FE BA BE 00 00 00 32  00 98 0A 00 2E 00 3E 08   .......2......>.

00000010 00 3F 09 00 40 00 41 08  00 42 0A 00 43 00 44 0A   .?..@.A..B..C.D.

file具有識別大量的文件格式的能力,包括多種類型的ASCIl文本文件、可執行文件和數據文件格式。file執行的幻數檢查由幻數文件(magic file)所包含的規則控制。幻數文件的默認位置因操作系統而異,常見的位置包包/usr/share/file/magic、/usr/share/misc/magic和/edt/magic。關於幻數文件更多的信息,請參閱file的文擋資料。

 

CYGWIN環境

Cygwin是Windows操作系統中的一組實用工具,可提供Linux風格的命令行解釋器(command shell)和相關程序。在安裝過程中,有大量安裝包可供用戶選擇,包括編譯器(gcc、g++);解釋器(Perl、Python、Ruby);網絡實用工具(nc、ssh)等等。Cygwin安裝完畢,許多為Linux編寫的程序就可以在Windows系統中編譯和執行。

在某些情況下,file還能夠辨別某一指定文件類型中的細微變化。以下列表證實了file不僅能夠識別幾種不同的ELF二進制文件,而且還提供了有關二進制文件如何鏈接(靜態或動態)以及是否去除了符號等信息。

idabook#  file ch2_ex_*

ch2_ex.exe:          MS-DOS executable PE for MS Windows (console)

Intel 80386 32-bit

ch2_ex_upx.exe:      MS-DOS executable PE for MS Windows (console)

Intel 80386 32-bit, UPX compressed

ch2_ex_freebsd:      ELF 32-bit LSB executable, Intel 80386,

version 1 (FreeBSD), for FreeBSD 5.4,

dynamically linked (uses shared libs),

FreeBSD-style, not stripped

ch2_ex_freebsd_static:    ELF 32-bit LSB executable, Intel 80386,

version 1 (FreeBSD), for FreeBSD 5.4,

statically linked, FreeBSD-style, not stripped

ch2_ex_freebsd_static_strip: ELF 32-bit LSB executable, Intel 80386,

version 1 (FreeBSD), for FreeBSD 5.4,

statically linked, FreeBSD-style, stripped

ch2_ex_linux:        ELF 32-bit LSB executable, Intel 80386,

version 1 (SYSV), for GNU/Linux 2.6.9,

dynamically linked (uses shared libs),

not stripped

ch2_ex_linux_static:      ELF 32-bit LSB executable, Intel 80386,

version 1 (SYSV), for GNU/Linux 2.6.9,

statically linked, not stripped

ch2_ex_linux_static_strip:    ELF 32-bit LSB executable, Intel 80386,

version 1 (SYSV), for GNU/Linux 2.6.9,

statically  linked, stripped

ch2_ex_linux_stripped:    ELF 32-bit LSB executable, Intel 80386,

version 1 (SYSV), for GNU/Linux 2.6.9,

dynamically linked (uses shared libs), stripped

file及類似的實用工具同樣也會出錯。如果一個文件包含某些文件格式的標志,這些工具很可能會產生誤判。你可以使用一個十六進制文件編輯器將任何文件的前4個字節修改為Java的幻數序列:CA FE BA BE,自己證實一下上述情況。這時,file會將這個新修改的文件錯誤地識別為“已編譯的Java類數據”。同樣,一個只包含MZ這兩個字符的文本文件會被誤認為是一個MS-DOS可執行文件。在逆向工程過程中,一個良好的習慣是,絕不要完全相信任何工具所提供的結果,除非該結果得到其他幾款工具和手動分析的確認。

 

1.1.2    PE Tools

PE Tools[4]是一個實用工具的集合,用於分析Windows系統中正在運行的進程和可執行文件。PE Tools的主界面如圖2-1所示,其中列出了所有活動進程,並提供所有的PE Tools實用工具。

 

圖2-1:PE Tools實用程序

 

二進制文件的模糊處理

模 糊是指任何企圖掩蓋真正意義上的東西。當應用到可執行文件,模糊是指任何試圖隱藏程序的真實行為。有許多原因可以讓程序員對程序采用模糊處理。普遍引用的 例子包括:保護專有算法和模糊惡意意圖。幾乎所有惡意軟件的形式利用模糊處理,以阻礙對其進行分析。有大量模糊工具可供程序員使用,幫助他們創建模糊程 序。模糊處理工具和技術,以及對逆向工程過程的相關影響,將在第21章中進一步討論。

在進程列表中,用戶可以將進程的內存映像轉儲到某個文件,或利用PE Sniffer實用工具確定可執行文件由何種編譯器構建,或者該文件是否經過某種已知的模糊處理實用工具處理。Tools菜單提供了磁盤文件分析的類似選項。另外,用戶還可以使用內嵌的PE Editor實用工具查看PE文件頭字段,使用該工具可以方便修改任何文件頭的值。通常,如果想要從一個文件的模糊版本重建一個有效的PE,就需要修改PE文件頭。

1.1.3    PEiD

PEiD[5]是另一款Windows工具,它主要用於識別構建某一特定Windows PE二進制文件所使用的編譯器,並確定任何用於模糊Windows PE二進制文件的工具。圖2-2顯示了如何使用PEiD確定模糊Gaobot[6]蠕蟲的一個變種所使用的工具(此例中為ASPack)。

 

圖2-2:PEiD實用工具

PEiD的許多其他功能與PETools的功能相同,包括顯示PE文件頭信息摘要、收集有關正在運行的進程的信息、執行基本的反匯編等。

1.2     摘要工具

由 於我們的目標是對二進制程序文件進行逆向工程,因此,在對文件進行初步分類后,需要用更高級的工具來提取詳盡的信息。本節討論的工具不只能識別它們所處理 的文件的格式,更重要的是還能夠理解某一特定的文件格式,並且能夠解析它們的輸入文件,提取出這些輸入文件所包含的非常特別的信息。

1.2.1    nm

當源文件編譯為目標文件,編譯器必須嵌入一些全局(外部)符號的位置信息,以便鏈接器在組合目標文件以創建可執行文件時,能夠解析對這些符號的引用。除非被告知要去除最終的可執行文件中的符號,否則,鏈接器通常會將目標文件中的符號帶入最終的可執行文件中。根據nm手冊的描述,這一實用工具的目的是“列舉目標文件中的符號”。

使用nm檢查中間目標文件(擴展名為.o的文件,而非可執行文件)時,默認輸出結果是在這個文件中聲明的任何函數和全局變量的名稱。nm實用工具的樣本輸出如下所示:

idabook# gcc -c ch2_example.c

idabook# nm ch2_example.o

U __stderrp

U exit

U fprintf

00000038 T get_max

00000000 t hidden

00000088 T main

00000000 D my_initialized_global

00000004 C my_unitialized_global

U printf

U rand

U scanf

U srand

U time

00000010 T usage idabook#

從中可以看到,nm列出了每個符號以及與符號有關的一些信息。其中的字母表示所列舉符號的類型。這里我們解釋前面的例子中出現了以下字母代碼:

? U——未定義符號,通常為外部符號引用。

? T——在文本部分定義的符號,通常為函數名稱。

? t——在文本部分定義的局部符號。在C程序中,這個符號通常等同於一個靜態函數。

? D——已初始化的數據值。

? C——未初始化的數據值。

注:大寫字母表示全局符號,小寫字母則表示局部符號。請參閱nm手冊了解有關字母代碼的詳細解釋。

使用nm列舉可執行文件中的符號,會有更多信息顯示出來。在鏈接過程中,符號被解析成虛擬地址(如有可能)。因此,這時運行nm,將可獲得更多信息。下面是使用nm處理一個可執行文件得到的部分輸出:

idabook# gcc -o ch2_example ch2_example.c

idabook# nm ch2_example

<.  . .>

U exit

U fprintf

080485c0 t frame_dummy

08048644 T  get_max

0804860c t hidden

08048694 T  main

0804997c D  my_initialized_global

08049a9c B my_unitialized_global

08049a80 b object.2

08049978 d p.0

U printf

U rand

U scanf

U srand

U time

0804861c T usage

idabook#

在這個例子中,一些符號(如main)分配了虛擬地址,鏈接過程引入了一些新的符號(如frame_dummy),另一些符號(如my_unitialized_global)的類型發生了改變,其他符號由於繼續引用外部符號,仍舊為未定義符號。在這個特例中,我們檢測的文件屬於動態鏈接二進制文件,為此,未定義的符號將在C語言共享庫中定義。要了解更多有關nm的信息,請參閱nm手冊。

1.2.2    ldd

創建可執行文件時,必須解析該文件引用的任何庫函數的地址。鏈接器通過兩種方法解析對庫函數的調用:靜態鏈接(static linking)和動態鏈接(dynamic linking)。鏈接器的命令行參數決定具體使用哪一種方法。一個可執行文件可能為靜態鏈接、動態鏈接,或二者兼而有之[7]

要求靜態鏈接時,鏈接器會將程序的目標文件和所需的庫文件組合起來,生成一個可執行文件。這樣,在運行時就不需要確定庫代碼的位置,因為它已經包含在可執行文件中。靜態鏈接的優點:(1)函數調用速度會更快些;(2)發布二進制文件更容易,因為不需要對用戶系統中庫函數的可用性做出任何假設。缺點包括:(1)生成的可執行文件較大;(2)如果庫組件發生改變,對程序進行升級會更加困難,因為一旦庫發生變化,程序就必須重新鏈接。從逆向工程的角度看,靜態鏈接使問題更加復雜。在分析一個靜態鏈接二進制文件時,要回答“這個二進制文件鏈接了哪些庫”,可不是那么容易。我們將在第12章討論在對靜態鏈接代碼進行逆向工程時遇到的挑戰。

動態鏈接與靜態鏈接不同。使用動態鏈接時,鏈接器不需要復制它需要的任何庫。相反,鏈接器只需將對所需庫(通常為.so或.dl文 件)的引用插入到最終的可執行文件中。因此,生成的可執行文件也會更小些。而且,使用動態鏈按時升級庫代碼也變得簡單多了,因為只需要維護一個庫(被許多 二進制文件引用)。如果需要升級庫代碼,用新版本的庫替換過時的庫,就可以立即更新每一個引用該庫的二進制文件。使用動態鏈接的一個缺點是,它需要更復雜 的加載過程。因為這時必須定位所有所需的庫,並將其加載到內存中,而不是加載一個包含全部庫代碼的靜態鏈接文件。動態鏈接的另一個缺點,是供應商不僅需要 發布他們自己的可執行文件,而且必須發布該文件所需的所有庫文件。如果一個系統無法提供程序所需的全部庫文件,在這個系統上運行該程序將會導致錯誤。

下面的輸出說明了一個程序的動態和靜態鏈接版本的創建過程、生成的二進制文件的大小,以及如何使用file工具識別這兩個程序:

idabook# gcc -o ch2_example_dynamic ch2_example.c

idabook# gcc -o ch2_example_static ch2_example.c --static

idabook# ls  -l ch2_example_*

-rwxr-xr-x    1 root  wheel    6017 Sep 26 11:24 ch2_example_dynamic

-rwxr-xr-x    1 root  wheel  167987 Sep 26 11:23 ch2_example_static

idabook#  file ch2_example_*

ch2_example_dynamic: ELF 32-bit LSB executable, Intel 80386, version 1

(FreeBSD), dynamically linked (uses shared libs), not stripped

ch2_example_static:  ELF 32-bit LSB executable, Intel 80386, version 1

(FreeBSD), statically linked, not stripped

idabook#

為了確保動態鏈接正常運行,動態鏈接二進制文件必須指明它需要的庫文件,以及需要這些文件中的哪些特定資源。因此,與靜態鏈接二進制文件不同,我們可輕易確定一個動態鏈接二進制文件所依賴的庫文件。ldd (list dynamic dependencies) 是一個簡單的實用工具,可用來列舉任何可執行文件所需的動態庫。在下面這個例子中,我們使用ldd確定Apache Web服務器所依賴的庫:

idabook#  ldd /usr/local/sbin/httpd

/usr/local/sbin/httpd:

libm.so.4 => /lib/libm.so.4  (0x280c5000)

libaprutil-1.so.2 => /usr/local/lib/libaprutil-1.so.2 (0x280db000)

libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x280ef000)

libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x2810d000)

libapr-1.so.2 => /usr/local/lib/libapr-1.so.2 (0x281fa000)

libcrypt.so.3 => /lib/libcrypt.so.3 (0x2821a000)

libpthread.so.2 => /lib/libpthread.so.2 (0x28232000)

libc.so.6 => /lib/libc.so.6  (0x28257000)

idabook#

ldd實用工具可用於Linux和BSD系統。在OS X系統上,使用otool工具,並帶上-L選項(otool -L 文件名),即可實現類似的功能。在Windows系統中,可以使用Visual Studio工具套件中的實用工具dumpbin列舉某文件所依賴的庫,形式為:dumpbin /dependents 文件名。

1.2.3    objdump

ldd相當專業,而objdump非常靈活。objdump的主要目的是“顯示目標文件中的信息。”[8]。這是一個相當廣泛的目標,objdump為此提供了大量命令行選項(超過30個),以提取目標文件中的各種信息。objdump可用於顯示以下與目標文件相關的數據(以及其他更多信息):

節頭(Section headers)

在程序文件中的每一節的摘要信息。

私有頭(Private headers)

程序存儲器的布局信息以及運行時加載器所需的其他信息,包括由ldd等工具生成的庫列表。

調試信息(Debugging information)

提取出嵌入在程序文件中的任何調試信息。

符號信息(Symbol information)

以類似nm的方式轉儲符號表信息。

反匯編列表(Disassembly listing)

objdump對文件中標記為代碼的部分執行線性掃描反匯編。反匯編x86代碼時,objdump可以生成AT&T或Intel語法,並可以將反匯編代碼保存在文本文件中。這樣的文本文件叫做反匯編完全列表(dead listing),盡管這些文件可用於實施逆向工程,但它們很難有效導航,也無法以一致且無錯的方式修改。

objdump是GNU binutils[9]工具套件的一部分,用戶可以在Linux、FreeBSD和Windows(通過Cygwin)系統中找到這個工具。objdump依靠二進制文件描述符庫libbfd(二進制工具的一個組件)來訪問目標文件,因此,它能夠解析libbfd支持的文件格式(ELF、PE等)。另外,一個名為readelf的實用工具也可用於解析ELF文件。readelf的大多數功能與objdump相同,它們之間的主要區別在於:readelf並不依賴libbfd。

1.2.4    otool

otool可用於解析與OS X Mach-O二進制文件有關的信息,因此,可簡單將其描述為:OS X系統下的類似於objdump的實用工具。下面的代碼說明了如何使用otool顯示一個Mach-O二進制文件的動態庫依賴關系,從而執行類似於ldd的功能。

idabook# file osx_example

osx_example: Mach-O executable ppc

idabook# otool -L osx_example

osx_example:

/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)

/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.1.5)

otool可用於顯示與文件的頭和符號表有關的信息,並對文件的代碼部分進行反匯編。了解更多有關otool功能的信息,請參閱相關手冊。

1.2.5    dumpbin

dumpbin是微軟Visual Studio工具套件中的一個命令行實用工具。與otool和objdump一樣,dumpbin可以顯示大量與Windows PE文件有關的信息。下面的例子說明了如何使用dumpbin以類似於ldd的方式顯示Windows計算器程序的動態依賴關系。

$ dumpbin /dependents calc.exe

Microsoft (R) COFF/PE Dumper Version 8.00.50727.762

Copyright (C) Microsoft Corporation. All rights reserved.

Dump of file calc.exe

File Type: EXECUTABLE IMAGE

Image has the following dependencies:

SHELL32.dll

msvcrt.dll

ADVAPI32.dll

KERNEL32.dll

GDI32.dll

USER32.dll

dumpbin的其他選項可從PE二進制文件的各個部分提取信息,包括符號、導入的函數名、導出的函數名和反匯編代碼。要了解更多有關如何使用dumpbin的信息,請訪問Mircrosoft Developer Network(MSDN)[10]

1.2.6    c++filt

由於每個重載函數都使用與原函數相同的名稱,因此,支持函數重載的語言必須擁有一種機制,以區分同一個函數的許多重載版本。下面的C++實例展示了一個名為demo的函數的幾個重載版本的原型:

void demo(void);

void demo(int x);

void demo(double x);

void demo(int x, double y);

void demo(double x, int y);

void demo(char* str);

作為一般原則,一個目標文件中不可能有兩個名稱相同的函數。為允許重載,編譯器將描述函數參數類型的信息合並到函數的原始名稱中,生成重載函數的唯一名稱。為名稱完全相同的函數生成唯一名稱的過程稱為名稱修飾(name mangling)。如果使用nm轉儲前面的C++代碼的已編譯版本中的符號,將得到如下結果(在demo版本的過濾焦點):

idabook# g++ -o cpp_test cpp_test.cpp

idabook# nm cpp_test | grep demo

0804843c T _Z4demoPc

08048400 T _Z4demod

08048428 T _Z4demodi

080483fa T _Z4demoi

08048414 T _Z4demoid

080483f4 T _Z4demov

C++標准沒有為名稱改編方案制定標准,因此,編譯器設計人員必須自己制定標准。為了譯解上面列出的demo函數的重載版本,我們需要一個能夠理解編譯器(這里為g++)的名稱改編方案的工具,c++filt正是這樣一個實用工具。c++filt將每個輸入的名稱看成是改編后的名稱(mangled name)[11],並設法確定用於生成該名稱的編譯器。如果這個名稱是一個合法的改編名稱,那么,c++filt就輸出改編之前的名稱; 如果c++filt無法識別一個改編名稱,那它就按原樣輸出該名稱。

如果柴將上面nm輸出的結果交給c++filt處理,它可以得到這些函數的原始名稱,如下所示:

idabook# nm cpp_test | grep demo | c++filt

0804843c T demo(char*)

08048400 T demo(double)

08048428 T demo(double, int)

080483fa T demo(int)

08048414 T demo(int, double)

080483f4 T demo()

值得注意的是,改編名稱可能包含其他與函數有關的信息,正常情況下,nm無法顯示這些信息。在逆向工程過程中,這些信息可能非常重要。在更復雜的情況下,這些附加信息中可能還包含與類名稱或函數調用約定有關的信息。

1.3     深度檢測工具

到目前為止,我們已經討論了一些工具,利用這些工具,可以在對文件的內部結構知之甚少的情況下對文件進行粗略分析,也可以在深入了解文件的結構之后,從文件中提取出特定的信息。在本節中,我們將介紹一些專用於從任何格式的文件中提取出特定信息的工具。

1.3.1    strings

有 時候,提出一些與文件內容有關的常規性問題,即那些不需要了解文件結構即可回答的問題,對我們會有一定幫助。例如:“這個文件包含任何嵌入的字符串嗎?” 當然,在回答這個問題之前,必須先回答這個問題:“究竟是什么構成一個字符串?” 我們將字符串簡單定義為由可打印字符組成的連續字符序列。通常,在這一定義的基礎上,還需要指定一個最小長度和一個特定的字符集。因此,可以搜索至少包含4個連續可打印ASCII字符的字符串,並將結果在控制台打印出來。搜索這類字符串一般不會受到文件結構的限制。在ELF二進制文件中搜索字符串就像在微軟Word文擋中搜索字符串一樣簡單。

strings實用工具專門用於提取文件中的字符串內容,通常,使用該工具不會受到文件格式的限制。使用strings的默認設置(至少包含4個字符的7位ASCII序列),可得到以下結果:

idabook# strings ch2_example

/lib/ld-linux.so.2

gmon_start

libc.so.6

_IO_stdin_used

exit

srand

puts

time

printf

stderr

fwrite

scanf

libc_start_main

GLIBC_2.0

PTRh

[^_]

usage: ch2_example [max]

A  simple guessing game!

Please guess a number between 1 and %d.

Invalid input, quitting!

Congratulations, you got it in %d attempt(s)!

Sorry too low, please try again

Sorry too high, please try again

不過,我們發現,一些字符串看起來像程序輸出,一些字符串則像函數名稱或庫名稱。因此,絕不能只根據這些字符串來斷定程序的功能。分析人員往往會掉入陷阱,根據strings的輸出來推斷程序的功能。需要記住的是:二進制文件中包含某個字符串,並不表示該文件會以某種方式使用這個字符串。

下面是使用strings時需要注意的事項:

? 請記住:使用strings處理可執行文件時,默認情況下,strings只掃描文件中可加載的、經初始化的部分。使用命令行參數-a可迫使strings掃描整個文件。

? strings不指出字符串在文件中的位置。使用-t命令行參數可使strings顯示所發現的每一個字符串的文件偏移量信息。

? 許多文件使用了其他字符集。利用-e命令行參數可使strings搜索更廣泛的字符,如16位Unicode字符。

1.3.2     反匯編器

如前所述,有很多工具都可以生成二進制目標文件的完全列表形式的反匯編。PE、ELF和MACH-O文件分別使用dumpbin、objdump和otool進行反匯編。但是,它們中任何一個都無法處理任意格式的二進制文件。有時候,你會遇到一些並不采用常用文件格式的二進制文件,在這種情況下,你就需要一些能夠從用戶指定的偏移量開始反匯編過程的工具。

兩個用於x86指令集流式反匯編器:ndisasm和diStorm[12]。ndisasm是包含在Netwide Assembler(NASM)[13]中的一個實用程序。下面的例子說明了如何使用ndisasm反匯編一段由Metasploit框架[14]生成的shellcode:

idabook#  ./msfpayload linux/x86/shell_findport CPORT=4444   R  > fs

idabook#  ls  -l fs

-rw-r--r-- 1 ida  ida  62 Dec  11 15:49 fs

idabook#  ndisasm  -u fs

00000000  31D2       xor  edx,edx

00000002  52             push edx

00000003  89E5       mov  ebp,esp

00000005  6A07       push byte  +0x7

00000007  5B              pop ebx

00000008  6A10       push byte  +0x10

0000000A  54             push esp

0000000B  55             push ebp

0000000C  52             push edx

0000000D  89E1       mov  ecx,esp

0000000F  FF01       inc  dword [ecx]

00000011  6A66       push byte  +0x66

00000013  58              pop eax

00000014  CD80       int 0x80

00000016  66817D02115C    cmp  word [ebp+0x2],0x5c11

0000001C  75F1       jnz  0xf

0000001E  5B             pop ebx

0000001F  6A02       push byte  +0x2

00000021  59             pop ecx

00000022  B03F       mov  al,0x3f

00000024  CD80       int 0x80

00000026  49              dec ecx

00000027  79F9       jns  0x22

00000029  52              push edx

0000002A  682F2F7368      push dword 0x68732f2f

0000002F  682F62696E      push dword 0x6e69622f

00000034  89E3       mov  ebx,esp

00000036  52              push edx

00000037  53             push ebx

00000038  89E1       mov  ecx,esp

0000003A  B00B       mov  al,0xb

0000003C  CD80       int 0x80

由於流式反匯編非常靈活,因此它的用途相當廣泛。例如,在分析網絡數據包中可能包含shellcode的計算機網絡攻擊時,就可采用流式反匯編器來反匯編數據包中包含shellcode的部分,分析惡意負載的行為。另外一種情況是分析那些格式未知的ROM鏡像。ROM中有些部分是數據,其他部分則為代碼,可以使用流式反匯編器來反匯編鏡像中的代碼。

1.4     小結

本章所討論的工具不一定是同類中最好的,但它們是從事二進制文件逆向工程的分析人員常用的工具。更重要的是,這些工具大大促進了IDA的開發過程。在接下來的幾章中,我們還會討論這些工具。掌握這些工具可為你了解IDA的用戶界面以及它顯示的許多信息提供極大幫助。

 


[1] 請參閱http://www.cygwin.com/。

[2] 請參閱http://www.mingw.org/。

[3] 幻數是一些文件格式規范所要求的特殊標簽值,它表示文件符合這種規范。有時,人們在選擇幻數時加入了幽默的因素。例如,MS-DOS的可執行文件頭中的MZ標簽是MS-DOS原架構師Mark Zbikwsk姓名的首字母縮寫。眾所周知,Java的.class文件的幻數為十六進制數0xcafebabe,選擇它作為幻數,僅僅是因為它是一個容易記憶的十六進制數字符串。

[4] 請參閱http://petools.org.ru/petools.shtml。

[5]請參閱http://peid.info/。

[6]請參閱http://securityresponse.symantec.com/security_response/writeup.jsp?docid=2003-112112-1102-99。

[7]有關鏈接的更多信息,請參閱John R. Levine所著的《Linkers and Loaders》(San Francisco: Morgan Kaufmann, 2000)。

[8] 請參閱http://www.sourceware.org/binutils/docs/binutils/objdump.html#objdump/。

[9] 請參閱http://www.gnu.org/software/binutils/。

[10]請參閱http://msdn.microsoft.com/en-us/library/c1h23y6c(VS.71).aspx。

[11]有關名稱改編的概述,請參考http://en.wikipedia.org/wiki/Name_mangling。

[12]請參閱http://www.ragestorm.net/distorm/。

[13]請參閱http://nasm.sourceforge.net/。

[14]請參閱http://www.metasploit.com/。


免責聲明!

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



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