上次聊完了寄存器以及使用寄存器不同部分的助记符,今天我们来聊x86/x64的汇编语言。
注意,此处全部采取Intel风格的汇编语言,原因无他。
x86/x64汇编指令的格式如下:
操作码 [操作数1] [操作数2]
对于Re部分的赛棍而言,只需掌握特定的几种指令即可;
指令类型 | 操作码 | 指令示范 | 指令作用 |
---|---|---|---|
数据传输指令 | mov | mov rax,rbx | rax=rbx |
取地址指令 | lea | lea rax,[rsi] | rax=&*(rsi) |
算术运算指令 | add/sub | add/sub rax.rbx | rax+=rbx(add) rax-=rbx(sub) |
逻辑运算指令 | and | and rax,rbx | rax&=rbx |
逻辑运算指令 | xor | xor rax,rbx | rax^=rbx |
函数调用指令 | call | call 0x401000 | 执行地址为0x401000的函数(名字也可以) |
函数返回指令 | ret | ret | 函数返回 |
比较指令 | cmp | cmp rax,rbx | 根据rax与rbx的比较结果改变标志位 |
无条件跳转指令 | jmp | jmp 0x401000 | 跳到0x401000继续执行 |
栈操作指令 | push | push rax | 将rax值压入栈中 |
栈操作指令 | pop | pop rax | 从栈上弹出一个元素进入rax |
汇编过程事实上是有信息丢失的,冯.诺伊曼模型模糊了代码与数据的区别,代码节里可能参插着数据,我们如何知道正确的指令起始位置呢?我们用label,即标签来指示程序的一个位置,来指引反汇编工具来解析代码。
而我们前面提过,在汇编过程中,label信息会丢失,因此分析汇编代码前要先还原label标签。还原的方法有二,分别是线性扫描反汇编算法,另外一种则是递归下降反汇编算法,我们的IDA就是一种递归下降反汇编器。
对于IDA pro这一款反汇编器,我们下节再给出介绍。