逆向分析之路-從運算碼開始-08


範例二:「mov m8,r8」

  1. 打開Visual Studio使用C++並且輸入以下程式碼,設定中斷點進行驗證。

果然與原先設想的沒錯,只要是第一運算元是記憶體存取(其很自然第當然寫入8位元的資料,故稱m8),第二運算元是8位元一般暫存器,很正常地都是88開頭的運算碼,搭配記憶體 [eax] 00到 [edi] 07,但中間發生了什麼事,編碼怎麼跳開了?

原來,我們又忘了去查32位元定址的Mod R/M圖表,得知,[esp]與al交集在04,因為[–][–]與AL是記憶體定址,需查SIB,得出24

同樣地,第二條指令[ebp]只能查到符合[EBP]+disp8,並與al交集在45,disp8為00,沒用到比例變址,故不需查SIB。

  1. 那單純的88 04、88 05跑哪去了?還記得剛剛的16位元Mod R/M圖表嗎,我們有瞄到…

  1. 來驗證一下,打開Visual studio使用C++寫組合語言,並且輸入以下程式碼,設定中斷點進行驗證。因為我們要用到16位元的定址,這在內嵌組合語言裡面是不允許我們寫的。

找到88 0488 05了,只是前面多了67前置碼是因為在32位元環境跑16位元定址。不過那不打緊,因為我們只是要驗證暫存器對記憶體位址進行複製的動作會產生88開頭的運算碼,至於反向的部分倒是可以在內嵌組合語言的C++中自行驗證之間存在等價關係。

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料