1.冯诺依曼结构包括3种硬件组件:
- 中央处理单元(cpu),负责执行代码
- 内存(RAM),负责存储所有数据和代码
- 输入输出系统(I/O),为硬盘,键盘,显示器等设备提供接口
2.CPU
- ALU:算术逻辑单元,执行从内存取来的指令,进行分析
3.内存
- 数据:指内存中特定的节,数据节,静态值,全局变量等程序一开始就被加载到这里
- 代码:CPU执行程序时所要取得的指令
- 堆:动态内存,为程序执行期间需要的动态内存做准备,创建新的值,消除不用的值
- 栈:函数局部变量,参数,控制程序执行流
4.TF:用于调试,当它被置位时候,x86处理器每次只执行一条指令
5.乘法除法指令:
乘法:%eax保存乘数,结果保存在%ebx和%eax中,%ebx是高8位(16位),%eax是低8位
除法:%也不行,%eax里保存被除数,%ebx保存余数,%eax保存商
imul,idiv是带符号版本
6.xor
xor %eax,%eax常用来清零,这个指令只要2个字节,然而mov需要5个
7.循环移位指令
ror是最低位循环到最高
rol相反
- 若一个函数出现大量的ror,rol,xor,and,shl,shr,or而且好像这些指令是随机排列的,可能是遇到了一个加密或压缩的函数(最后回来再分析)
8.NOP(无运算)
什么都不做,直接进入下一条指令,其实NOP是xchg %eax,%eax的伪名字
- 机器指令:0x90 NOP滑板,起到填充代码作用,以降低shellcode可能在中间部分开始执行所造成的风险
9.函数调用
- ESP:释放局部变量
- leave:用作结束语,使%ESP=%EBP,然后从栈中弹出%ebp
- ret:从栈中弹出返回地址给EIP,程序会回到原来调用它的地方执行,也就是下一条语句。example:
- 只有理解好ret指令才能执行到number-2
10.条件指令
- test:和and功能一致,但是不修改任何操作数,改变标志位ZF,test %eax,%eax用来检查%eax是否是零(会改变ZF,为0,ZF==1)
- cmp:和sub指令一致,ZF,CF可能发生变化
(INTEL)
11.跳转指令
- jz zf=1,跳 jnz zf=0,跳
- ja是无符号的jg,jae是无符号的jge(大于)
- jb是无符号的jl,jbe是无符号的jle(小于)
- jo前一条指令使OF=1,跳
- js sf=1(SF是如果结果为负数置一),跳
- jecxz %ecx=0,跳
12、重复指令:操作数据缓冲区的指令
- movsx:最高位符号位扩展
- movzx:零扩展
rep(重复前缀)和movsb结合
- rep循环终止,ecx=0
- repe,repz 循环终止,ecx=0,zf=0
- repne,repnz循环终止,ecx=0,zf=1
rep指令会增加ESI,EDI的偏移量,减少ECX的偏移量。不断重复直到上面的循环终止条件达到,所以为了使rep生效,ESI,EDI,ECX要进行初始化
rep movsb会将一串字节从ESI(源索引寄存器)移动到EDI(目的索引寄存器),移动ECX数目的字节数,DF(方向标志)=0,ESI+1,EDI+1,否则减