前幾天介紹了非常多 Debugger 的操作方法,今天就要利用教材中的 lab 9-1 來進行練習!
首先在進行 Debug 前,利用 IDA Pro 先找到 main 函式的位置

可以看到 main 的位址在 0x402AF0,接著再去找是在那裡呼叫了 main 函式

可以看到在 0x403945,有對 main 進行呼叫
call _main
因此待會在 Debug 的時候就可以一直 step over 直到這裡

使用 ctrl + G 找到
00403945
接著按 F2 在這裡設斷點

再按 F9 Run 程式就會跑到這裡停下來,再來使用 F7 step into 到 main funtion 裡面,接著一邊使用 F7 與 F8 一邊觀察樣本的行為。

可以看到程式在 0x402AFD 檢查 command-line argument 的數量是不是 1,然後因為我們沒有提供他任何參數,所以這個檢查會過

接著程式會跳到 0x401000,並且後面嘗試打開一個 registry key
HKLM\SOFTWARE\Microsoft \XPS
但是因為這個 registry key 不存在,函式回傳 0,所以執行跳進 0x402410

可以看到這個函式使用 GetModuleFileNameA 取得目前正在執行的程式本身的路徑,接著建立一個 ASCII 字串:
/c del <目前執行檔的路徑> >> NUL

malware 接著把剛才建立好的字串與 cmd.exe 結合,並呼叫 ShellExecuteA,嘗試把自己從硬碟中刪除,

接下來的任務是設法讓這個惡意程式正常執行,我們至少有兩種選擇:第一種是提供更多的 command-line arguments,藉此滿足 0x402AFD 的檢查,第二種則是修改程式中負責檢查 registry keys 的程式執行路徑。
然而,修改程式的執行路徑可能會造成非預期的影響,後續的指令可能會依賴儲存在這些 registry keys 中的資訊,如果這些資訊遭到改變,惡意程式之後可能會無法正常執行,因此,為了避免潛在的問題,先嘗試提供更多的 command-line arguments。先從 Strings 列表中任意選擇一個項目,例如「-in」,並將它作為命令列參數,用來測試惡意程式是否會出現一些值得注意的行為。
要進行這項操作,選擇 Debug > Arguments,如下圖

接著,在Arguments 對話框中加入「-in」參數
當惡意程式使用「-in」這個參數執行時,它仍然會嘗試刪除自己,這告訴我們,目前提供的 command-line arguments 仍然不是有效的參數。

我們可以看到,在檢查完 command-line arguments 之後,程式執行到 0x402B01 時會進行跳轉,argc 代表傳遞給程式的字串參數數量。由於它是 main 函式的第一個參數,因此可以在 frame pointer 上方 8 bytes 的位置找到它。
在 0x402B2E,最後一個 command-line arguments 會被傳入一個從位址 0x402510 開始的函式。我們知道這是最後一個參數,是因為標準 C 程式的 main 函式會接收兩個參數:argc,也就是命令列參數的數量,以及 argv,它是一個由指標所組成的陣列,每個指標都指向一個command-line argument。

如上圖的標記 ① 與 ② 所示,eax 中存放的是 argc,而 ecx 中存放的是 argv。
標記 ③ 的指令會進行指標運算,藉此選取 command-line arguments 陣列中的最後一個元素,最後,這個指標會被存放到 eax,並且在呼叫函式之前被 push 到 stack 的最上方。
藉由反組譯視圖,可以讓我們粗略了解從位址 0x402510 開始的這個函式,這個函式中沒有任何函式呼叫,但是透過快速查看其中的指令,我們可以看到它對 byte 大小的運算元使用了 ADD、SUB、MUL 和 XOR 等算術運算,例如位址 0x402532 到 0x402539 之間的指令。
這個 routine 看起來是使用一套複雜、寫死在程式中的演算法,對輸入資料進行合理性檢查(sanity check)。這個輸入很可能是某種類型的密碼或驗證碼。
可以透過提供 -in 選項,並且同時提供正確的密碼,讓這個程式自行安裝,或者也可以直接 patch 掉這個執行檔,使程式跳過密碼驗證的檢查。
