汇编基础

状态: 进行中

基础知识

原码反码补码

Untitled

反码=除首位(正负值)取反

补码=反码+一

移码=补码正负值取反

仅限有符号的值

  • 16位处理器是实模式

  • 32 64位处理器是保护模式

  • EIP是指令指针寄存器 只想下一个操作的指针

Visual Studio →汇编

  1. 新建空项目
  2. 选中右键“生成自定义”,选择MASM生成规则
  3. 新建一个.asm后缀新文件
  4. 选中项目→属性→链接器→系统→子系统选<控制台(SUBSYSTEM:CONSOLE)>
  5. 选中项目→属性→链接器→高级→入口点 填“main”

Untitled

Untitled

Untitled

.586
.MODEL flat,stdcall 
;使用的内存模式flat 使用同一4G段stdcall函數調用約定

includelib user32.lib
includelib kernel32.lib
;導入庫

;Win32API原型
ExitProcess PROTO, dwExitCode :DWORD
MessageBoxA PROTO hWnd :DWORD,lpText:BYTE,lpCaption:BYTE,uType:DWORD

;數據段/節區

;已初始的數據段
.data
Number DWORD 0
text db "shellcode" ,0

;未初始的數據段
.data?

;常量
.const

;代碼段
.code
main proc
	mov eax ,5
	mov ebx ,6
	add eax,ebx
	add eax,Number
	push 0
	push offset text
	push offset text
	push 0
	call MessageBoxA
	sub esp,16
	call ExitProcess
main ENDP

END main

段寄存器

  • CS(Code Segment):代码段寄存器;
  • DS(Data Segment):数据段寄存器;
  • SS(Stack Segment):堆栈段寄存器;
  • ES(Extra Segment):附加段寄存器。

32位寄存器逻辑结构

EAX

  • 累加器,操作数和结果数据累加,返回值和数据结果存储在此处

EBX

  • 基地址,DS短的数据指针,在内存寻址的时候存放基地址。亦可用作其他作用

ECX

  • 计数器,字符串和循环操作的计数器

EDX

  • 用于存储部分乘法结果或部分除法被除数

EBP

  • 基址指针,SS段的数据指针,栈底指针
  • 只能分为BP16位寄存器,没有8位寄存器

ESP

  • 栈桢指针,一般指向栈顶,所以也被称为栈顶指针
  • 只能划分为SP16位寄存器

EDI

  • 字符串操作的目标指针,ES段的数据指针
  • 只能划分为16位寄存器DI

ESI

  • 字符串操作的源指针,SS段的数据指针
  • 只能划分为16位寄存器SI

EIP

  • 指令指针寄存器

冯·诺伊曼体系结构

算数运算

add

mov eax ,5
mov ebx ,5
add eax,ebx

sub

mov eax ,5
mov ebx ,5
sub eax,ebx

mul 乘法

mov eax ,5
mov ebx ,5
mul ebx
;eax == 00000019

div 除法

mov ax ,1000
mov bl ,50
div bl
mov ah,ah ;存商
mov al,al ;存余数

inc 自增+1

mov eax ,1000
inc eax

dec 自减-1

逻辑运算

AND与

mov eax ,5
mov ebx ,6
and eax,ebx
;eax ==4

OR或

mov eax ,5
mov ebx ,6
or eax,ebx
;eax ==7

XOR异或

mov eax ,5
mov ebx ,6
xor eax,ebx
;eax ==3

NOT非

mov eax ,5
not eax
;eax ==-6

堆栈操作

ebp寄存器指向栈底,栈定会上下移动

PUSH 压栈指令

ESP-4,留出空间,内容压入

POP 出栈指令

ESP+4,将栈顶数据弹出给指令目标,清除空间

栈的作用

  1. 存储少量数据
  2. 保存寄存器环境,以供恢复
  3. 传递参数

数据移动指令

mov

lea

将数据传入寄存器

lea eax,dword ptr ss:[esp-4]

Untitled

数据交换指令

xchg

xchg eax,dword ptr ss:[esp-4]

Untitled

CMP 比较指令

mov eax,4
mov ebx,5
cmp eax.ebx
查看EFLAGS寄存器

汇编标志位EFLAGS

EFLAGS寄存器标识位

  • CF 进位(carry)标志位,在无符号运算时,产生进位或借位,CF=1
  • PF 奇偶(Parity)标志位,结果说有bit中1的个数为偶数,PF=1,奇数=0
  • AF 辅助进位标志位,运算过程中看最后四位,不论长度多少,最后四位向前进位或借位,AF=1
  • ZF 零(Zero)标志位,执行后结果为0,ZF=1,结果为不为0.则ZF=0
  • SF 符号(SF)标志位,结果为负,则为1
  • TF 调试标志位,TF=1,处理器单步执行,每次执行一条指令
  • IF 中断允许标志位,控制8086是否允许接收外部中断请求,IF=1,允许
  • DF 方向标志位,DF=0,si,di递增,反之递减,cld设置df=0,std设置df=1
  • OF 溢出标志位,运算结果发生溢出,OF=1

TEST 指令

JCC指令

  • JMP 无条件跳转
  • JZ/JE ZF=1 ,运算结果为0时,跳转
  • JNZ/JNE ZF=0 ,运算结果不为0时,或者比较不相等,跳转
  • JBE/JNA CF=1/ZF=1 低于等于/不高于 跳转
  • JNBE/JA CF=0/ZF=0 不低于等于/高于跳转
  • JL/JNGE SF ≠ OF 小于/不大于等于跳转
  • JNL/JGE SF = OF 不小于/大于等于

JMP 无条件跳转

.586
.MODEL flat,stdcall 
.code
main proc

	mov eax,4
flag:
	add eax,1
	jmp flag

;无条件跳转 

main ENDP

END main

for (i=4,i<10) {i++}

  mov eax,4
	mov ebx,10
	
flag:
	add eax,1
	cmp eax,ebx
	JNZ flag

Untitled

串操作指令

  • MOVS 字符串传送指令
mov edi,esp
mov dword ptr ss:[esp],0
mov esi,ebp
movs dword ptr es:[edi],dword ptr ds:[esi]

  • STOS 字符串存储指令
mov eax,11223344
mov edi,esp
stos dword ptr es:[edi]

eax → edi,小端序

  • REP 指令 重复前缀指令

CALL指令

相当于

push eip
jmp operate

retn 返回

pop eip
jmp eip

汇编中的函数

过程调用方式(伪指令):

function proc
	code
function endp

参数传递方式:

  • 寄存器传参

Untitled

  • 堆栈传参

Untitled

Win32汇编入门

.586
.MODEL flat,stdcall 

includelib user32.lib
includelib kernel32.lib

ExitProcess PROTO, dwExitCode :DWORD
MessageBoxA PROTO hWnd :DWORD,lpText:BYTE,lpCaption:BYTE,uType:DWORD

.data
text db "shellcode" ,0

.code
main proc
	push 0
	push offset text
	push offset text
	push 0
	call MessageBoxA
	add esp,16 ;堆棧平衡將堆棧中的4個dword彈出
	call ExitProcess
main ENDP

END main
comments powered by Disqus