iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
2
Security

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

Day5 - 記憶體到底如何存放程式?

記憶體在電腦中扮演極重要的角色。生活中,每次想多開幾個瀏覽器,電腦就開始 lag 甚至最後當機、跑不動,與記憶體的使用息息相關。本篇中,會說明程式在記憶體中的配置狀況。

記憶體配置

你可以把記憶體想像成一塊長方體,我們在資料的分段中所說的 .bss, .data, .text, .rodata 在程式初始化的時候,就會按照其預設的位置各至打散在記憶體各處,如下圖:


Reference

這裡,有一個很重要的地方要注意,那就是是高記憶體與低記憶體的位置,因為這攸關 Stack 與 Heap 的成長的方向。從圖來看,不難發現,Stack 的成長方向,是由高記憶體往低記憶體擴張,而 Heap 正好相反。

Stack 的用途,最主要是用來儲存函式的區域變數、甚至是 Stack 的指標(比方說,ebp, esp, eip)(這些指標會在後續說明其用途),而 Heap 則是用來儲存動態初始化的變數(比方說,C 語言的 malloc 函式所產生的變數儲存的位置就是在 Heap)

Stack

特性

Stack 是一種資料結構。它的特性就是 LIFO (Last in First Out),意思是先進入 Stack 的資料,會比後進去入的資料晚出來。感覺很拗口,我舉個簡單的例子:不知道你有沒有吃過品客(如下圖),它的洋芋片在罐子裡是堆積起來的,正常而言,我們都是吃離洞口較近的洋芋片,依序把它吃完。Stack 就好比是品客,我們後放入的資料就好比是離洞口較近的洋芋片,正常情況下,我們優先拿來使用。


Reference

方法

要實現 Stack 的資料結構,有兩個方法。分別是 push 與 pop。push 是用來將資料推入 Stack,而 pop 是用來將資料取出,取出方式就如上面說的,後進先出(LIFO)。用圖解(如下圖)來說明更好理解:首先,我們 push 1 到一個空的 Stack,接著再 push 2 在1的上面,接著我們使用 pop,這時候 LIFO 的特性就在這時候體現它的價值了,我們取出的是2的資料,而非1的資料。


Reference

結論

恭喜!你大致上了解程式在記憶體的配置。明日,會接續說明組合語言透過何種方法存取資料~


上一篇
Day4 - 程式碼如何分段?
下一篇
Day6 - 為什麼要使用暫存器?
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言