单字节:byte
双字节:词或字word
四字节:双词Dword,doubleword
八字节:四词Qword,quadword
16字节:double quadword
RBX:存储地址
RCX:计数器循环
RDX:整除取余
RSP:栈顶
RBP:栈底
RSI:源目标索引寄存器,寻址
RDI:源目标索引寄存器,寻址
lea:取地址
push:操作数压入栈顶,栈顶指针减小
pop:对应
pushad:所有通用寄存器压到栈顶
popad:堆栈栈顶数弹出到所有的通用寄存器中
ret:从函数返回
inc/dec:递增递减
mil/imul:无符号整数乘法/有符号整数乘法
div/idiv:无符号整数除法/有符号整数除法
and/or/not/neg:与/或/逻辑非(反码)/非(补码)
je:相等跳转
jne:不相等跳转
loop返回循环入口
xor:异或,可以避免坏字节/x00的出现;xor eax eax;赋值0
反编译工具
IDA
Objdump,默认AT&T语法。可以-M intel参数改变
内存
代码区,数据区,堆区,栈区
堆区可以自己请求内存,再返还给堆区。
栈区存储函数调用关系。
函数调用
程序执行要确定下一条指令的地址,就是PC,寄存器位EIP即指针寄存器。控制程序执行流就可以控制EIP指针来做到
每个函数都有属于自己的栈帧,如何保证函数栈帧正确,通过esp和ebp。
sub esp,xxx;
add esp,xxx;
为定义变量扩展空间,定义一个char a[10],就把栈顶指针向上抬。
objdump -d 文件 -M intel
也可以查找程序含有对应指令的地址
objdump -d file | grep 指令(例如pop)
objdump -d file -M intel | grep 指令(例如pop)
返回finish
删除断点
d num
修改寄存器
set $rax=0x66666666
Linux查看进程PID
ps -a
ps -aux
插件功能
查看地址等信息
vmmap
查看栈的信息
stack
查看堆信息
heap
例如
#include <stdio.h>
#include <stdlib.h>
int main
{
char *str1=malloc(100);
scanf("%s",str1);
printf("%s",str1);
char *str2=malloc(100);
char *str3=malloc(100);
free(str1);
free(str2);
return 0;
}
向堆空间索要内存;
gdb a.out
b main
r
heap
x/20gx 0x555555756000
查看对应堆空间内存的情况