1. 程式人生 > 實用技巧 >CTF-RE-學習記錄-彙編-2

CTF-RE-學習記錄-彙編-2

彙編工具DTDebug

下載後設置好odd與外掛路徑,同時在屬性中設定為管理員身份執行(無Administrator許可權進入的時候一直在提示)

暫存器

儲存資料:

CPU>記憶體>硬碟

32位CPU: 8 16 32

64位CPU: 8 16 32 64

EIP:儲存CPU下一次執行的指令集,不能作他用

通用暫存器

32位暫存器

32位 16位 8位
WAX AX AL(低8位)
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH(高8位)
EBP BP CH
ESI SI DH
EDI DI BH

8位,16位暫存器同時存在於32位之中,8位指令改32位中的1位,16位改4位

MOV指令

  1. 立即數到暫存器

  2. 暫存器到暫存器

  3. 暫存器到記憶體

  4. 記憶體到暫存器

    MOV EAX,1//把1儲存到EAX暫存器
    MOV EDX,EAX//把EAX裡面的值存到EDX
    

記憶體相關

mov byte ptr ds[儲存地址]

已經申請過的地址,在堆疊視窗內找,可以直接使用

一個位元組-Byte

兩個位元組-WORD

四個位元組-DWORD

MOV DWORD PTR DS:[],EAX//前提需要保證寬度相同

記憶體地址的5種形式

  1. [立即數]

    讀取記憶體的值:

    MOV EAX,DWORD PTR DS:[0x13FFC4]
    

    向記憶體寫入資料

    MOV DWORD PTR DS:[0x13FFC4],EAX
    
  2. [reg] reg代表暫存器 可以是8個通用暫存器中的一個

    讀取記憶體的值:

    MOV ECX,0x13FFD0
    MOV EAX,DWORD PTR DS:[ECX]
    

    向記憶體中寫入資料:

    MOV EDX,0x13FFD8
    MOV DWORD PTR DS:[EDX],0x87654321
    
  3. [reg+立即數]

    讀取記憶體的值:

    MOV ECX,0x13FFD0
    MOV EAX,DWORD PTR DS:[ECX+4]
    

    向記憶體中寫入資料:

    MOV EDX,0x13FFD8
    MOV DWORD PTR DS:[EDX+0xC],0x87654321
    
  4. [reg+reg*{1,2,4,8}] (陣列的彙編形式)

    代表八個32位的暫存器加上八個32位暫存器乘以1,2,4,8

    讀取記憶體的值:

    MOV EAX,13FFC4
    MOV ECX,2
    MOV EDX,DWORD PTR DS:[EAX+ECX*4]
    

    向記憶體中寫入資料:

    MOV EAX,13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+EAX*4],87654321
    
  5. [reg+reg*{1,2,4,8}+立即數]

    讀取記憶體的值:

    MOV EAX,13FFC4
    
    MOV ECX,2
    
    MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
    

    向記憶體中寫入資料:

    MOV EAX,13FFC4
    MOV ECX,2
    MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
    

資料的儲存模式

大端模式:資料高位在低位,資料低位在高位

小端模式:資料低位在低位,資料高位在高位

MOVS指令

BYTE/WORD/DWORD分別簡寫為MOVSB MOVSW MOVSD

MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]

DF位置:每次MOVS指令之後地址減少相應變更(加減具體看DF的值)位元組的地址

DF的值表示方向位:0為+,1為-

STOS指令:將AL/AX/EAX的值儲存到[EDI]的指定儲存單元

STOS BYTE PTR ES:[EDI]

REP指令

MAV ECX,10

REP MOVESD//ECX作為REP指令的計數器

EAX通常用作返回值

ESP,EBP通常用作堆疊

ESI,EDI通常用作串複製的首地址和目標地址

堆疊相關指令

堆疊的使用是從大地址向小地址使用

ESP 棧指標暫存器

堆疊的使用

堆疊使用之後要改變ESP指向的位置,防止被覆蓋

例如:

SUB ESP,8

使用之後取消:

ADD ESP,8

心得

C語言當中區域性變數為何賦初始值的原因也就昭然若揭了,因為在記憶體中ESP暫存器只是指向了未被使用的堆疊,堆疊裡面的內容會被覆蓋,但是不會被清空,因此建立變數以後他的初始值是未知的,因此建立區域性變數需要賦初值

PUSH&POP指令

功能:

  1. 將數壓入棧頂
  2. 棧頂指標+1
PUSH DWORD PTR DS:[18FFA4]
POP EAX
POP ECX

修改EIP的指令

KMP指令

MOV EIP簡寫為JMP

CALL指令