終於到了我當時在研究 Volatility3 時卡最久的 symbol table 了,這部份真的是很困擾,希望本篇文章可以幫助大家快速上手!
如果沒有先理解 symbol table,那在執行程式的時候通常會出現這個問題
在電腦裡程式被編譯成執行檔後,裡面其實還是有「模板的結構」,而這些結構和位置資訊合在一起,就叫做「符號(Symbol)」。
「符號表(Symbol Table)」就是這些符號的對照表(像是一本「記憶體地圖說明書」)。
Volatility 需要這些符號資訊,才能知道記憶體裡某個位址的資料對應到哪個結構、哪個變數、是哪個程序的一部分。
Volatility3 使用 JSON 格式來儲存這些符號,而這個設計有以下好處:
Volatility2 的符號資料叫做 profile(整個系統的符號描述包),所有的符號都混在同一個 namespace裡,可能會導致符號衝突等問題。
Volatility3 由於他 symbol table 的特性,讓他能夠支援各種平台,直接在網路上也可以看到很多別人已經包好的 symbol table 可以用。
pip3 show volatility3
如果剛好遇到 Linux 或 Mac 記憶體它需要的 symbol table 都沒有現成的、版本對不上的話,也可以自己客製化一個 symbol table~
vol -f <記憶體檔案> banners
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
tee -a /etc/apt/sources.list.d/ddebs.list
apt install ubuntu-dbgsym-keyring
apt-get update
apt install linux-image-5.15.0-138-generic-dbgsym
dwarf2json
(這個工具要用 go 去跑)
git clone https://github.com/volatilityfoundation/dwarf2json.git
cd dwarf2json/
sudo apt install golang-go
go build
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0-138-generic > vmlinux-5.15.0-138-generic.json
今天內容相當豐富,在客製化 symbol tables 的部分卡超級久,總算是完成了。