CTF-汇编语言归纳
內(nèi)容更新是由低向高遞增的
內(nèi)容如下:
xor rax, rax #xor rax,rax是對rax的清零運算操作
條件跳轉(zhuǎn)(一般配合cmp使用)
下表展示了基于零標志位、進位標志位、溢出標志位、奇偶標志位和符號標志位的跳轉(zhuǎn)。
此表為1) 相等性的比較
基于無符號數(shù)比較的跳轉(zhuǎn)如下表所示。操作數(shù)的名稱反映了表達式里操作數(shù)的順序(比如 leftOp < rightOp)。下表里的跳轉(zhuǎn)僅在比較無符號數(shù)值時才有意義。有符號操作數(shù)使用不同的跳轉(zhuǎn)指令。
下表列岀了基于有符號數(shù)比較的跳轉(zhuǎn)。下面的指令序列展示了兩個有符號數(shù)值的比較:
一、運算結(jié)果標志位
1、進位標志CF(Carry Flag)
進位標志CF主要用來反映運算是否產(chǎn)生進位或借位。如果運算結(jié)果的最高位產(chǎn)生了一個進位或借位,那么,其值為1,否則其值為0。
2、奇偶標志PF(Parity Flag)
奇偶標志PF用于反映運算結(jié)果里“1”的個數(shù)的奇偶性。如果“1”的個數(shù)為偶數(shù),則PF的值為1,否則其值為0。
利用PF可進行奇偶校驗檢查,或產(chǎn)生奇偶校驗位。在數(shù)據(jù)傳送過程里,為了提供傳送的可靠性,如果采用奇偶校驗的方法,就可使用該標志位。
3、輔助進位標志AF(Auxiliary Carry Flag)
在發(fā)生下列情況時,輔助進位標志AF的值被置為1,否則其值為0:
(1)、在字操作時,發(fā)生低字節(jié)向高字節(jié)進位或借位時;
(2)、在字節(jié)操作時,發(fā)生低4位向高4位進位或借位時。
對以上6個運算結(jié)果標志位,在一般編程情況下,標志位CF、ZF、SF和OF的使用頻率較高,而標志位PF和AF的使用頻率較低。
4、零標志ZF(Zero Flag)
零標志ZF用來反映運算結(jié)果是否為0。如果運算結(jié)果為0,則其值為1,否則其值為0。在判斷運算結(jié)果是否為0時,可使用此標志位。
5、符號標志SF(Sign Flag)
符號標志SF用來反映運算結(jié)果的符號位,它與運算結(jié)果的最高位相同。在微機系統(tǒng)里,有符號數(shù)采用補碼表示法,所以,SF也就反映運算結(jié)果的正負號。運算結(jié)果為正數(shù)時,SF的值為0,否則其值為1。
6、溢出標志OF(Overflow Flag)
溢出標志OF用于反映有符號數(shù)加減運算所得結(jié)果是否溢出。如果運算結(jié)果超過當前運算位數(shù)所能表示的范圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。
二、狀態(tài)控制標志位
狀態(tài)控制標志位是用來控制CPU操作的,它們要通過專門的指令才能令之發(fā)生改變。
1、追蹤標志TF(Trap Flag)
當追蹤標志TF被置為1時,CPU進入單步執(zhí)行方式,即每執(zhí)行一條指令,產(chǎn)生一個單步停斷請求。這類方式主要用于程序的調(diào)試。
指令系統(tǒng)里沒有專門的指令來改變標志位TF的值,但程序員可用其它辦法來改變其值。
2、停斷允許標志IF(Interrupt-enable Flag)
3、方向標志DF(Direction Flag)
方向標志DF用來決定在串操作指令執(zhí)行時有關(guān)指針寄存器發(fā)生調(diào)整的方向。
在串處理指令李控制信息的方向
標志位操作指令
標志位操作指令是一組對標志位置位、復(fù)位、保存和恢復(fù)等操作的指令。
1、進位CF操作指令
清進位指令CLC(Clear Carry Flag):CF←0
置進位指令STC(Set Carry Flag):CF←1
進位取反指令CMC(Complement Carry Flag):CF←not CF
2、方向位DF操作指令
清方向位指令CLD(Clear Direction Flag):DF←0
置方向位指令STD(Set Direction Flag):DF←1
3、停斷允許位IF操作指令
清停斷允許位指令CLI(Clear Interrupt Flag):IF←0
其功能是不允許可屏蔽的外部停斷來停斷其后程序段的執(zhí)行。
置停斷允許位指令STI(Set Interrupt Flag):IF←1
其功能是恢復(fù)可屏蔽的外部停斷的停斷響應(yīng)功能,通常是與CLI成對使用的。
4、取標志位操作指令
LAHF(Load AH from Flags):AH←Flags的低8位
SAHF(Store AH in Flags):Flags的低8位←AH
5、標志位堆棧操作指令
PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位標志寄存器進棧;
POPF/POPFD(Pop Flags off Stack):把16位/32位標志寄存器出棧;
######################################################################
######################################################################
pushad: 將所有的32位通用寄存器壓入堆棧
pusha:將所有的16位通用寄存器壓入堆棧
pushfd:然后將32位標志寄存器EFLAGS壓入堆棧
pushf::將的16位標志寄存器EFLAGS壓入堆棧
popad:將所有的32位通用寄存器取出堆棧
popa:將所有的16位通用寄存器取出堆棧
popfd:將32位標志寄存器EFLAGS取出堆棧
popf:將16位標志寄存器EFLAGS取出堆棧
######################################################################
######################################################################
cpuid:獲取CPU信息
######################################################################
######################################################################
SBB(帶借位減法)指令從目的操作數(shù)里減去源操作數(shù)和進位標志位的值。
下面的示例代碼用 32 位操作數(shù)實現(xiàn) 64 位減法,EDX:EAX 的值為 0000 0007 0000 0001h,從該值里減去 2。低 32 位先執(zhí)行減法,并設(shè)置進位標志位,然后高 32 位再進行包括進位標志位的減法:
SHL是邏輯左移指令,SHR是邏輯右移指令
SAL是算術(shù)左移指令(shift arithmetic right),SAR是算術(shù)右移指令(shift arithmetic right)
######################################################################
######################################################################
leave指令將EBP寄存器的內(nèi)容復(fù)制到ESP寄存器里
以釋放分配給該過程的所有堆棧空間。然后,它從堆棧恢復(fù)EBP寄存器的舊值。
在16位匯編下相當于:
mov sp,bp
pop bp
在32位匯編下相當于:
mov esp,ebp;//將ebp指向(ebp內(nèi)部應(yīng)當保存一個地址,所謂指向即這個地址對應(yīng)的空間)的值賦給esp
pop ebp
#################################################################################################################
Lea eax,dword ptr ss:[esp+0x2c]
Cmp eax,dword ptr ss:[ebp-0x30]
ptr – pointer (既指針)得縮寫。
匯編里面 ptr 是規(guī)定的字(既保留字),是用來臨時指定類型的。
(可以理解為,ptr是臨時的類型轉(zhuǎn)換,相當于C語言里的強制類型轉(zhuǎn)換)
匯編語言CS,DS,SS還有一個ES定義如下:
CS(Code Segment):代碼段寄存器;
DS(Data Segment):數(shù)據(jù)段寄存器;
SS(Stack Segment):堆棧段寄存器;
ES(Extra Segment):附加段寄存器。
當一個程序要執(zhí)行時,就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過設(shè)定段寄存器 CS,DS,SS 來指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。
一、寄存器位置不同:
1、CS:代碼段寄存器;
2、DS:數(shù)據(jù)段寄存器;
3、SS:堆棧段寄存器。
二、存放位置不同:
1、代碼段寄存器CS:存放當前正在運行的程序代碼所在段的段基值。
2、數(shù)據(jù)段寄存器DS:存放數(shù)據(jù)段的段基值。
3、堆棧段寄存器SS:存放堆棧段的段基值。
三、段地址不同:
1、cs代碼段地址,聯(lián)合ip作為cpu指向當前正在執(zhí)行的那條指令所使用,不能隨意修改它。
2、ss堆棧度段地址問聯(lián)合sp定義一個答堆棧,一旦你確定了堆棧地址,ss也不能隨便改變了。
3、ds數(shù)據(jù)段地址定義一個數(shù)據(jù)段。
#################################################################################################################
byte:8位無符號整數(shù),b表字節(jié)
sbyte:8位有符號整數(shù),s表有符號
word:16位無符號整數(shù)
sword:16位有符號整數(shù)
dword:32位無符號整數(shù),d表雙字
sdword:32位有符號整數(shù),sd表有符號雙字
qword:64位整數(shù),q表四字
tbyte:80位(10字節(jié))整數(shù),t表10字節(jié)
偽指令
DB:8位整數(shù)
DW:16位整數(shù)
DD:32位整數(shù)或?qū)崝?shù)
DQ:64位整數(shù)或?qū)崝?shù)
DT:定義80位(10字節(jié))整數(shù)
#################################################################################################################
入棧和出棧的匯編指令 push、pop 地址從高到低
PUSH(Push onto the stack)進棧
POP(Pop from the stack)出棧 有push就就要有pop
PUSH 指令首先減少 ESP 的值,再將源操作數(shù)復(fù)制到堆棧。操作數(shù)是 16 位的,則 ESP 減 2;操作數(shù)是 32 位的,則 ESP 減 4;操作數(shù)是 64 位的,則 ESP 減 8。
POP 指令首先把 ESP 指向的堆棧元素內(nèi)容復(fù)制到一個 16 位或 32 位目的操作數(shù)里,再增加 ESP 的值。如果操作數(shù)是 16 位的,ESP 加 2,如果操作數(shù)是 32 位的,ESP 加 4,如果操作數(shù)是 64 位的,ESP 加 8。
標志寄存器傳送指令
PUSHF(push the flags) 標志進棧
POPF(pop the flags) 標志出棧
call:過程調(diào)用,調(diào)用一個過程(即函數(shù)或者子程序)
ret:過程返回,返回指令,RET(從過程返回)指令將處理器轉(zhuǎn)到該過程被調(diào)用的程序點上。call指令將其返回地址壓入堆棧,再把被調(diào)用過程的地址復(fù)制到指令寄存器。當過程準備返回時,它的ret指令從堆棧把返回地址彈回到指令寄存器。
#################################################################################################################
算術(shù)指令:
mul(multiply) 乘法指令,兩個數(shù)值相乘
div 除法指令
divr 除法指令
imul eax,ebx,5 imul指令有3個操作數(shù),第1個為目的操作數(shù),第2個和第3個為進行乘法的源操作數(shù)
add:兩個數(shù)值相加 add ax,8 將寄存器AX里的數(shù)值加上8
sub(subtraction):從一個數(shù)值減去另一個數(shù)值 sub ax,18將寄存器AX里的數(shù)值減去18
subr:減法指令
xor:異或
OR :在兩個操作數(shù)的對應(yīng)位之間進行(按位)邏輯或(OR)操作,并將結(jié)果存放在目標操作數(shù)里:OR destination, source
and是按位“與”操作,在兩個操作數(shù)的對應(yīng)位之間進行(按位)邏輯與(and)操作,并將結(jié)果存放在目標操作數(shù)里:AND destination,source。當且僅當兩操作數(shù)對應(yīng)位都為“1”時結(jié)果的相應(yīng)位為“1”,否則結(jié)果相應(yīng)位為“0”。例:1101B AND 0100B = 0100B
inc(increase)指令表示寄存器或者內(nèi)存操作數(shù)加1
dec(decrease)指令表示寄存器或者內(nèi)存操作數(shù)減1
neg(negate反面,對立面,非)指令通過把操作數(shù)轉(zhuǎn)換為其二進制補碼,將操作數(shù)的符號取反
cmp(compare):比較指令,進行比較兩個操作數(shù)的大小,cmp執(zhí)行從目的操作數(shù)里減去源操作數(shù)的隱含減法操作,并且不修改任何操作數(shù):CMP destination,source
標志位
當實際的減法發(fā)生時,CMP 指令按照計算結(jié)果修改溢出、符號、零、進位、輔助進位和奇偶標志位。
如果比較的是兩個無符號數(shù),則零標志位和進位標志位表示的兩個操作數(shù)之間的關(guān)系如右表所示:
如果比較的是兩個有符號數(shù),則符號標志位、零標志位和溢出標志位表示的兩個操作數(shù)之間的關(guān)系如右表所示:
mov(move):傳送(分配)數(shù)值 mov ax,18 將18送入寄存器AX
mov ax ,bx 將寄存器BX數(shù)據(jù)送入寄存器AX
當指令有多個操作數(shù),第一個操作數(shù)為目的操作數(shù),第2個操作數(shù)為源操作數(shù)
movzx指令(進行全零并傳送)將源操作數(shù)復(fù)制到目的操作數(shù),并把目的操作數(shù)0擴展到16位或者32位。這條指令只用于無符號正數(shù)
movsx指令(進行符號擴展并傳送)將源操作數(shù)內(nèi)容復(fù)制到目的操作數(shù),并把目的操作數(shù)符號0擴展到16位或者32位。這條指令只用于有符號正數(shù)
loop:循環(huán)指令,正式成為按照ECX計數(shù)器循環(huán),將程序塊重復(fù)特定次數(shù)。ECX自動成為計數(shù)器,每循環(huán)一次計數(shù)值減1
xchg(交換數(shù)據(jù),exchange)指令交換兩個操作數(shù)內(nèi)容
lea(Load effective address)取有效地址,也就是取偏移地址。
nop 空指令
############################################################################################################################################
需要注意的是32位是由棧來傳參的,64位前六個參數(shù)由寄存器RDI、RSI、RDX、RCX、R8、R9依次傳參,超過第六個的參數(shù)由棧來傳參
8位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL
16位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP
32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
32位 16位 8位(高) 8位(低)
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL
其他通用寄存器只能利用32或者16位名稱為訪問:
32位 16位
ESI SI
EDI DI
EBP BP
ESP SP
寄存器
EAX:累加(Accumulator)寄存器,常用于函數(shù)返回值
EBX:基址(Base)寄存器,以它為基址訪問內(nèi)存
ECX:計數(shù)器(Counter)寄存器,常用作字符串和循環(huán)操作里的計數(shù)器
EDX:數(shù)據(jù)(Data)寄存器,常用于乘除法和I/O指針
ESI:源變址寄存器
EDI:目的變址寄存器
ESP:堆棧(Stack)指針(Pointer)寄存器,指向堆棧頂部
EBP:基址(Base)指針(Pointer)寄存器,指向當前堆棧底部
EIP:指令寄存器,指向下一條指令的地址
基本程序執(zhí)行寄存器
寄存器為直接位于CPU內(nèi)的高速存儲位置
8個通用寄存器,6個段寄存器,一個處理器狀態(tài)寄存器(EFLAGS),和一個指令指針寄存器(EIP)。(指令寄存器:Instruction pointer register)
通用寄存器:主要用于算術(shù)運算和數(shù)據(jù)傳輸。EAX寄存器的低16位在利用過程可用AX表示,AX寄存器的高8位被稱為AH,低8位被稱為AL。同樣的關(guān)系也存在于EAX,EBX,ECX,EDX寄存器
乘除指令默認利用EAX。它常常被稱為擴展累加器(extended accumulator)寄存器
CPU默認利用ECX為循環(huán)計數(shù)器(circulate)
ESP用于尋址堆棧(一類系統(tǒng)內(nèi)存結(jié)構(gòu))數(shù)據(jù)。它極少用于一般算術(shù)運算和數(shù)據(jù)傳輸,通常被稱為擴展堆棧指針(extended stack pointer)寄存器
ESI和EDI用于高速存儲器傳輸指令,有時也被稱為擴展源地址寄存器(extended source index)和擴展目的地址寄存器(extended destination index)
高級語言通過EBP來引用堆棧里的函數(shù)參數(shù)和局部變量。除了高級編程,它不用于一般算術(shù)運算和數(shù)據(jù)傳輸。它常常被稱為擴展幀指針(extended frame pointer)寄存器
EBP和ESP作為指針的寄存器,常用于椎棧操作。通常,它被高級語言編譯器用以建造‘堆棧幀’來保存函數(shù)或過程的局部變量,EBP指向棧低,ESP指向棧頂。
指令指針:指令指針(EIP)寄存器里包含下一條將要執(zhí)行指令的地址。某些機器指令能控制EIP,令程序分支轉(zhuǎn)向到一個新位置。
EFLAGS寄存器:EFLAGS(或者Flags)寄存器包含了獨立的二進制位,用于控制CPU的操作,或者是反應(yīng)一些CPU操作的結(jié)果。有些指令可以測試和控制這些單獨的處理器標志位。
32位標志寄存器 EFLAGS
用于標識當前的一些狀態(tài)
CF:進位標志
OF:溢出標志
SF:符號標志
ZF:零標志
AC:輔助進位標志
PF:奇偶標志
總結(jié)
以上是生活随笔為你收集整理的CTF-汇编语言归纳的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象三个特征总结
- 下一篇: 为什么使用lambda表达式