pwntools 是一個Python庫, 用于編寫二進制漏洞利用(exploitation)腳本
功能:
- 遠程連接和本地連接: 支持通過TCP/UDP連接遠程服務或與本地進程進行交互。
- Shellcode和ROP鏈構造: 提供了便捷的工具來生成和利用shellcode(比如execve的shellcode)以及構造ROP(Return-Oriented Programming)鏈。
- 調試支持: 可以與調試器(如gdb)配合使用,進行調試、自動化調試等。
- 自動化交互: 支持自動化與程序交互,模擬用戶輸入,處理輸入輸出流。
- 格式化輸出: 提供了豐富的格式化工具,幫助你以不同的方式展示數據。
語法:
1. 基礎連接和交互
連接
from pwn import * #導入pwntools庫
p = remote('example.com', 12345) #連接遠程服務
p = process('./vulnerable_program') #連接本地程序
發送數據
p.sendline('Hello') #發送一行數據
p.send('Hello') #發送沒有換行符的數據
p.send(b'Hello') #發送多個數據
接收數據
data = p.recvline() #接收一行數據
data = p.recv() #接收任意數據
data = p.recv(1024) #接收特定大小的數據
2. 調試
使用GDB調試
p = process('./vulnerable_program')
gdb.attach(p) #啟動進程,并自動附加到gdb進行調試
p.interactive() #調試時,繼續執行直到退出
p = process('./vulnerable_program')
gdb.attach(p, '''
break main
continue ''') #啟動調試進程并設置斷點 設置gdb斷點并啟動
3. 利用ROP鏈
創建ROP鏈
elf = ELF('./vulnerable_program') #加載二進制文件
system = elf.symbols['system'] #獲取函數地址(比如system函數)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') system = libc.symbols['system']
system = libc.symbols['system'] #獲取libc基地址
rop = ROP(elf)
rop.call(system, [next(elf.search(b'/bin/sh'))]) # 構造ROP鏈
print(rop.dump()) # 打印ROP鏈
4. 格式化輸出
格式化為16進制
data = b'Hello'
print(hex(data)) # 打印數據的16進制
構造填充數據(Padding)
padding = b'A' * 64 # 構造填充數據
print(padding) # 格式化成16進制
5. Shellcode與生成
使用asm
來生成Shellcode
shellcode = asm(shellcraft.sh())
print(shellcode) #使用asm生成shellcode
執行Shellcode
p = process('./vulnerable_program') #創建一個進程并注入shellcode
p.send(shellcode) #注入shellcode
6. 腳本化交互
pwntools
提供了一個名為 interactive
的方法來幫助你與程序進行交互。
p.sendline('Hello') # 發送數據并啟動交互模式
p.interactive() # 啟動交互模式,進入交互式命令行
7. 利用context
進行設置
context
是用來設置當前進程/連接的環境的。可以設置架構、字節序等。
設置架構和字節序
context.arch = 'amd64'
context.os = 'linux'
context.endian = 'little' # 設置架構和字節序(x86_64,little-endian)
設置輸入/輸出編碼
context.term = 'xterm-256color' # 設置輸入輸出編碼為utf-8
8. 其它常見工具
ELF
類
ELF
類提供了對二進制文件的操作接口,能夠幫助你提取符號、段、重定位等信息。
elf = ELF('./vulnerable_program') # 加載一個ELF文件
print(hex(elf.entry)) # 查看程序的入口地址
func_address = elf.symbols['main']
print(hex(func_address)) #獲取函數地址
libc
類
libc
類幫助你進行 libc
漏洞利用時的操作,包括獲取函數地址、計算基址等。
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') # 加載libc文件
system = libc.symbols['system']
print(hex(system)) # 獲取libc中的system函數地址
9. pwn
命令行工具
除了作為一個Python庫,pwntools
還提供了一些命令行工具,如 pwn cyclic
、pwn checksec
等,來幫助你分析二進制文件和漏洞。
$ pwn cyclic 100 # 生成一個包含100個字符的循環序列
$ pwn checksec --fortify-file=./vulnerable_program # 檢查程序的安全設置