学习栈溢出首先了解一下linux pwn常见的保护
》RELRO
部分RELRO:将.got段映射为只读(但.got.plt还是可以写)重新排列各个段来减少全局变量溢出导致覆盖代码段的可能性.
完全RELRO:
执行部分RELRO的所有操作,让链接器在链接期间(执行程序之前)解析所有的符号, 然后去除.got的写权限,将.got.plt合并到.got段中, 所以.got.plt将不复存在.
》.stack canary
在函数返回值之前添加的一串随机数(不超过机器字长),末位为/x00(提供了覆盖最后一字节输出泄露canary的可能)
》.NX标识页表是否可执行
》.pie:elf文件加载基址随机化
没有随机化。即关闭 ASLR。
保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化。
完全的随机化。在 1 的基础上,通过 brk() 分配的内存空间也将被随机化。
加载了地址随机化在做题的时候每次加载的位置会不一样,可以用命令:(sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space将随机化暂时关闭)
linux栈溢出基本原理:
首先了解一下栈的结构,
栈是一种数据结构,采用小端模式进行存储,即小地址单元存储数据的低位(即尾端)。是一种只能在一端进行插入和删除操作的特殊线性表。按照先进后出的原则存储数据,栈最重要的是栈保存了一个函数调用时所需要的维护信息,一般包含如下几方面的信息:
1.函数的返回地址和参数
2. 临时变量:包括函数的非静态局部变量以及编辑器自动生成的其他临时变量。
栈溢出原理