1. 程式人生 > 實用技巧 >軟體測試基礎

軟體測試基礎

技術標籤:CTFRE彙編

彙編工具DTDebug

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

暫存器

儲存資料:

CPU>記憶體>硬碟

32位CPU: 8 16 32

64位CPU: 8 16 32 64

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

通用暫存器

32位暫存器

32位16位8位
WAXAXAL(低8位)
ECXCXCL
EDXDXDL
EBXBXBL
ESPSPAH(高8位)
EBPBPCH
ESISIDH
EDIDIBH

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指令