本專題學習軟體逆向的基本原理、方法,並針對具體案例進行逆向分析,從而學習一套完整、系統的軟體逆向的方法並獲取相關經驗。
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)
一句在彙編**中的位置如標註所示,如果dl
和bl
不相等,則跳轉至錯誤提示。因此,我們只需把jnz
指令換成jz
指令,即可達成目的。
最後,我們使用ultraedit修改可執行程式本身,從而永久保持這種任意密碼通過測試的效果。
在後續的學習中,我們還可以用其他方式來突破程式的驗證,如緩衝區溢位。本次學習到這裡就成功結束了。
逆向工程學習記錄
od基本指令 指令快捷鍵 含義restart ctrl f2 重新開始除錯 step info 單步步入 f7執行一句op code 操作碼 若遇到呼叫命令 call 將進入函式 內部 step over 單步步過 f8執行一句op code 操作碼 若遇到呼叫命令 call 將進入函式自身,不跟隨...
軟體工程學習筆記一
軟體工程學習筆記一 我很小的時候就有夢想,想要當乙個極為優秀的程式設計師,因為覺得程式設計師非常的酷 非常帥,能操縱虛擬的世界,執行如此完美的邏輯,並造福他人,是一種高尚有趣的職業。現在這種嚮往,並沒有因為外界的許多因素而改變。最近開始學習軟體工程,其實較早的時候就自學過,有許多知識都忘了,現在再正...
軟體工程學習筆記一
軟體工程學習筆記一 我很小的時候就有夢想,想要當乙個極為優秀的程式設計師,因為覺得程式設計師非常的酷 非常帥,能操縱虛擬的世界,執行如此完美的邏輯,並造福他人,是一種高尚有趣的職業。現在這種嚮往,並沒有因為外界的許多因素而改變。最近開始學習軟體工程,其實較早的時候就自學過,有許多知識都忘了,現在再正...