# flare-on 2022-4 darn_mice ## 程式畫面 雙擊 .exe 檔會快速顯示空白視窗,然後它就會消失。然而,透過 cmd 運行它也不會顯示任何內容,最終,嘗試在檔名後面加入任意字元,會顯示出一些文字,之後就 crash 掉: ![螢幕擷取畫面 2023-11-10 202417](https://hackmd.io/_uploads/Hy3wKsjXT.png) ![螢幕擷取畫面 2023-11-10 202444](https://hackmd.io/_uploads/BkoHQ3jm6.png) ## main 開始沿著main搜尋每個function的呼叫及被呼叫: ![螢幕擷取畫面 2023-11-10 203849](https://hackmd.io/_uploads/r1TpYjomp.png) 這邊出現一長串數字,感覺之後會用到: ![螢幕擷取畫面 2023-11-10 203918](https://hackmd.io/_uploads/H1RFS2oXT.png) ![螢幕擷取畫面 2023-11-10 203936](https://hackmd.io/_uploads/HysGIhj7T.png) 看到 sub_401240 出現多次,透過上面 cmd 顯示的內容,可把它視為輸出(print): ![螢幕擷取畫面 2023-11-10 203955](https://hackmd.io/_uploads/SyaOLni7a.png) 下面的 if 函式內容是輸入的字串長度,若為 0 或 0x23(35),它會列印其他內容並且不執行其他操作,如第一張圖: ![螢幕擷取畫面 2023-11-10 205415](https://hackmd.io/_uploads/Sy5hdnoXa.png) 在 for 迴圈下面,看到一個感覺是得到 flag 的一個函式: ![螢幕擷取畫面 2023-11-10 204036](https://hackmd.io/_uploads/H1CHvnjmp.png) 點進去發現一大堆沒什麼用的 code ,但是有看到跟加解密有關的語法 (BCryptOpenAlgorithmProvider 和 BCryptDeriveKeyPBKDF2),上網一查,發現它使用的是 BCrypt 模組,裡面的函數可以根據我們的輸入字串初始化一些解密金鑰,然後在 sub_4015C0 執行各種複雜加密操作的函數中使用它,也就是說,答案隱藏在解密之前執行的 for 迴圈中: ![螢幕擷取畫面 2023-11-10 210557](https://hackmd.io/_uploads/H1mu93sXp.png) 讓我們再回到上一步的 for 迴圈,看到一個像是分配 memory 的函數(VirtualAlloc),到 Windows 的官網查詢其用意 「Reserves, commits, or changes the state of a region of pages in the virtual address space of the calling process.」 以下是括號內參數的含意 0 = NULL( lpAddress), 0x1000u = 0x1000bytes(dwSize), 0x3000u = MEM_COMMIT | MEM_RESERVE(flAllocationType), 0x40u = PAGE_EXECUTE_READWRITE(flProtect)。換句話說, for 迴圈為每個字元分配了一些 memory ,然後將該字元與 hardcoded string 中的一個 byte 加在一起放入,最後,透過將分配的記憶體重新解釋為主程式中的一個變數。 當我們執行錯誤的輸入時,我們不會再回到程式裡,所以,為了能使我們的輸入有效,需要執行有效 x86 程式碼,因此這個地方會用到 ret (0xc3)。 ![螢幕擷取畫面 2023-11-10 204737](https://hackmd.io/_uploads/HJ-cw3jm6.png) 讓程式通過所有檢查的一種方法是以動態產生的函數體簡單返回的方式建構輸入。最簡單的方法是確保輸入中的字元和 data 加起來為 0xC3,然後解碼為 ret 指令。寫一個 Python 來計算值: ![螢幕擷取畫面 2023-11-12 143333](https://hackmd.io/_uploads/SJm7EZR7p.png) flag:i_w0uld_l1k3_to_RETurn_this_joke@flare-on.com ![螢幕擷取畫面 2023-11-12 144019](https://hackmd.io/_uploads/rJwmEb0Qa.png)