滴水逆向初級-彙編(一)

1.1.進制

進制的定義:
八進制的定義:由八個符號組成,分別是01234567逢八進一。
十進制的定義:由十個符號組成,分別是0123456789逢十進一。
N進制的定義:由N個符號組成,逢N進一。shell

1.二、進制的運算

八進制運算數據結構

2+3=5
2*3=6
4+5=11
4*5=24
277+333= 632
276*54= 162
237-54= 20250
234/4= 47

#八進制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27

八進制加法表函數

2+3=5
2*3=6
4+5=11
4*5=24
277+333= 632
276*54= 162
237-54= 20250
234/4= 47

#八進制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27

八進制加法表
image
八進制乘法表
image工具

1.3.二進制簡寫形式

計算機爲何使用二進制
計算機是須要用電的,電路只有兩種狀態: 1真(通電) 0假(未通電)
計算機中存儲的任何文件、接收的任何指令都是由0和1組成的編碼

二進制與十六進制操作系統

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
 0	  1	   2	3	  4   5	   6	7	  8	  9	   A	 B	  C	   D   E    F

1.4.數據寬度

數據寬度
數學上的數字,是沒有大小限制的,能夠無限的大。但在計算機中,因爲受硬件的制約,數據都是有長度限制的(咱們稱爲數據寬度),超過最大寬度的數據會被丟棄。debug

計算機中常見的數據寬度:3d

1)位(BIT) 1位
2)字節(Byte) 8位
3)字(Word) 16位
4)雙字(Doubleword) 32位指針

存儲範圍:
字節(Byte): 0 ~ 0xFF
字(Word): 0 ~ 0xFFFF
雙字:0~ 0xFFFFFFFF
若是要存儲的數據超過最大寬度,那麼多餘的數據將被丟棄!code

1.5.無符號數有符號數

無符號數的編碼規則

10011010
十六進制:0x9A
十進制:154

有符號數的編碼規則

正數編碼規則(第一位是0),若是是正數就和無符號數編碼規則同樣
00011010

負數編碼規則(第一位是1)
10011010

1.6.原碼反碼補碼

有符號數的編碼規則
原碼:最高位爲符號位,其他各位爲數值自己的絕對值
反碼:
正數:反碼與原碼相同
負數:符號位爲1,其他位對原碼取反
補碼:
正數:補碼與原碼相同
負數:符號位爲1,其他位對原碼取反加1

-1
原碼:10000001
反碼:11111110
補碼:11111111     (負數在計算機裏面是採用補碼的形勢存儲的)

-7
原碼:10000111
反碼:11111000
補碼:11111001     (負數在計算機裏面是採用補碼的形勢存儲的)

1.7.計算機不會作加法

image
image
image
image
image
image

1.8.位運算之加減乘除

4+5=的運算過程
image
4-5=?的運算過程
image

1.9.彙編環境安裝

下載DTdebug工具,打開後設置UDD和plugin的路勁。Options-->Appearance
image
image

1.10.通用寄存器

1寄存器
存儲數據:
CPU>內存>硬盤
32位CPU: 8 16 32
64位CPU: 8 16 32 64

二、通用寄存器
32位通用寄存器:
EAX
ESP
ECX
EBP
EDX
ESI
EBX
EDI

三、MOV指令
<1> 當即數到內存
<2>寄存器到內存
<3>內存到寄存器

按F8單步運行
image
4.通用寄存器
image

1.11.內存

image
二、內存地址
<1>內存太大無法起名字,因此只能用編號。當咱們想向內存中存儲數據,或者從內存中讀取數據時,必須用到這個編號,就像寫信必需要寫收信人地址同樣。
<2>這個編號又稱爲內存地址(32位,前面0能夠省略)。

三、往內存中寫入值

MOV DWORD PTR DS:[19FF90],12345678

# DWORD表示四個字節長度
#PTR DS:[19FF90]表示內存地址

1.12.內存地址的五種形式

一、形式一: [當即數]
讀取內存的值:
MOV EAX,DWORD PTR DS:[Ox13FFC4]
向內存中寫入數據:
MOV DWORD PTR DS:[0x13FFC4],EAX

二、形式二: [reg] reg表明寄存器能夠是8個通用寄存器中的任意一個
讀取內存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向內存中寫入數據:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321

三、形式三: [reg+當即數]
讀取內存的值:
MOV ECX,0x1 3FFD0
MOV EAX,DWORD PTR DS:[ECX+4]
向內存中寫入數據:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC],0x87654321

四、形式四: [reg+reg*{1,2,4,8}]
讀取內存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX4]
向內存中寫入數據:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX
4],87654321

五、形式五: [reg+reg*{1 ,2,4,8}+當即數]
讀取內存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX4+4]
向內存中寫入數據:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX
4+4],87654321

1.13.存儲模式

image
二、DTDEBUG內存窗口的使用
<1>分別以字節/字/雙字形式來查看內存(db dw dd)
image
<2>向內存中寫入四個字節的數據,並觀察存儲形式(大端存儲/小端存儲)
image

1.14.經常使用匯編指令

一、MOV指令
指令格式:
一、MOV r/m8,r8 r通用寄存器
二、MOV r/m16,r16 m表明內存
三、MOV r/m32,r32 ; imm表明當即數
四、MOVr8,r/m8 r8表明8位通用寄存器
五、MOV r16,r/m16 m8表明8位內存
六、MOV r32,r/m32 ; imm8表明8位當即數
七、MOV r8, imm8
八、MOV r16, imm16
九、MOV r32, imm32

二、ADD指令
指令格式:
ADD r/m8, imm8
ADD r/m16, imm16
ADD r/m32,imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32

三、SUB指令
指令格式:
SUB r/m8, imm8
SUB r/m1 6,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32

四、AND指令
AND r/m8, imm8
AND r/m16,imm16
AND r/m32,imm32
AND r/m16, imm8
AND r/m32, imm8
AND r/m8, r8
AND r/m16, r16
AND r/m32, r32
AND r8, r/m8
AND r16, r/m16
AND r32, r/m32

五、OR指令
OR r/m8, imm8
OR r/m16 ,imm16
OR r/m32,imm32
OR r/m16, imm8
OR r/m32, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32

六、XOR指令
XOR r/m8, imm8
XOR r/m16,imm16
XOR r/m32 ,imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32

七、NOT指令
NOT r/m8
NOT r/m16
NOT r/m32

1.15.內存複製指令

一、MOVS指令:移動數據內存-內存
BYTENWORD/DWORD
MOVS BYTE PTR ES:[EDJ,BYTE PTR DS:[ESI] 簡寫爲: MOVSB
MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 簡寫爲: MOVSW
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 簡寫爲: MOVSD

例子: .
MOV EDI,12FFD8
MOV ESI,12FFD0
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
觀察EDI的值
修改標誌寄存器中D位的值,而後在執行下面的指令:
MOV EDI,12FFD8
MOV ESI,12FFD0MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

二、STOS指令: 將AI/AX/EAX的值存儲到[EDI]指定的內存單元
STOS BYTE PTR ES:[EDI] 簡寫爲STOSB
STOS WORD PTR ES:[EDI] 簡寫爲STOSW
STOS DWORD PTR ES:[EDI] 簡寫爲STOSD

例子:

MOV EAX, 12345678 觀察EDI的值
MOV EDI, 12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改標誌寄存器中D位的值,而後在執行下面的指令:
MOV EAX, 12345678 觀察EDI的值
MOV EDI, 12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]

三、REP指令: 按計數寄存器(ECX)中指定的次數重複執行字符串指令
MOV ECX,10
REP MOVSD
REP STOSD

1.16.堆棧相關指令

一、什麼是堆棧?
1)就是一塊內存,操做系統在程序啓動的時候已經分配好的,供程序執行時使用。
2)和數據結構的堆棧無關。
3)查看堆棧。

二、棧指針寄存器
ESP中存儲了當前的堆棧用到哪裏了

三、堆棧的使用
<1>存儲數據
<2>修改棧頂指針

四、PUSH指令
<1>向堆棧中壓人數據
<2>修改棧項指針ESP寄存器
指令格式:
一、PUSH r32
二、PUSH r16
三、PUSH m16
四、PUSH m32
五、PUSH imm8/imm1 6/imm32

五、POP指令:
<1>將棧頂數據存儲到寄存器/內存
<2>修改棧項指針ESP寄存器
指令格式:|
一、POP r32
二、POPr16
三、POP m16
四、POP m32

1.17.修改EIP的指令

一、JMP指令:
MOV EIP,寄存器/當即數/內存 簡寫爲 JMP寄存器/當即數/內存

二、CALL指令:
PUSH下一行地址
MOV EIP,當即數/寄存器/內存 簡寫爲: CALL當即數/寄存器/內存
與JMP惟--的區別:
在堆棧中存儲Call指令下一-行地址

三、RET指令:
ADD ESP,4
MOV EIP,[ESP-4]

簡寫爲: RET

1.18.彙編眼中的函數

一、什麼是函數
函數就是一系列指令的集合,爲了完成某個會重複使用的特定功能。
例子:向寄存器中賦值

二、如何執行一個函數?即函數調用
<1>用JMP來執行函數
<2> 用CALL來執行函數

三、 什麼是參數?什麼是返回值?
例子:編寫一個函數,可以獲得任意2個整數的值。

1.19.堆棧平衡

什麼是堆棧平衡?
1)若是要返回父程序,則當咱們在堆棧中進行堆棧的操做的時候,必定要保證在RET這條指令以前,ESP指向的是咱們壓入棧中的地址。
2)若是經過堆棧傳遞參數了,那麼在函數執行完畢後,要平衡參數致使的堆棧變化。

1.20.JCC指令

一、JE, JZ 結果爲零則跳轉(相等時跳轉) ZF=1
二、JNE, JNZ 結果不爲零則跳轉(不相等時跳轉) ZF=0
三、JS 結果爲負則跳轉 SF=1
四、JNS 結果爲非負則跳轉 SF=0
五、JP, JPE 結果中1的個數爲偶數則跳轉 PF=1
六、JNP, JPO 結果中1的個數爲偶數則跳轉 PF=0
七、J0 結果溢出了則跳轉 0F=1
八、JNO 結果沒有溢出則跳轉 0F=0

九、JB, JNAE 小於則跳轉(無符號數) CF=1
十、JNB, JAE 大於等於則跳轉(無符號數) CF=0
十一、JBE, JNA 小於等於則跳轉(無符號數) CF=1 or ZF=1
十二、JNBE, JA 太於則跣轉(無符號數) CF=0 and ZF=0中
1三、JL, JNGE 小於則跳轉(有符號數) SF≠OF

1四、JN, JGE 大於等於則跳轉(有符號數) SF=OF
1五、JLE, JNG 小於等於則跳轉(有符號數) ZF=1 or SF≠0F
1六、JNLE, JG 因於則來轉(有符號數) ZF=0 and SF=OF

一、標誌寄存器:EFLAGS
image
二、CF (bit 0) [Carry fiag]
若算術操做產生的結果在最高有效位(most-significant bit)發生進位或借位則將其置1,反之清零。
這個標誌一般用來指示無符號整型運算的溢出狀態。

例:
MOV AL,0xFE MOV AL,0x7F
ADD AL,2 或者 SUB AL ,0xFF

三、PF(bit 2) [Parity flag]
若是結果的最低有效字節(least-significant byte)包含偶數個1位則該位置1,不然清零。

利用PF可進行奇偶校驗檢查:
須要傳輸"11001110",數據中含5個"1", 因此其奇校驗位爲"0",同時把"110011100"傳輸給接收方,接收方收到數據後再- - 次計算奇偶性,"110011100"中仍然含有5個"1",因此接收方計算出的奇校驗位仍是"0",與發送方一致,表示在這次傳輸過程當中未發生錯誤

例子:
MOV AL,OCE
ADDAL,0

四、AF(bit 4) [Adjust Flag]
若是算術操做在結果的第3位發生進位或借位則將該標誌置1,不然清零。
這個標誌在BCD(binary-code decimal)算術運算中被使用。

五、ZF(bit 6) [Zero flag]
若結果爲0則將其置1,反之清零。
常常與CMP或者TEST等指令-起使用:

例1:判斷2個值是否相等

MOV EAX, 100
MOV ECX, 100
CMP EAX, ECX
(CMP指令至關幹SUB指令.可是相減的結果並不保存到第一個操做數中)

例2:判斷某個值是否爲0
TEST EAX,EAX
(TEST指令至關於AND指令,可是與的結果並不保存到第-一個操做數中)

六、SF(bit 7) [Sign flag]
該標誌被設置爲有符號整型的最高有效位。
(0指示結果爲正,反之則爲負)
例子:
MOV AL ,0x7F MOV AL ,0xFE
ADD AL,2 ADDAL,2

七、OF(bit 11) [Overflow flag]
溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。

能夠這樣理解:
若是是無符號數運算,是否溢出看CF位。
若是是有符號數運算,是否溢出看OF位。
例子:
MOV AL ,0x7F
ADD AL,2

八、DF(bit 10) [Direction Flag] 這個方向標誌控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。設置DF 標誌使得串指令自動遞減(從高地址向低地址方向處理字符串),清除該標誌則使 得串指令自動遞增。 STD以及CLD指令分別用於設置以及清除DF標誌。

相關文章
相關標籤/搜索