How to Debug DOS Executable (COM) file
最近解 CTF 遇到一題 COM file 執行檔的題目,花了一些時間找到如何 debug COM file。雖然題目沒解出來,但還是記錄一下。
Introduction
COM file 是一種執行檔格式,副檔名為 .COM
。COM file 的檔案結構十分單純,沒有 header 或其他儲存 metadata 的區段,只有 code 和 data。因為沒有儲存 metadata,其沒辦法做 relocation,且只能將整個 binary load 進 memory,因此其最大 size 限制為 65280 (0xff00) bytes……。
這些 reference 裡都寫過了,可以自行參考 reference。
How to Debug DOS Executable (COM) file
根據資料,Windows 32-bit 好像就可以跑 .COM
file,但我手邊沒有機器,而且用其他工具跑起來感覺比較有趣,因此就嘗試用基於 DOSBox 的 DOSBox-X 來 debug。
- 選好 working directory,把 DOSBox-X 跑起來。
- 為了讓 DOSBox-X 讀到要 debug 的檔案,因此需要把存有要 debug 檔案的 directory mount 進去。此處我把本地的
polyglot/
mount 到 DOSBox-X 裡的C:
,然後輸入C:
,把 working directory 切換到C:
。關於此部份更多細節可以參考 DOSBox Manual。1 2 3
Z:> mount C: C:\Users\poc\Desktop\polyglot Z:> C: C:>
- 輸入
debugbox <target_com_file> <args>
便會開啟 DOSBox-X debugger,開始 debug 該 COM file。
1
C:> debugbox POLYGLOT.COM
1
![](/assetshttps://ice1187.github.io/images/dosbox-x-debugger.png)
- 剩下就是一般 debug 操作,一些常用指令如下,更多指令可以參考 dosbox-x/README.debugger:
Command | Description |
---|---|
f5 |
Run |
f10 |
Step over |
f11 |
Step into |
bp <seg>:<offset> |
Set breakpoint at seg:offset |
bplist |
List breakpoints |
tab / shift-tab |
Switch between code/data/register view |
up / down |
Scroll in the current view |
dv <addr> |
Set data view to show addr address |
sr <reg> <val> |
Set register value |