pwn 是 CTF 比赛中的一种题目类型,pwn 是从 own 引申出来,在网络文化中习惯上用于嘲笑竞争对手已经被完全击败,如:You just got pwned !
pwn 主要是指利用缓冲区溢出攻破设备或者系统。CTF 比赛中通常会给出一个已经编译好的二进制程序,然后比赛选手通过对程序进行逆向分析和调试来找到可利用的漏洞,并编写利用代码,通过远程代码执行来达到溢出攻击的效果,最终拿到目标机器的 shell 夺取 flag。
众所周知,计算机程序的运行依赖于函数调用栈。栈溢出是指在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。
pwn 攻击主要有四种方法:
- 修改返回地址,让其指向溢出数据中的一段指令(shellcode)
- 修改返回地址,让其指向内存中已有的某个函数(return2libc)
- 修改返回地址,让其指向内存中已有的一段指令(ROP)
- 修改某个被调用函数的地址,让其指向另一个函数(hijack GOT)
需要掌握的知识点
- 堆 Heap
- 栈 Stack
- 指针与地址
- 常用的汇编命令
常用工具
- gdb
- ida
- checksec
- ROPgadget
- rp++
- ropeme