暑期夏令营

二进制安全

Day 1

0x1 高级汇编语言

1.debug 命令

-r 查看、改变寄存器内容

-d 查看内存中的内容

-e 改变内存中的内容

-u 将内存中的机器指令翻译成汇编指令

-t 执行一条机器指令

-p 执行int指令

-g 运行到有断点处

2.汇编代码的编译过程

环境准备:

(1)文本编辑器(010 Editor)

(2)编译器masm

(3)链接器link

(4)调试器debug

1
2
3
masm file.asm;
link file;
debug file.exe

3.寄存器的讲解

4个数据寄存器(EAX、EBX、ECX和EDX)

2个变址寄存器(ESI和EDI)

2个指针寄存器(ESP和EBP)

6个段寄存器(ES、CS、SS、DS、FS和GS)

1个指令指针寄存器(EIP)

1个标志寄存器(EFlags)

寄存器的分类:

1

(1)数据段寄存器

  • 寄存器EAX称为基地址寄存器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入输出等操作,他们的使用频率很高。EAX还通常用于存储函数的返回值。
  • 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用。
  • 寄存器ECX称为计数寄存器(Count Register)。在循环和字符串操作时,用它来控制循环次数;在位操作中,当移位多时,要用CL来指明移位的位数。
  • 寄存器EDX称为数据段寄存器(Data Register)。在进行乘、除运算时,它可以作为默认的操作数参与运算,也可以用于存放I/O的端口地址。

(2)变址寄存器

32位的CPU中有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

ESI通常在内存操作指令中作为源地址的指针使用,而EDI通常在内存操作指令中作为目的指针使用。DE/ES通常是默认段寄存器或选择寄存器。

在很多字节串指令中,DS:ESI指向源串,而ES:EDI指向目标串。

(3)指针寄存器

寄存器ESP、ESP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可以实现多种存储器操作数的寻址方式,为不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算数逻辑运算的操作数和运算结果。

他们主要用于访问堆栈内的存储单元,并规定EBP为基指针(Base Pointer)寄存器,通过它减去一定的偏移值,来访问栈中的元素;ESP为堆栈指针(Stack Pointer)寄存器,它始终指向栈顶。

(4)段寄存器

寄存器 用途
CX 计数器
SI 串操作中的源指针
DI 串操作中的目的指针
BP 存取堆栈的指针
SP 堆栈指针

(5)指令指针寄存器

32位CPU把指令指针扩展到32位,并记作EIP。指令指针EIP是存放下次将要执行的指令在代码段的偏移量。

4.指令系统讲解

(1)数据传送指令

1
2
3
4
5
MOV:把源操作数送给目的操作数
XCHG:交换两个操作数的数据
PUSH,POP:把操作数压入或取出堆栈
PUSHF,POPF,PUSHA,POPA:堆栈指令群
LEA,LDS,LES:取地址寄存器

(2)算数运算指令

1
2
3
4
5
6
ADD,ADC:加法指令
SUB,SBB:减法指令
INC,DEC:把OP的值加1或减一
NEG:将OP的符号反相(取二进制补码)
MUL,IMUL:乘法指令
DIV,IDIV:出发指令

(3)位运算指令

1
2
3
AND,OR,XOR,NOT,TEST:执行BIT和BIT之间的逻辑运算
SHR,SHL,SAR,SAL:移位指令
ROR,ROL,RCR,RCL:循环移位指令

(4)程序流控制指令集

1
2
3
4
5
6
7
8
CLC,STC,CMC:设定进位标志
CLD,STD:设定方向标志
CLI,STI:设定中断标志
CMP:比较OP1和OP2的值
JMP:跳往指定地址执行
LOOP:循环指令集
CALL,RET:子程序调用,返回指令
INT,IRET:中断调用及返回指令。在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值返回寄存器。

(5)条件转移指令

1
2
3
4
5
6
7
JXX:当特定条件成立则跳往指定地址执行
常用的有:
Z:为0跳转
G:大于则跳转
L:小于则跳转
E:等于则跳转
N:取相反条件

(6)字符串操作指令

1
2
3
4
MOVSB,MOVSW,MOVCD:字符串传送指令
CMPSB,CMPSW,CMPSD:字符串比较指令
SCASB,SCASW:字符串搜索指令
LODSB,LODSW,STOSB,STOSW:字符串载入或存储指令

持续更新中