pwntools
pwntools是一个CTF框架和漏洞利用开发库,用Python开发,旨在让使用者简单快速的编写exploit。
推荐使用 python3
apt-get update
apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools
栈溢出
缓冲区溢出(buffer overflow):
程序员没有对 buffer 做长度检查,使攻击者可以超过 buffer 长度的内容,修改其他地址的内存,严重时可以劫持控制流
按照缓冲区的位置可以分为:
- stack base
- data base
- heap base
函数调用栈
栈帧
下图是栈的结构。图中右侧是栈空间,其中有多个栈帧。从上往下由较早的栈帧到较新的栈帧,由于栈是从高地址往低地址生长的,所以最新的栈永远在最下面,即栈顶。
栈的结构
图中有两个画出了具体结构的栈帧,分别是函数 A 和函数 B。函数 A 的栈帧最上面有一块省略号标识的区域,其中保存的是上一个栈帧的寄存器值以及函数 A 自己内部创建的局部变量。下面的参数 n 到参数 1 则是函数 A 要传给函数 B 的调用参数。那么函数 B 如何获取?答案是用寄存器。
寄存器 %esp 保存了栈指针的值,也就是栈顶,而 %ebp 作为当前栈帧的帧指针,也就是当前栈帧的底部,所以通过 %esp 和 %ebp 就可以知道当前栈帧的头跟尾。除了这两个寄存器,还有其它一些通用寄存器(%eax、%edx等),用于保存程序执行的临时值。
在函数 B 的栈帧最上面是 被保存的 %ebp,这个指的是函数 A 的帧指针,毕竟 %ebp 这个寄存器就一个,所以新的函数入栈的时候要先把老的保存起来,等函数出栈再恢复。在这个老的帧指针下面则是其它需要保存的寄存器变量以及函数 B 自己内部用到的局部变量。再往下是 参数构造区域,也就是函数 B 即将调用另一个函数,在这里先把参数准备好。可以看出,函数 B 与函数 A 的栈帧结构是类似的。
网友评论