170824 彙編 x86基礎

2021-08-07 08:36:48 字數 2382 閱讀 9779

a.1625-5 王子昂 總結《2023年8月24日》 【連續第325天總結】

b. 逆向知識

資料移動分為5種方式:

立即數到暫存器

立即數到記憶體

暫存器到暫存器

暫存器到記憶體或記憶體到暫存器

記憶體到記憶體

前4種是所有現代體系都支援的,第五種是x86獨有的,可以通過inc/add來直接操作記憶體

另外x86使用變長指令,指令長度從1-15位元組不等;而arm的指令只能是2/4位元組

intel

mov ecx, aah

mov ecx, [eax]

mov ecx, eax

at&t

movl $0xaah, %ecx

movl (%eax), %ecx

movl %eax, %ecx

注意指令是相同的,只是寫法不同

at&t記法在暫存器名前加字首%,立即數前加$;intel不加字首

at&t記法加入了指示指令寬度的字尾,比如movl(長整形), movb(位元組)等

at&t記法把源運算元放在目標運算元之前,intel相反

win系統上的工具通常使用intel記法,而unix系統上的工具通常遵從at&t記法

呼叫約定最常用的是cdecl和stdcall

它們都是將引數從右向左壓棧,區別在於前者由呼叫方負責清理堆疊;後者則由被呼叫方負責

在函式內部,通常形式為:

push  ebp

mov   ebp, esp

......

...mov esp, ebp

pop ebp

retn

第一行將當前的ebp值儲存,然後將初始的esp存入ebp中,這個過程稱為函式序言

[ebp+4]為函式返回位址,引數從[ebp+8]開始

所有的引數訪問都以ebp為基位址,被稱為棧基指標

*也可以通過一種稱為棧指標省略的優化方法指定編譯器生成不使用ebp作為棧指標的**。這種優化下ebp可以作為通用暫存器,而esp來充當棧基指標

如果需要區域性變數,那麼在第二行以後執行對esp的減操作來擴充棧,然後通過[ebp-4]的方式來訪問區域性變數

函式末尾把esp和ebp還原,最後retn等價於pop esi,即將棧堆中的返回位址取出作為執行位址

在cdecl中,call之後會執行add esp,x來清理堆疊中的引數

if-else通常通過jcc+cmp指令來判斷是否跳轉

迴圈則通過if-else+goto指令來實現

字串擾亂函式

每3個字元儲存乙個有效字元,例如在記憶體中儲存sx]otyfkpty^w\aafkrw\e

解擾亂後為software

這樣可以規避字串掃瞄器

x64與x86大體相同,只有一些細微的區別

首先暫存器再次擴充套件,r-reg(如rax)達到了64位

多數x64編譯器把rsp作為基位址引用區域性變數,而把rbp當做通用暫存器

x64支援一種稱為rip相對定址的概念,允許得到標號的絕對位址來放入暫存器中

多數算術運算指令都公升級為64位,即使運算元只有32位

x64中大多數的函式呼叫都通過暫存器來傳遞引數

1.arm的指令集比x86小很多,但通用暫存器更多

2.指令寬度固定為2位元組或4位元組(由狀態決定)

3.記憶體訪問模式是載入-儲存模式,即不允許直接對記憶體操作,必須通過暫存器

4.x86有ring0-3的特權模式,0最高

arm中則提供8種不同級別的特權模式,包括usr, svc, sys等

每個模式下執行的**具有特定的優先級別,可以訪問特定的暫存器;比如說usr模式就無法修改系統暫存器

5.arm擁有兩種狀態:arm和thumb,它們影響的只有指令集,而不是特權模式

在arm狀態下指令總是32位寬,而在thumb狀態下指令是16位和32位混用

決定狀態的有兩個因素:

(1)通過bx和blx指令進行分支跳轉的時候,目標暫存器的最低有效位

(2)當前程式狀態暫存器cpsr的t標誌位

arm核心啟動的時候多數情況下都是進入arm狀態

多數較新的作業系統使用thumb是為了獲得更大的**密度(混合使用可以降低**大小)並且應用程式可以執行於任意模式下

因為多數指令助記符都是相同的,所以在thumb指令後新增.w字尾標識

6.在arm中,所有指令都支援條件執行,而不像x86大部分都是無條件執行

7.arm擁有桶式移位器:某些指令可以包含另一條用於移位或旋轉的算術指令來節省指令

c. 明日計畫

逆向知識

X86彙編指令詳解

x86彙編基本分為七大體系 分別是 1 資料傳送指令 2 算術運算指令 3 邏輯運算指令 4 串操作指令 5 控制轉移指令 6 處理器控制指令 7 保護方式指令 先介紹資料傳送指令集 1 資料傳送指令 1.mov 格式 mov destination,source 功能 將s ource中的資料傳送...

x86彙編學習筆記

debug 是dos,windows都提供的實模式 8086 方式 程式的除錯工具.windows下使用dosbox模擬dos環境,掛載所在目錄後開啟debug.exe r指令 顯示r ax 0000 bx 0000 cx 0000 dx 0000 sp 00fd bp 0000 si 0000 d...

x86彙編經驗之談

1.彙編常用指令機器碼 mov b8 2.將暫存器清零 將暫存器清零,如暫存器ax 可使用指令 mov ax,0 此條指令占用3個位元組。也可 sub ax,ax 減法指令,該條指令只占用2個位元組。3.利用棧交換兩個資料 例 1 將10000h 1000fh這段空間當做棧,初始狀態是空的 2 設定...