軟體逆向工程學習(一)

2021-07-04 17:05:51 字數 2908 閱讀 4119

本專題學習軟體逆向的基本原理、方法,並針對具體案例進行逆向分析,從而學習一套完整、系統的軟體逆向的方法並獲取相關經驗。

ollydbg:常用於動態除錯程式,無法除錯核心,ui功能強大。

softice:工作在ring0態的偵錯程式,常用於除錯驅動程式,功能強大的命令列工具。

windbg:介於上兩者之間的偵錯程式,具有圖形介面,除錯主要通過命令來進行。

ida pro:反彙編軟體,用於靜態反彙編,帶有較弱的動態除錯功能。

ultraedit:16進製制編輯器,可用於直接修改可執行檔案,也可用於常見語言的變成工作。

虛擬機器:防止被除錯程式破壞物理機的核心及作業系統。

為了說明上述軟體的作用,我們以乙個簡單的程式為例,來展示逆向中的反彙編**並分析。

程式使用vc6.0編譯生成,c程式原始檔如下:

#include 

#define password "1234567"

int verify_password (char *password)

main()

else

}}

我們的目標是通過修改程式本身,實現在不知道密碼的情況下獲得密碼正確的提示。

使用ida pro對程式進行反彙編,我可以找到編譯生成的彙編**中,main函式的部分如下:

.text:

00401000 sub_401000 proc near ; code xref: _main+24p

.text:

00401000

.text:

00401000 arg_0 = dword ptr 4

.text:

00401000

.text:

00401000

mov eax, [esp+arg_0]

.text:

00401004

push ebx

.text:

00401005

push esi

.text:

00401006

mov esi, offset a1234567 ; "1234567"

.text:

0040100b

.text:

0040100b loc_40100b: ; code xref: sub_401000+2dj

.text:

0040100b mov dl, [eax]

.text:

0040100d mov bl, [esi]

.text:

0040100f mov cl, dl

.text:

00401011 cmp dl, bl

.text:

00401013 jnz short loc_401034 #if(valid_flag) jump

.text:

00401015 test cl, cl

.text:

00401017 jz short loc_40102f

.text:

00401019

mov dl, [eax+1]

.text:

0040101c mov bl, [esi+1]

.text:

0040101f mov cl, dl

.text:

00401021 cmp dl, bl

.text:

00401023 jnz short loc_401034

.text:

00401025

add eax, 2

.text:

00401028

add esi, 2

.text:

0040102b test cl, cl

.text:

0040102d jnz short loc_40100b

.text:

0040102f

.text:

0040102f loc_40102f: ; code xref: sub_401000+17j

.text:

0040102f pop esi

.text:

00401030 xor eax, eax

.text:

00401032

pop ebx

.text:

00401033 retn

我們可以看到,if(valid_flag)一句在彙編**中的位置如標註所示,如果dlbl不相等,則跳轉至錯誤提示。因此,我們只需把jnz指令換成jz指令,即可達成目的。

最後,我們使用ultraedit修改可執行程式本身,從而永久保持這種任意密碼通過測試的效果。

在後續的學習中,我們還可以用其他方式來突破程式的驗證,如緩衝區溢位。本次學習到這裡就成功結束了。

逆向工程學習記錄

od基本指令 指令快捷鍵 含義restart ctrl f2 重新開始除錯 step info 單步步入 f7執行一句op code 操作碼 若遇到呼叫命令 call 將進入函式 內部 step over 單步步過 f8執行一句op code 操作碼 若遇到呼叫命令 call 將進入函式自身,不跟隨...

軟體工程學習筆記一

軟體工程學習筆記一 我很小的時候就有夢想,想要當乙個極為優秀的程式設計師,因為覺得程式設計師非常的酷 非常帥,能操縱虛擬的世界,執行如此完美的邏輯,並造福他人,是一種高尚有趣的職業。現在這種嚮往,並沒有因為外界的許多因素而改變。最近開始學習軟體工程,其實較早的時候就自學過,有許多知識都忘了,現在再正...

軟體工程學習筆記一

軟體工程學習筆記一 我很小的時候就有夢想,想要當乙個極為優秀的程式設計師,因為覺得程式設計師非常的酷 非常帥,能操縱虛擬的世界,執行如此完美的邏輯,並造福他人,是一種高尚有趣的職業。現在這種嚮往,並沒有因為外界的許多因素而改變。最近開始學習軟體工程,其實較早的時候就自學過,有許多知識都忘了,現在再正...