2.3 程序破解編程
20135318 劉浩晨編輯器
一、 掌握NOP、JNE、JE、JMP、CMP彙編指令的機器碼函數
NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)工具
JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)測試
JE:條件轉移指令,若是相等則跳轉。(機器碼:74)spa
JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB)段內直接近轉移Jmp near(機器碼:E9)段內間接轉移Jmp word(機器碼:FF)段間直接(遠)轉移Jmp far(機器碼:EA)3d
CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。
2、掌握反彙編與十六進制編程器orm
(1)經過反彙編求出登陸密碼htm
打開終端,輸入objdump –d name,找到main函數:blog
(objdump是gcc工具,用來查看編譯後目標文件的組成)
在main函數的彙編代碼中能夠看出程序在調用「scanf」函數請求輸入以後,對 [esp+0x1c] 和 [esp+0x18] 兩個內存單元的內容進行了比較,其做用應該是對比用戶輸入和預設口令。
esp+0x1c爲首地址被定義爲:0x963d3301
esp+0x18爲首地址被定義爲:0x00000000
若是從低地址往高地址連續的就是01 33 3d 96,即爲20135318(密碼)
(2)修改可執行文件,玩轉密碼登錄
實踐目的:無論密碼輸入正確與否均可以正常登錄。
代碼name.c:
運行測試:
使用objdump -d a.out查看main:
爲了跳過口令檢查,也就是不管比較的結果如何,都正常登錄。
jne是條件跳轉,若是條件知足,則跳轉到80484b7;
jne下兩行可知是輸出內容;
jmp是跳轉語句(沒有條件,則直接跳轉),直接跳到80484ca;
jmp下兩行也是輸出內容。
jne表示當比較不相等時,跳轉。也就是說,當輸入與已存口令不相等時,跳轉到jmp下一行mov(80484be),若是比較結果相等,則執行jne下兩行mov、callq行,說明,執行mov、callq行輸出的爲「OK!」。
如今能夠明確,須要修改紅線處,使其在比較結果不等時也跳轉到下一行。
因此,將0e改成00便可。
使用vi編輯器進入a.out,輸入:%!xxd
輸入/750e,找到其位置
將0e改成00:,而後輸入:%!xxd –r,保存退出。
再次查看main:
測試結果:(不管輸入什麼,都表示正確)
3、掌握可執行文件的基本格式
Linux可執行文件格式爲ELF即Executable and Linkable Format。
ELF格式:
ELF header
program header table
.txt .rodata .data
Section header table
詳細內容能夠見ELF文件格式分析。