170824 汇编-x86基础

本文介绍了X86与X64的指令集,包括数据移动方式、栈操作与函数调用约定,以及控制流的实现。详细讲解了Intel与AT&T的记法差异,并对比了x64与x86的区别。同时概述了ARM的基本特性,如指令宽度、内存访问模式和特权模式等。
摘要由CSDN通过智能技术生成

A.1625-5 王子昂 总结《2017年8月24日》 【连续第325天总结】
B. 逆向知识

X86与X64

指令集

数据移动分为5种方式:
  立即数到寄存器
  立即数到内存
  寄存器到寄存器
  寄存器到内存或内存到寄存器
  内存到内存
前4种是所有现代体系都支持的,第五种是X86独有的,可以通过inc/add来直接操作内存
另外X86使用变长指令,指令长度从1-15字节不等;而ARM的指令只能是2/4字节

记法

Intel

mov ecx, AAh
mov ecx, [eax]
mov ecx, eax

AT&T

movl $0xAAh, %ecx
movl (%eax), %ecx
movl %eax, %ecx

注意指令是相同的,只是写法不同
AT&T记法在寄存器名前加前缀%,立即数前加$;Intel不加前缀
AT&T记法加入了指示指令宽度的后缀,比如movl(长整形), movb(字节)等
AT&T记法把源操作数放在目标操作数之前,Intel相反

WIN系统上的工具通常使用Intel记法,而UNIX系统上的工具通常遵从AT&T记法

栈操作与函数调用

调用约定最常用的是CDECL和STDCALL
它们都是将参数从右向左压栈,区别在于前者由调用方负责清理堆栈;后者则由被调用方负责
在函数内部,通常形式为:

push  ebp
mov   ebp, esp
...
...
...
mov     esp, ebp
pop     ebp
retn

第一行将当前的ebp值保存,然后将初始的esp存入ebp中,这个过程称为函数序言

[ebp+4]为函数返回地址,参数从[ebp+8]开始

所有的参数访问都以ebp为基地址,被称为栈基指针

*也可以通过一种称为栈指针省略的优化方法指定编译器生成不使用EBP作为栈指针的代码。这种优化下EBP可以作为通用寄存器,而ESP来充当栈基指针

如果需要局部变量,那么在第二行以后执行对esp的减操作来扩充栈,然后通过[ebp-4]的方式来访问局部变量

函数末尾把esp和ebp还原,最后retn等价于pop esi,即将栈堆中的返回地址取出作为执行地址

在CDECL中,call之后会执行add esp,x来清理堆栈中的参数

控制流

if-else通常通过jcc+cmp指令来判断是否跳转

switch-case可以通过一系列的if-else来实现,但为了优化实际上会构造一个跳转表:跳转表本质上是一个地址数组,每个成员指向一个case的地址

循环则通过if-else+goto指令来实现

字符串扰乱函数

每3个字符存储一个有效字符,例如在内存中存储SX]OTYFKPTY^W\aAFKRW\E
解扰乱后为SOFTWARE
这样可以规避字符串扫描器

x64

x64与x86大体相同,只有一些细微的区别
首先寄存器再次扩展,r-reg(如rax)达到了64位
多数x64编译器把RSP作为基地址引用局部变量,而把RBP当做通用寄存器
x64支持一种称为RIP相对寻址的概念,允许得到标号的绝对地址来放入寄存器中
多数算术运算指令都升级为64位,即使操作数只有32位
x64中大多数的函数调用都通过寄存器来传递参数

ARM

基本特性

1.ARM的指令集比x86小很多,但通用寄存器更多
2.指令宽度固定为2字节或4字节(由状态决定)
3.内存访问模式是加载-存储模式,即不允许直接对内存操作,必须通过寄存器
4.x86有ring0-3的特权模式,0最高
 ARM中则提供8种不同级别的特权模式,包括USR, SVC, SYS等
 每个模式下运行的代码具有特定的优先级别,可以访问特定的寄存器;比如说USR模式就无法修改系统寄存器
5.ARM拥有两种状态:ARM和Thumb,它们影响的只有指令集,而不是特权模式
 在ARM状态下指令总是32位宽,而在Thumb状态下指令是16位和32位混用
 决定状态的有两个因素:
 (1)通过BX和BLX指令进行分支跳转的时候,目标寄存器的最低有效位
 (2)当前程序状态寄存器CPSR的T标志位
 ARM核心启动的时候多数情况下都是进入ARM状态
 多数较新的操作系统使用Thumb是为了获得更大的代码密度(混合使用可以降低代码大小)并且应用程序可以运行于任意模式下
 因为多数指令助记符都是相同的,所以在Thumb指令后添加.w后缀标识
6.在ARM中,所有指令都支持条件执行,而不像x86大部分都是无条件执行
7.ARM拥有桶式移位器:某些指令可以包含另一条用于移位或旋转的算术指令来节省指令

C. 明日计划
逆向知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值