linux 内核安全增强(一)— stack canary
一、背景知识 —— aarch64的函数栈
1.栈生长方向与push/pop操作
栈是一种运算受限的线性表, 入栈的一端为栈顶,另一端则为栈底, 其生长方向和操作顺序理论上没有限定.
在aarch64平台上,栈是向低地址方向增长的(STACK_GROWS_DOWNWARD)
栈的PUSH/POP通常要先移动SP:
PUSH操作为PRE_DEC,即 PUSH操作为 sp = sp -4; store;
POP操作为 POST_INC,即POP操作为 read; sp=sp+4;
2.返回地址的存储
x86平台是call指令时自动push函数返回地址到栈;
ret指令自动pop函数返回地址出栈;
这两步操作都是在callee执行前硬件自动完成的.
而在arm/aarch64平台发生函数调用时(blx),硬件负责将函数的返回地址设置到通用寄存器LR(/X30)中, callee中的代码负责将LR保存到栈中(需保存的寄存器参考AAPCS标准)
3.函数栈分配
在不考虑动态分配的情况下, 函数中使用的栈大小在编译阶段 ...