--- title: 大同大學 惡意程式分析 W11 writeup tags: - Malware Analysis --- # 大同大學 惡意程式分析 W11 writeup ## X64 dbg 練習 **題目** :::info 利用 x64 dbg 修改密碼檢查後的判斷跳轉流程,讓使用者「不管輸入任何號碼」都會輸出【密碼正確】。 ::: 這隻程式會接受使用者一段字串作為密碼,接著彈出一個視窗,顯示是否密碼正確。那就可以簡單判斷程式碼可能會看到哪些東西: - `gets`(或其他讀取字串的函式) - 正確密碼 - `MessageBoxA` 先進 entry point 看看有沒有什麼可用的字串。很幸運的是密碼正確以及錯誤的字串。上面的 `369abc` 就很有可能是正確密碼可以試試看。 ![image](https://hackmd.io/_uploads/By50La6Mye.png) 跳過去發現那一坨剛號是一個函式就下個斷點。然後就直接 `F9` 過去看,中間也都剛好沒遇到什麼中斷。 ![image](https://hackmd.io/_uploads/r17Eupaz1x.png) 印出輸入提示跟讀取完字串後,可以看到程式呼叫 `strcspn`。 ![image](https://hackmd.io/_uploads/SkgsKTazye.png) 順順的往下檢查就會看到有一個 `jne` 會跳到密碼正確的地方,然後上面也有出現我輸入的 `aaaabbbbccccdddd` 跟之一開始看到的字串 `369abc`,就可以推測 `369abc` 就是正確密碼了。 那要改成無論輸入什麼字串都會【密碼正確】,就只要馬條件跳轉的 `jne` 改成無條件跳轉的 `jmp`(`\xEB`) 即可。 ![image](https://hackmd.io/_uploads/Skuc3aTMJg.png) 按 `F9` 繼續執行,就會得到以下結果。 ![image](https://hackmd.io/_uploads/B1KpnTpGyx.png) 當然輸入正確密碼也會是對的。 ![image](https://hackmd.io/_uploads/HkZ8a6pM1l.png) ## X64 dbg 練習 **題目** :::info 請找到 `HelloWorld.exe`「執行視窗跳出」的程式碼段。 - 不要用找MessageBoxAPI方式 - 不要用找字串的方式 ::: 可以直接用 `F8` 看看是哪個程式叫出視窗。可以看到 `EIP` 在一個 function call 停下了。 ![image](https://hackmd.io/_uploads/HyUdJA6Mkg.png) 接著 `F7` 進去就看到 `MessageBoxA` 的呼叫了。 ![image](https://hackmd.io/_uploads/H1ta10pzJg.png) ## Challenge 1 **題目** :::info 讓程式認為你有CD-ROM Drive ::: 密碼:`369abc` 這一提的關鍵在於 `GetDirveType` 的[回傳值](https://learn.microsoft.com/zh-tw/windows/win32/api/fileapi/nf-fileapi-getdrivetypea#return-value)。 ![image](https://hackmd.io/_uploads/BysufCaM1l.png) 我們只要在呼叫完 `GetDriveType` 後,可以嘗試先把 `EAX` 的值改成 `0x5`。 ![image](https://hackmd.io/_uploads/HyIJQCaMye.png) 也可以在跳轉前改一下 `ZF`。 ![image](https://hackmd.io/_uploads/S1_JVRafkl.png) ![image](https://hackmd.io/_uploads/H1TXEAaMJl.png) ## Challenge 2 **題目** :::info 請找出並輸入正確的「Name and Serial」 ::: 密碼:`GetDriveTypeA` 偷看一下下一關的密碼要求: > [!Tip] > 密碼就是在challenge02題目中輸入David時的Serial值(請注意大小寫) 所以就老老實實地在 Name 輸入 David 然後去找找看吧。 進入 Entry Point 後一樣先看看有沒有什麼可疑字串。 ![圖片](https://hackmd.io/_uploads/r1cJ-QLm1x.png) 然後我們就根據字串所在的位置快速定位可疑的位置。從字串 `"Congradulations!"` 定位過去後,可以看到前面有一個叫做 `__vbaVarTstEq` 的函式呼叫,很有可能就是字串比較的地方了。所以我就下斷點跑跑看。 在 `VarCmp` 的函式裡面的一段 `mov` 指令後看到了字串被引入進來,而且是在比較的函式裡面,所以很有可能就是 David 的正確密碼。 ![圖片](https://hackmd.io/_uploads/ryvFG7LmJe.png) ![圖片](https://hackmd.io/_uploads/BkthzmI71l.png) ## Challenge 3 **題目** :::info 按下「確定」後,不要出現錯誤(請不要變更程式任何機械碼) ::: 密碼:`A8C5DACD` 直接執行程式後,依據上面的提示他可能會是要開啟某個檔案,可以以此為方向找相關函式。 一進到 Entry Point 就在呼叫 CreateFile 前看到了一個檔案名稱 `abex.l2c`。先在相同目錄底下建立一個同檔名的檔案,然後繼續追蹤看看程式在幹嘛。 ![圖片](https://hackmd.io/_uploads/rytpQXLQkx.png) 在開啟檔案之後會用 `GetFileSize` 獲取檔案大小,若檔案大小等於 `0x12` 就會跳出成功的視窗。 ![圖片](https://hackmd.io/_uploads/Skl6NXU7kl.png) 可以透過修改 `ZF` 的值,讓他跳到成功的畫面。 ![圖片](https://hackmd.io/_uploads/r1LMB7I71g.png) 也可以直接在檔案裡寫 18(`0x12`) 的 `a`,使該檔案符合條件。 ![圖片](https://hackmd.io/_uploads/rkbb8XIXJx.png) ## Challenge 4 **題目** :::info 請輸入「Serial」,完成註冊動作 ::: 密碼:`abex.l2c18` 一樣先進 Entry Point 看看字串。 ![圖片](https://hackmd.io/_uploads/SJNqIXI7Jg.png) 定位到 `Well done!` 後往上看,發現被包在一個函式裡面,就先下斷點執行看看。 ![圖片](https://hackmd.io/_uploads/B1lkvmU7ke.png) 啥也沒發生,就去看看跨模組呼叫,發現有一個 `__vbaStrCmp`,人真好。 ![圖片](https://hackmd.io/_uploads/BkN5vQLQ1g.png) 再回去操作輸入時,斷點就觸發了。往上看發現又有一個字串 `2034120`,很有可能就是答案了。 ![圖片](https://hackmd.io/_uploads/Hk0CvX8mJl.png) 然後再去看看下一關密碼的提示: > [!Tip] > 密碼就是在challenge04題目把電腦時間調到2024/11/22/09:00時的Serial值 乖乖照著他做在執行一次。 ![圖片](https://hackmd.io/_uploads/HJPw_XLXJl.png) ## Challenge 5 **題目** :::info 請輸入「正確的Serial」 ::: 密碼:`2115080` 繼續進 Entry Point 看字串。 ![圖片](https://hackmd.io/_uploads/B1FZYQUm1g.png) 看到幾個像是跳出提示的文字,定位過去就直接看到一個 `lstrcmpiA`,馬上就下斷點執行看看。 按下 check 按鈕後,斷點附近就出現了很可疑的字串,`L2C-57816784-ABEX`。 ![圖片](https://hackmd.io/_uploads/S17KFXUXyl.png) 把輸入換成 `L2C-57816784-ABEX` 在按下 check 按鈕應該就會過了。 ![圖片](https://hackmd.io/_uploads/SkjQ97U7kg.png) ## Challenge 6 **題目** :::info - 請問這隻程式做了什麼事,才會顯示這個視窗? - 請在不修改跳轉、不使用NOP情況下,變更流程。 ::: 密碼:`L2C-57816784-ABEX` 可以看到有彈出視窗的文字敘述,定位過去後發現這兩個都被包在同一個函式裡面,所以下斷點觀察看看。 ![圖片](https://hackmd.io/_uploads/H1AKqQ87yx.png) ![圖片](https://hackmd.io/_uploads/rk9Io78m1l.png) 總之,可以在這個程式裡面看到兩個函式呼叫,然後第二個函式呼叫的回傳值拿去跟 `0x4876E7FF` 比較,若相同就繼續比 `edx` 是否等於 `0x17`。 所以,只要在第二個函式呼叫後,在執行 cmp 前,把`eax` 的值改成 `0x4876E7FF`,接著把 `edx` 改成 `0x17` 就會顯示成功。 ![圖片](https://hackmd.io/_uploads/B1tl0mI7kg.png)