20135327--實踐三

程序破解

 

一、     掌握NOP、JNE、JE、JMP、CMP彙編指令的機器碼編程

NOPNOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)編輯器

JNE條件轉移指令,若是不相等則跳轉。(機器碼:75)函數

JE條件轉移指令,若是相等則跳轉。(機器碼:74)工具

JMP無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)測試

CMP比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。 
2、掌握反彙編與十六進制編程器3d

(1)經過反彙編求出用戶名、密碼htm

打開終端,輸入objdump –d 01,找到main函數:blog

(objdump是gcc工具,用來查看編譯後目標文件的組成)內存

(此時使用的是實驗一的代碼,包含用戶名和密碼的輸入)get

在main函數的彙編代碼中能夠看出程序在調用「scanf」函數請求輸入以後,對 [rbp-0x20] 和 [rbp-0x10] 兩個內存單元的內容進行了比較,其做用應該是對比用戶輸入和預設口令。

esp+0x20爲首地址被定義爲:0x00746e6c

esp+0x10爲首地址被定義爲:0x00333231

若是從低地址往高地址連續的就是6c 6e 74 00 31 32 33 00

轉換爲字符表示爲lnt 123 (用戶名 密碼)

(2)修改可執行文件,玩轉密碼登錄

①無論輸入正確與否均可以正常登錄。

②無論輸入正確與否均可以不能夠正常登錄。

③輸入正確密碼不能登陸,輸入錯誤密碼可以登錄。

首先,從新編寫一個簡單的代碼11.c:

使用objdump –d 11查看main:

①爲了跳過口令檢查,也就是不管比較的結果如何,都正常登錄。

jne是條件跳轉,若是條件知足,則跳轉到4005e0;

jne下兩行可知是輸出內容;

jmp是跳轉語句(沒有條件,則直接跳轉),直接跳到4005f1;

jmp下兩行也是輸出內容。

jne表示當比較不相等時,跳轉。也就是說,當輸入與已存口令不相等時,跳轉到jmp下一行mov(4005e7),若是比較結果相等,則執行jne下兩行mov、callq行,說明,執行mov、callq行輸出的爲「right」。

如今能夠明確,須要修改紅線處,使其在比較結果不等時也跳轉到下一行。

因此,將0e改成00便可。

使用vi編輯器進入11,

輸入:%!xxd

 

輸入/750c

 

將0c改成00:,而後輸入:%!xxd –r

 

輸入:wq

使用objdump –d 11查看main:

 

測試結果:(不管輸入什麼,都表示正確)

②不能夠正常登錄,即須要無條件跳轉到錯誤的地方,無條件跳轉爲jmp,則同理須要將750c改爲eb0c.(eb爲無條件跳轉);

測試結果:(輸入正確,表示錯誤)

③同理若須要出現相反效果,即輸入正確密碼不能登陸,輸入錯誤密碼可以登錄。則須要將其改成740c。

測試結果:

相關文章
相關標籤/搜索