PWN入门
备忘
题目一般包含的两部分
- 含有漏洞的二进制程序
- 远程运行二进制程序的ip和端口
- 利用程序漏洞读取flag
- 任意代码执行
- 本地提权
一般流程
Binary \(\to\) 逆向找洞 \(\to\) 写漏洞利用程序 \(\to\) 本地调试 \(\to\) 打远程 \(\to\) 读flag
常用工具
- $IDA \ Pro $ 逆向二进制工具
- \(python + pwntools\) 编写漏洞利用脚本
- \(gdb\) + 插件 调试
- \(file,strings,readelf\)等查看\(ELF\)文件工具
- \(checkec,ROPgadget\)等漏洞相关的小工具
GDB
插件
pwndbg + Pwngdb
常用指令
- break 下断点
- p打印值,x打印内存
- stack查看栈
- tele,dq查看内存
pwntools
漏洞利用库
pip install pwntools
常用接口
- process,remote 交互
- send,sendline,sendafter,recv,recvuntil 交互
- p64,u64,p32,u32 把数字转适合程序的字符串
- context 设置环境
- ELF
缓冲区溢出(buffer overflow)
程序员没有对buffer做长度检查,使攻击者可以输入超过buffer长度的内容,修改其他地址的内存,严重时甚至可以劫持控制流
按位置可以分为\(stack \ base\) ,$data \ base $, $heap \ base $
可能导致缓冲区溢出的函数
- gets,scanf,strcpy,strcat,memcpy
调用约定
function call
- call push return address to stack and jump
function return
- ret:pop rip
- 将返回地址从栈顶弹出,放入rip中 mov rip ,[rsp];add rsp,8
参数传递
- 使用寄存器传参,不够了放栈上
- 依序放到rdi,rsi,rdx,rcx,r8,r9
- 放入寄存器后function call
栈溢出 stack overflow
作用:可以跳转程序任意位置
shellcode
- 一段可以用来弹shell的代码
- 注入已知地址且可执行的内存处
- 利用栈溢出劫持控制流到shellcode位置
Protection
利用checksce查看二进制开启了那些保护
DEP/NX
- 可写的不可执行,可执行的不可写
- 直接只用ret2shellcode攻击似乎不行
- Bypass:ROP
ROP
面向返回地址编程
利用ret去执行程序中包含ret的程序片段
“风雪越是呼啸,雪莲越是绽放”