[Python]Use Capstone to disassemble code

Posted by John on 2019-11-27
Words 579 and Reading Time 2 Minutes
Viewed Times

最近因為研究需要,開始學習如何透過Python將一個PE file的程式碼部分給反組譯成組合語言,以下很快地紀錄整個過程,由於對於資安逆向工程還沒有很熟悉,如果有錯誤還請指正。

PE file,全名又稱The Portable Executable,是一種可以在Windows作業系統下被執行的檔案格式(順帶一提Linux下似乎是ELF),檔案結構大概長下面這個樣子(圖片來源):

PE-architecture.jpg

整個檔案除了header以外,還有許多的sections,而其中程式碼的部分會被存放在.text section裡面。

如果是使用Python,要取出.text section的話可以使用PEfile這個套件,怎麼取出的不是這篇想講的東西,總之成功後你可以從.text section拿到一大堆的bytes code。

然後這些bytes code可以透過Capstone來disassemble:

螢幕快照 2019-11-27 下午3.50.15

官方網站的教學真是簡潔易懂,令人痛哭流涕,比方說有一段bytes code要反組譯的話只要:

1
2
3
4
5
6
7
8
# test1.py
from capstone import *

CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"

md = Cs(CS_ARCH_X86, CS_MODE_64)
for i in md.disasm(CODE, 0x1000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
  1. 給一段bytes string
  2. 定義系統架構和MODE
  3. 給予一個起始位址,開始反組譯

然後就可以得到如下的結果:

$ python test1.py

0x1000: push rbp
0x1001: mov rax, qword ptr [rip + 0x13b8]

於是當我很開心的這樣做的時候,卻發現有時候會沒有辦法完整的輸出所有的組合語言指令,原來是.text section有時候並不會只放code,而會放一些data等資源(不是很懂為什麼要這樣設計),而capstone又預設如果讀到不懂的指令就會停下來:

By default, Capstone stops disassembling when it encounters a broken instruction. Most of the time, the reason is that this is data mixed inside the input, and it is understandable that Capstone does not understand this “weird” code.

所以這個時候,棒棒噠capstone提供了skip mode這個模式,如果看不懂的咱們就跳過唄!用python的話只要加上一行即可:

1
2
3
4
5
6
7
8
9
md = Cs(CS_ARCH_X86, CS_MODE_32) 

# By default, SKIPDATA mode is OFF. Now let's turn it ON
md.skipdata = True
# From here onwards, Capstone skips data until it finds a legitimate instruction
# .....

# Turn off SKIPDATA mode, so we are back to the default mode
md.skipdata = False

然後又可以繼續快樂的反組譯了!


>