在逆向工程的時候會使用很多觀念,首先得複習一下。
暫存器,CPU 內部存放資料的一個小空間。雖然可存放空間很小,但是他在 CPU 內部而且讀寫的速度極快,使它足以勝任機器上最接近處裡指令的記憶體。
在 IA-32
中,有四種基本暫存器 :
通用暫存器
: 8個 32bitSegment 暫存器
: 6個 16bit指令指針暫存器
: 1個 32bitFLAG 暫存器
: 1個 32bit暫存器介紹 :
而 64 位元架構中,0~63 bit
名稱為 RAX
。在各種通用暫存器中有部分常作為特定功用 :
返回值
。Base Address
之位置暫存。計數器
,使用 loop
時會減一。I / O 數據暫存器
,常用來存除法的餘數。Stack base
指針原點位置
暫存器目的位置
暫存器Stack top
指針EBP ESP 是用來存 Stack 的位置資訊,可以透過 POP
PUSH
CALL
RET
等操作改變。
ESI EDI 是與特定指令一起使用,主要用於記憶體複製。
? 圖片來自:
http://www.edwardbosworth.com/CPSC2105/Lectures/Slides_06/Chapter_07/Pentium_Architecture.htm
EFLAGS
這個暫存器裡面可以分成很多 FLAG
,其中重要的有三個 flag
:
Overflow
時,值為 1,若是最高為有效位元
改變也會使其變成1。Overflow
時,值為 1。EIP
指向現在的指令應該要做到哪裡,不能直接修改,但是可以透過指令間接修改 ( 如 : JMP
, CALL
)。
Segment 暫存器
首先,segment
是一種記憶體保護措施。把記憶體化為多個區塊,區塊附上起始位置、範圍、存取權限等資料,這些紀錄放在 SDT ( segment descriptor table )
上,而暫存器的值就是這個表上的索引。
? 圖片來自:
https://programmerprodigy.code.blog/2020/01/30/architecture-and-programming-model-of-8086/
字節序 Byte Order
或稱 端序 Endianness
,就是指位元組的排列順序,其中大致分成 :
範例 : 0x12345678
大端序
: 12 34 56 78小端序
: 78 56 34 12注意 : 當存字串的時候就只是 char
存在 string
中,並以 \0
做結尾 :
範例 : "abcde”
大端序
: 61 62 63 64 65 00小端序
: 61 62 63 64 65 00盡管大端序看起來十分直觀,但是 x86 CPU
是使用小端序
,這使他的運算與拓展較為快速。
Stack 在程序中有以下功能 :
在記憶體中,Stack
是由下往上長高的,若裡面沒有東西,ESP
會回到底部。