這次我們的目標是透過觀察Hello World程式,來了解使用OllyDbg的一般流程。
原始程式代碼如下:
編譯指令: gcc -o main.exe main.c
原始碼 main.c:
編譯後產生的main.exe,直接用OllyDbg載入即可。
首先我們預期從第一條指令開始就是我們寫的main函式的內容,因此我們就一路F8看看到底是如何,讓人驚訝的是,你會看到一堆跟main毫不相關的指令 !
其實gcc對入口點(entry point)的選擇順位是這樣的:
1.linker的 -e選項
2.連結腳本的 ENTRY 命令
3.若有定義 _start 符號,使用 _start符號值
4.若存在 .text 區段,使用 .text區段第一個位元組的位址
5.使用 0
根本沒有一個將main定義為入口! 那程式的入口在何處? 查了一下文件,mingw下的入口點通常為叫做 mainCRTStartup 的函式,因此我就翻出了 mingw 的源碼,經過翻找後,終於在 crtexe.c找到了 mainCRTStartup 的定義,跟反組譯碼對照,果然沒錯。有興趣的話可以自記trace一下:
crtexe.c
mainCRTStartup會初始化 c runtime library,使我們能夠在main中使用 crt 所提供的函式。在初始化完成後, mainCRTStartup會呼叫 main 函式,並且在 main 返回之後,呼叫 exit() 結束程式。
因此我們從頭開始,試著一步一步執行,看看 main在什麼地方。
我們先略過 crt 初始化的部分不談,我們很快地可以發現,程式在這裡停了下來:
0x004013D9 CALL 0x00401610
因此我們在這裡按F2下斷,重新執行程式,並跟進這個call,果然就是我們寫的 main函式:
0x00404064就是字串的位址,我們接下來試著將Hello World訊息改為 "Hacked!"。
首先用滑鼠點一下下方的記憶體窗口,之後按下 Ctrl + g,輸入字串的位址後按enter,我們可以發現記憶體的內容就是我們要找的字串:
接著我們將整個字串反白,按下 Ctrl + e 編輯字串,將在串改為 "Hacked!,並在後面加上一個zero byte做結尾,完成後案F9執行,就可以看到剛剛修改後的訊息了:
若想要將對執行檔的修改保存起來,可以在記憶體視窗中按右鍵->Edit->Copy all modifications to Executable,之後會跳出一個視窗,在那個視窗按右鍵->Save File,就可以將修改存檔,或是寫到一個新的執行檔。
原始程式代碼如下:
編譯指令: gcc -o main.exe main.c
原始碼 main.c:
編譯後產生的main.exe,直接用OllyDbg載入即可。
首先我們預期從第一條指令開始就是我們寫的main函式的內容,因此我們就一路F8看看到底是如何,讓人驚訝的是,你會看到一堆跟main毫不相關的指令 !
其實gcc對入口點(entry point)的選擇順位是這樣的:
1.linker的 -e選項
2.連結腳本的 ENTRY 命令
3.若有定義 _start 符號,使用 _start符號值
4.若存在 .text 區段,使用 .text區段第一個位元組的位址
5.使用 0
根本沒有一個將main定義為入口! 那程式的入口在何處? 查了一下文件,mingw下的入口點通常為叫做 mainCRTStartup 的函式,因此我就翻出了 mingw 的源碼,經過翻找後,終於在 crtexe.c找到了 mainCRTStartup 的定義,跟反組譯碼對照,果然沒錯。有興趣的話可以自記trace一下:
crtexe.c
mainCRTStartup會初始化 c runtime library,使我們能夠在main中使用 crt 所提供的函式。在初始化完成後, mainCRTStartup會呼叫 main 函式,並且在 main 返回之後,呼叫 exit() 結束程式。
因此我們從頭開始,試著一步一步執行,看看 main在什麼地方。
我們先略過 crt 初始化的部分不談,我們很快地可以發現,程式在這裡停了下來:
0x004013D9 CALL 0x00401610
因此我們在這裡按F2下斷,重新執行程式,並跟進這個call,果然就是我們寫的 main函式:
0x00404064就是字串的位址,我們接下來試著將Hello World訊息改為 "Hacked!"。
首先用滑鼠點一下下方的記憶體窗口,之後按下 Ctrl + g,輸入字串的位址後按enter,我們可以發現記憶體的內容就是我們要找的字串:
接著我們將整個字串反白,按下 Ctrl + e 編輯字串,將在串改為 "Hacked!,並在後面加上一個zero byte做結尾,完成後案F9執行,就可以看到剛剛修改後的訊息了:
若想要將對執行檔的修改保存起來,可以在記憶體視窗中按右鍵->Edit->Copy all modifications to Executable,之後會跳出一個視窗,在那個視窗按右鍵->Save File,就可以將修改存檔,或是寫到一個新的執行檔。
留言
張貼留言