计算机系统2

发布时间 2023-06-21 12:12:14作者: Sakana~

3. 程序的机器级表示

汇编指令

3.7 过程(函数调用)

函数调用与返回

  1. 把调用语句的下一条语句地址压入栈
  2. 执行完被调用函数后从栈中弹出该地址返回函数继续执行

参数传递:
1-6个参数用固定寄存器

其余用栈传递:
栈存储:所有数据大小为8的倍数
栈顶返回地址
局部变量也在栈中,但是不需要对齐;传递参数必须对齐 关于对齐规则 add
每个参数实际大小由自身变量类型决定,具体位置根据大端/小端存储法来定。

调用者/被调用者保存寄存器
递归调用:栈溢出

3.8 数组的分配和访问

根据数据类型来定,行优先

3.9 结构体联合体

结构体对齐
地址对齐:任何 \(k\) 字节的基本对象的地址必须是 \(k\) 的倍数
末端也会对齐(为了下一次的起始地址合理,结构体占的总字节数为4的倍数

指针都是8字节!!!!

联合体 \(Union\) 大小:最大字段的大小
用处:访问不同数据类型的位模式(一种类型存储,另一种类型访问)

3.10 缓冲区溢出

越界,限定范围

栈随机化

栈的位置每次运行都变
地址空间布局随机化 \(ASLR\)

栈破坏检查

缓冲区与栈之间加入 金丝雀 (随机产生,只读)
金丝雀值修改 -> 遭受了攻击

限制可执行代码区域

消除攻击者向系统中插入可执行代码的能力
分离可读 与 可执行