iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
1
Security

逆向工程 – 從入門到放棄系列 第 4

Day4 - 程式碼如何分段?

一般而言,系統會將程式碼與 data 分離,所以才會有分段的產生,因此不同目的程式碼對系統而言儲存的位置也不同。

資料的分段(Section)

縱覽

我先用一張圖,做一個總結。這裡有一個很棒的例子,可以很清楚的知道哪些資料存放在哪個分段,若有興趣看每一個分段的分法,可以先看後面的定義。

由下圖可以看到,整段程式碼存放的地方是 .text,變數 i 因為尚未指派數值因此存在 .bss,常數 hello 存在 .data, 而其被指派的數值存放在 .rodata。


(資料來源:本連結 p.32)

個別的分段原則:

.text

用來保存實際的程式碼的地方

.data

用來宣告初始的資料與常數(執行時期[runtime]不會在再改變的變數)

.bss

存放宣吿變數的地方(還沒有初始值)

.rodata

用來存放唯讀資料

如何宣告上述的各別分段?

宣告方法很簡單,參照以下程式:

section .text
start 
    xxx
    
section .data
    yyy

section .bss
    zzz

xxx, yyy, zzz 就是你可宣告完,可以放其他程式碼的地方。

比較

上述的主要是 Unix 上的分段。如果是 Windows 上的分段,結果就會不大一樣。
可以和Linux對應的段落包括,.text、.data、.bss、.rdata。

更多常見的是:.idata, .edata, .reloc, .rsrc, .tls ...族繁不及備載,有興趣的話,歡迎參考[官方文件]。(https://docs.microsoft.com/en-us/windows/win32/debug/pe-format?redirectedfrom=MSDN#general-concepts)

結論

今天,我們了解程式碼的分段原因與原則。明天,將會更透徹的理解這些分段在記憶體是如何分配!


上一篇
Day3 - 逆起來 - 逆向 Hello world!
下一篇
Day5 - 記憶體到底如何存放程式?
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言