2’s complement
正数:最高位0
负数:最高位1,绝对值取反加1
如4位情况下:
5表示为0101
-3表示为1101
栈顶指针:%rsp
栈向下增长
函数传递变量的过程:
if 参数≤6个:分别用%rdi, %rsi, %rdx, %rcx, %r8, %r9寄存器存放
else:多余的参数逆序存放在栈上
函数调用
1.父函数将参数存放在寄存器,超过6个的参数从后向前压栈
2.父函数将返回地址压栈
3.跳转到子函数地址执行
4.子函数将父函数栈帧起始地址%rbp压栈
push %rbp
5将%rbp指向子函数栈帧起始地址
movq %rsp, %rbp
函数返回
1.将栈指针指向子函数栈帧起始处
movq %rbp, %rsp
2.弹出父函数栈帧
popq %rbp
内存分布
栈:存放函数调用相关数据及函数内部变量
堆:动态分配时用的空间
Data段:全局变量,静态变量,字符串常量
Text段:只读的机器指令
针对内存的攻击与保护
攻击1:代码注入攻击:利用buffer overflow,覆盖
攻击2:ROP(面向返回的编程):攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码
保护1.返回地址,跳转到恶意代码位置
保护2.栈随机化:在栈起始的地方初始化任意长度的区间
保护3:标注栈不可执行
保护4:canary:在返回地址之前放置一个任意值,返回时检查该值是否变化