汇编中常见指令解释

这篇博文很有趣,竟然将hexo的content设置给冲垮了,感觉里面写了不可思议的东西,十分值得我去深挖!!!


1. pop 和 push

常见的汇编指令源码

pop机器码 含义 push机器码 含义
5f pop edi 57 push edi
5e pop esi 56 push esi
5d pop ebp 55 push ebp
5c pop esp 54 push esp
5b pop ebx 53 push ebx
5a pop edx 52 push edx
59 pop ecx 51 push ecx
58 pop eax 50 push eax

2. call


call (short) eax
1.将当前指令的下一条指令的地址压入栈中;
2.JMP到EAX这个地址。

call (long) eax
1.将CS压入栈中;
2.将当前指令的下一条指令的地址压入栈中;
2.JMP到EAX这个地址。

3. retn 和 retf


retn
1.将当前的ESP中指向的地址出栈;
2.JMP到这个地址。

retn k
1.将当前的ESP中指向的地址出栈;
2.JMP到这个地址;
3.弹出栈顶的k个字节的数据

retf
1.将当前的ESP中指向的地址出栈给EIP;
2.将当前的ESP中指向的地址出栈给CS;
2.JMP到这个地址。

4. jmp


jmp短跳
\xeb\xf6:     jmp short $-8(其中$指代当前EIP)

在Asm2MachineCode(x86)中如果要尝试jmp short $-8,是不可能实现的,但是我们可以:
1. ImageBase(hex)设置为0012ff60 (此处为当前的EIP地址)
2. jmp short 0012FF58
  

jmp长跳
\xE9\x2B\xFF\xFF\xFF\xFF: jmp 0x0012FF30

在Asm2MachineCode(x86)中如果要尝试jmp short $-8,是不可能实现的,但是我们可以:
1. ImageBase(hex)设置为0012ff58 (此处为当前的EIP地址)
2. jmp 0012FE88

5. cmp

cmp op1, op2

ZF=1 这个简单,则说明两个数相等

当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2

当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2

最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出

6. leave

leave在32位汇编下相当于

1
2
mov esp,ebp
pop ebp

7. les

LES( load ES)指令的功能是:把内存中指定位置的双字操作数的低位字装入指令中指定的寄存器、高位字装入ES寄存器。

1
2
3
4
LES DSET,SRC
LES REG,MEM
DEST为destination(目的地址),SRC为source(源地址);
REG为register(CPU寄存器),MEM为memory(内存地址)。

DEST=WORD PTR[SRC]

ES=WORD PTR[SRC+2]

DEST赋值为SRC处双字的低位;

ES赋值为SRC处双字的高位;

8. 比较

A(above)大于、B(below)小于、E(equal)等于,用于比较无符号数

G(great)大于、L(less than)小于、E(equal)等于,用于比较带符号数

其实这些地方也是漏洞点,有时候比较没有对是否有符号进行确定,所以可能会出问题。

9. lods/stos

lodsb指令,将esi指向的地址处的数据取出来赋给AL寄存器, esi=esi+1;

lodsw指令则取得是一个字。

lodsd指令,取得是双字节,即mov eax,[esi],esi=esi+4;

stosb指令,将AL寄存器的值取出来赋给edi所指向的地址处。mov [edi],AL;edi=edi+1;

stosw指令去的是一个字。

stosd指令,取得是双字节,mov [edi],eax;edi=edi+4;