从零开始的学pwn之旅
栈的结构
栈是一种典型的后进先出的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作,esp称之为栈顶,ebp称之为栈底,esp与ebp之间称之为栈。程序的栈是从进程地址的高地址向低地址增长的。
32位和64位
区别:
32位是直接放在栈上,64位是放在计算机上。前六个整型或指针参数依次保存在rdi,rsi,rdx,rcx,r8,r9寄存器中。
栈溢出
定义:
栈溢出是指程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数。溢出的数据会覆盖栈中其它数据。
利用:
栈溢出漏洞原理:缓冲区溢出分为栈溢出和堆溢出。栈溢出是由于在栈的空间内,放入大于栈空间的数据,导致栈空间以外有用的内存单元被改写,这种现象就称为栈溢出。
CANNARY: 是对栈的保护的一种方式,如果开启cannary,函数调用的时会先往栈里插入一个cookie值,函数返回上一层的时候会验证cookie值是否准确,如果不不准确就立刻停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie值改掉,这样将导致栈保护检查失败阻止shellcode的执行。在Linux中将cookie值称为canary。但这种保护也不是绝对安全的,攻击者可以利用程序中的函数,获得存在内存中的cookie值。这大概就是奔奔学长讲的金丝雀嘛。