逆向工程之彙編基礎

2021-09-19 01:25:46 字數 3898 閱讀 9716

1.1 暫存器

以下是通用暫存器(除了非通用暫存器還有eip指令指標暫存器)

多數字串指令通常把ecx用作計數器,把esi作為源指標,把edi作為目的指標,通常情況下棧操作會使用ebp和esp。除了通用暫存器和eip指令暫存器外還有6個16位段暫存器

**段:cs

資料段:ds

棧段: ss

額外段:es、fs及gs 三個為額外通用目的段

段暫存器包含我們稱之為段選擇子的指標,通常以偏移量的基位址形式出項例如:

mov ds:[eax],ebx

ebx 暫存器中的內容被複製到eax制定的資料段裡的乙個偏移位址,這個位址解釋為「ds的位址加上eax的值」段選擇子是16位段識別符號,也就是說段選擇子不直接指向段,而是指向定義段的段描述符。因此段暫存器指向段選擇子,用於確定8192個可能標識段的段描述符中的乙個

段選擇子結構相對簡單,3-15位用作描述表的索引(三個記憶體管理暫存器之一),第2位指定正確的描述符表,低兩位指定請求的特權級。

eflags 暫存器也很重要它包含了各種標誌,指示當前指令執行後的狀態、情形、當前的特權級、以及是否允許中斷等內容。

1.2  ia-32處理器操作模式

ia-32處理器有三種操作模式和一種偽操作模式,分別是保護模式、實位址模式、體統管理模式、以及保護模式子集的偽模式,我們著重介紹常見的保護模式

保護模式裡,有四個稱為環( ring )的特權級。一般用 0 至 3 表示它們,數越小表示特權級越高。環 o 一般是作業系統使用,而應用程式一般執行在環 3 ,這將通過中止惡意程式執行來防止它們修改作業系統的資料結構和物件,也限制應用程式可以執行的指令。在 ia32 裡,在三個地方可以找到特權級: cs 暫存器的低 2 位 ― cpl ( current privilege lcvel ,當前特權級),段描述符的低 2 位 ― dpl ( descriptor privilege levcl ,描述符特權級),段選擇子的低 2 位 ― rpl ( requestor ' 5 privilege level ,請求特權級)。 cpl 是當前正在執行**的特權級, dpl 是給定描述符的特權級,而 rpl 則顯然是建立段的**的特權級。

保護模式下有三個不同的記憶體模型:平坦、分段及實位址。實位址模式常用幹啟動時且保持向後相容,不過,你很有可能從來不會(或很少)碰到它,模型和它名字表述含義差不多:它是平坦的! 因此,本章不準備討論它。平坦記憶體這意味著系統記憶體看起來像一片連續的

位址空間.通常是位址 0

-4294967296 。這裡的位址空間被稱為線性位址空間.

任何單獨地

或應用程式中的表現形式。在這兩種情形下,資料仍是以線性的方式儲存,但資料的檢視改變了。對分段記憶體來說,不是以線性位址訪問記憶體,而是使用了邏輯位址(也稱為 far 指標)。邏輯位址是基址儲存在段選擇子裡加上偏移 t 的結合。兩者(基址及偏移最)相加後對應段裡的乙個位址,然後對映到線性位址空間裡。這樣可以保證高度分離由處理器強制執行,確保乙個程序不會跑到另乙個程序的位址空間裡(不過,在平坦記憶體模型裡,由作業系統做同樣的事情)。因此,基址加上偏移等於處理器位址空間裡的線性位址。此外,除了每個應用程式被給定它自己的段集及段描述符外,多段模型也可以用於使用單一分段模型的地方。不過目前我想不起來還有哪個作業系統在使用它,因此,進一步討論它怎樣工作也沒什麼意義。

現代作業系統能使用的位址空間往往比物理記憶體更大一些,而定址的資料井不一定儲存在物理記憶體裡。這是如何做到的呢?答案是分頁和虛擬記憶體 ,只有當前必需的資料才需要隨時儲存在物理記憶體裡。它把需要的資料儲存在物理記憶體裡,把暫時用不上的資料儲存到硬碟上。把資料從磁碟讀入記憶體的過程,或向磁碟寫資料,被稱為交換資料,這就不難理解 windows 為什麼會有交換檔案,而 linux 有交換分割槽。當不啟用分頁時,線性位址(不管它是否由 far 指標組成)與實體地址一一對應,它和使用的位址空間之間沒有轉換。然而.當啟用分頁時,應用程式使用的所有指標都是虛擬位址。(這就是為什麼在保護模型裡平坦記憶體模型中的兩個應用程式使用分頁訪問完全一樣的位址卻不會彼此破壞。)這些虛擬位址與物理記憶體位址間不存在一一對應的關係。使用分頁技術時.處理器把物理記憶體分成 4kb 、 2mb 或 4mb 大小的頁。位址轉換成線性位址時,將通過分頁機制查詢它,如果這個位址不在當前的物理記憶體裡,將丟擲page-fault(頁面故障)異常,作業系統收到此異常後,將把指定的頁面載入到記憶體裡,然後接著執行剛才導致此異常的指令。把虛擬位址轉換成實體地址的過程依賴使用的頁面大小,但基本概念是一樣的。線性位址分成 2 個或 3 個部分。首先用 pdbr ( page directory base register ,頁面目錄基址暫存器)或 cr3 ( control rcgister 3 .控制暫存器 3 )查詢 page directory(頁面目錄).在這之後,線性位址裡的第 22 一 31 位將作為 pago directory 裡的偏移量 ,標識使用的 page table(頁面表

)。(參見圖 2

-4)一旦找到 page table ,將用第 12

-21 位查詢

pte( pag

e table entery

,頁面表項)(標識使用的記憶體

頁)。最後,線性位址的第0-11位作用於頁面裡定位請求的資料偏移量。當使用其他頁面時除了省略乙個間接層,過程幾乎一樣,在這個過程中,目錄項直接指向頁面、頁面表pt被完全省略。pde和pte的內容對我們來說不是很重要。

1.3 堆疊及其它段

應用程式有一些基本組成部分包括**段(或者text段簡單記成.text)、資料段(.data)、以符號開始的塊(bss/.bss)段、棧段及堆段。

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊,是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

棧有以下特點:

a、在 i

a-32 平台上,棧向若較小的位址增長. b、

棧以 ufo 的順序移去或增加資料. c、

區域性變數及只存在幹函式生命週期的變 t 隨著棧的取消而結束. d、

每個函式都會有包含區域性變 t 的棧幀(除非是編譯器故憊忽略了) e、

在每個函式的棧幀之前有儲存的禎指標.返回位址和例程的參教. o 棧幀在預處理期間構造,在掃尾例程執行期間取消

1.4 常用的彙編指令

的總結很好,現轉到如下

彙編 逆向工程基礎篇(基礎語法)

逆向工程 一 彙編 逆向工程基礎篇 一.單元,位,位元組。1.位 bit 電腦資料量中的最小單元,即0和 1。2.位元組 byte 乙個位元組有八位。3.字 word 乙個字有兩個位元組,即十六位。雙字 double word 兩個字,三十二位。千字 kilobyte 1024 個位元組 32 32...

逆向彙編基礎

1.1 cpu基本功能 1.1.1 目標 計算機系統中的cpu只能執行機器指令 由機器指令組成的程式,被稱為目標程式,也被稱為目標 計算機系統最終執行的是目標程式 int cf11 void 等價於 xor ecx,ecx xor eax,eax inc ecx ll3 cf11 mov edx,e...

軟體工程 之逆向工程

逆向工程 reverse engineering 又稱反向工程是根據已有的東西和結果,通過分析來推導出具體的實現方法。比如你看到別人寫的某個exe程式能夠做出某種漂亮的動畫效果,你通過反彙編 w32dasm 反編譯和動態跟蹤 od 等方法,分析出其動畫效果的實現過程,這種行為就是逆向工程 不僅僅是反...