3. 程序的机器级表示
汇编指令
3.7 过程(函数调用)
函数调用与返回
- 把调用语句的下一条语句地址压入栈
- 执行完被调用函数后从栈中弹出该地址返回函数继续执行
参数传递:
1-6个参数用固定寄存器
其余用栈传递:
栈存储:所有数据大小为8的倍数
栈顶返回地址
局部变量也在栈中,但是不需要对齐;传递参数必须对齐 关于对齐规则 add
每个参数实际大小由自身变量类型决定,具体位置根据大端/小端存储法来定。
调用者/被调用者保存寄存器
递归调用:栈溢出
3.8 数组的分配和访问
根据数据类型来定,行优先
3.9 结构体联合体
结构体对齐
地址对齐:任何 \(k\) 字节的基本对象的地址必须是 \(k\) 的倍数
末端也会对齐(为了下一次的起始地址合理,结构体占的总字节数为4的倍数)
指针都是8字节!!!!
联合体 \(Union\) 大小:最大字段的大小
用处:访问不同数据类型的位模式(一种类型存储,另一种类型访问)
3.10 缓冲区溢出
越界,限定范围
栈随机化
栈的位置每次运行都变
地址空间布局随机化 \(ASLR\)
栈破坏检查
缓冲区与栈之间加入 金丝雀 (随机产生,只读)
金丝雀值修改 -> 遭受了攻击
限制可执行代码区域
消除攻击者向系统中插入可执行代码的能力
分离可读 与 可执行