《深入理解计算机系统》Machine level programming-V Advanced topics
0x0000 7FFF FFFF FFFF 这个地址在Linux中为栈的起始地址。
如果发生栈溢出,则由很大可能栈空间的返回地址会被篡改,程序会跳到某个地方。
代码注入攻击则利用这个原理,将原栈空间破坏,跳转到目标地址。
1. ASLR(Address space layout randomization)地址空间布局随机化,global val 和 code segment 每次运行地址不变,heap和stack地址每次运行都会变化。
2. nonexecutable code segment,可以避免利用漏洞导致的内存覆盖。有的内存块可写,有的内存块只读。另外,栈设置成不可执行,不能放置代码段。
3. gcc 的编译选项:-fstack-protector(金丝雀)