一、 掌握NOP、JNE、JE、JMP、CMP彙編指令的機器碼編程
NOP:NOP指令即「空指令」。執行到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。
測試結果: