经典定长指令上(修改寄存器)
1、PUSH/POP特点:
0x50 PUSH EAX1、记住32位、16、8位的通用寄存器,按照顺序记住.
0x51 PUSH ECX
0x52 PUSH EDX2、将操作数编码到指令当中
0x53 PUSH EBX
0x54 PUSH ESP
0x55 PUSH EBP
0x56 PUSH ESI
0x57 PUSH EDI
0x58POP EAX
0x59POP ECX
0x5APOP EDX
0x5B POP EBX
0x5C POP ESP
0x5D POP EBP
0x5EPOP ESI
0x5F POP EDI
2、INC/DEC:读表:
0x40 - 0x47INC ERX1、i64/o64/d64
0x48 - 0x4FDEC ERXi64:64位无效
o64:只64位有效
3、MOV Rb, Ib
d64:64位模式下,操作数宽度默认为64位
0xb0 - 0xb7MOV Rb, Ib
4、MOV ERX, Id2、关于寄存器
0xb8 - 0xbFMOV ERX, Id(1) 当操作码需要使用寄存器做为操作数时,寄存器的名字说明其
宽度是64、32、16、8位.
5、XCHG EAX, ERX
(2) eXX 比如 eAX 可以表示 AX EAX
0x90 - 0x97XCHG EAX, ERX
(3) rXX 比如 rAX 可以表示 AX EAX RAX
经典定长指令下(修改EIP)
1、0x70 - 0x7F
条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节。
如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Ib
最大值:向前跳7f,向后跳80
0x70 JO
0x71JNO
0x72JB/JNAE/JC
0x73JNB/JAE/JNC
0x74JZ/JE
0x75JNZ/JNE
0x76JBE/JNA
0x77JNBE/JA
0x78JS
0x79JNS
0x7AJP/JPE
0x7BJNP/JPO
0x7CJL/JNGE
0x7DJNL/JGE
0x7EJLE/JNG
0x7FJNLE/JG
2、0x0F 0x80 - 0x0F 0x8F
条件跳转,后跟四个字节立即数的偏移(有符号),共五个字节。
如果条件成立,跳转到 当前指令地址 + 当前指令长度 + Id
最大值:向前跳7FFFFFFFF,向后跳80000000
0x0F 0x80 JO
0x0F 0x81JNO
0x0F 0x82JB/JNAE/JC
0x0F 0x83JNB/JAE/JNC
0x0F 0x84JZ/JE
0x0F 0x85JNZ/JNE
0x0F 0x86JBE/JNA
0x0F 0x87JNBE/JA
0x0F 0x88JS
0x0F 0x89JNS
0x0F 0x8AJP/JPE
0x0F 0x8BJNP/JPO
0x0F 0x8CJL/JNGE
0x0F 0x8DJNL/JGE
0x0F 0x8EJLE/JNG
0x0F 0x8FJNLE/JG
3、其他指令
0xE0 LOOPNE/LOOPNZ Ib (Jb)共2字节
ECX = ECX - 1 当ZF = 0 && ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib
0XE1 LOOPE/LOOPZ Ib (Jb)共2字节
ECX = ECX - 1 当ZF = 1 && ECX != 0 时跳转到 当前指令地址 + 当前指令长度 + Ib
0XE2LOOP Ib (Jb)共2字节
ECX = ECX - 1 当 ECX!=0 时跳转到 当前指令地址 + 当前指令长度 + Ib
0XE3JrCXZ Ib (Jb) (在32位模式中,rCX为ECX)共2字节
当 ECX = 0 时跳转到 当前指令地址 + 当前指令长度 + Ib
(自己控制步长)
0xE8CALL Id (Jd) 共5字节
CALL指令的下一条指令地址入栈后,跳转到 当前指令地址 + 当前指令长度 + Id
0xE9JMP Id (Jd)共5字节
跳转到 当前指令地址 + 当前指令长度 + Id
8个段寄存器: ES CS SS DS FS GS LDTR TR (顺序固定)
(段寄存器实际是个结构体,共96位,其中仅16位是汇编指令可以访问到的)
0xEAJMP Ap (Ap:六字节长度的直接地址)共7字节
JMP CS:Id 将Ap中的高2位赋值给CS,低4位直接赋值给EIP, 即跳转
004183D7 > EA 12345678 1B00 JMP FAR 001B:78563412
0xEBJMP Ib (Jb)
跳转到 当前指令地址 + 当前指令长度 + Ib
0xC3 RET共1字节
EIP出栈
0xC2RET Iw共3字节
EIP出栈后,ESP = ESP + Iw
0XCBRETF (return far) 共1字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS
0xCARETF Iw共3字节
出栈8个字节,低4个字节赋值给EIP,高4个字节中低2位赋值给CS后,ESP = ESP + Iw
ret -> pop eip
retf -> pop eip, pop cs