日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTF-汇编语言归纳

發(fā)布時間:2024/9/27 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTF-汇编语言归纳 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

內(nèi)容更新是由低向高遞增的

內(nèi)容如下:
xor rax, rax #xor rax,rax是對rax的清零運算操作

條件跳轉(zhuǎn)(一般配合cmp使用)

下表展示了基于零標志位、進位標志位、溢出標志位、奇偶標志位和符號標志位的跳轉(zhuǎn)。


此表為1) 相等性的比較

  • 無符號數(shù)比較
    基于無符號數(shù)比較的跳轉(zhuǎn)如下表所示。操作數(shù)的名稱反映了表達式里操作數(shù)的順序(比如 leftOp < rightOp)。下表里的跳轉(zhuǎn)僅在比較無符號數(shù)值時才有意義。有符號操作數(shù)使用不同的跳轉(zhuǎn)指令。
  • 有符號數(shù)比較
    下表列岀了基于有符號數(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:奇偶標志

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的CTF-汇编语言归纳的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。