pwntools脚本模板
对于每次研究pwn的时候,如果没有一个初始脚本的话,要写一个完整的pwntools脚本还是比较花费时间的,下面是通用脚本。
pwntools模板
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from pwn import *
import os, struct, random, time, sys, signal
context.arch = 'amd64'
# context.arch = 'i386'
context.log_level = 'debug'
execve_file = './a.out'
sh = process(execve_file)
# sh = remote('', 0)
elf = ELF(execve_file)
# libc = ELF('./libc-2.31.so')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
# Create temporary files for GDB debugging
try:
gdbscript = '''
define pr
x/16gx $rebase(0x0)
end
b *$rebase(0x0)
'''
f = open('/tmp/gdb_pid', 'w')
f.write(str(proc.pidof(sh)[0]))
f.close()
f = open('/tmp/gdb_script', 'w')
f.write(gdbscript)
f.close()
except Exception as e:
pass
sh.interactive()
os.remove('/tmp/gdb_pid')
os.remove('/tmp/gdb_script')
配合下面这条命令使用,支持本地,同样支持远程。
gdb -q -p $(cat /tmp/gdb_pid) -x /tmp/gdb_script
gdbs_cript
是gdb自启动脚本,可以声明或者定义自己的变量,或者下断点。
gdb_symbols
可以在二进制程序中加入结构体,或者全局变量,也可以写动态库劫持函数进行程序的一些初始化操作。
注意加入
gdb_symbols.so
可能会导致程序一遍变量产生偏移,所以调试完成之后,建议去掉gdb_symbols.so
再进行测试。
循环爆破脚本
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from pwn import *
import time, signal, os, struct, random, sys
interval = 60
execve_file = './a.out'
libc_file = '/lib/x86_64-linux-gnu/libc.so.6'
# libc_file = './libc-2.27.so'
def end_handle(signum=None, stack=None): exit(0)
for sig in [signal.SIGINT, signal.SIGHUP, signal.SIGTERM]: signal.signal(sig, end_handle)
context.arch = 'amd64'
# context.arch = 'i386'
context.log_level = 'error'
elf = ELF(execve_file)
libc = ELF(libc_file)
while(True):
sh = process(execve_file)
# sh = remote('', 0)
try:
sh.interactive()
break
except Exception as e:
sh.close()
exp.sh
专门用于爆破部分覆盖,其原理就是监控错误流。
#!/bin/sh
EXP_FILE=$1
INTERPRETER="python3"
STDERR_FILE="/tmp/exp.sh.err"
times=0
trap " rm -f $STDERR_FILE ; exit " INT
if [ ! $1 ]
then
echo "Usage: ./exp.sh ./your_file.py"
exit
fi
ulimit -c 0
while ((!(test -e $STDERR_FILE) || (test -s $STDERR_FILE)))
do
times=$((times+1))
printf "times %d\n\n" $times
$INTERPRETER $EXP_FILE 2>$STDERR_FILE
done
rm -f $STDERR_FILE
当爆破概率很小时,这种方法会显得过于臃肿,不建议用这种方法,推荐直接用while循环,速度会更块一点。
针对其他机器类型 gdb.sh
#!/bin/sh
FILE_PATH=`cat /tmp/gdb_name`
gdb-multiarch -q \
-ex "file $FILE_PATH" \
-ex "set architecture auto" \
-ex "target remote localhost:1234" \
-x /tmp/gdb_script
对应exp.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from pwn import *
import os, struct, random, time, sys, signal
# context.arch = 'arm'
context.log_level = 'debug'
execve_file = './a.out'
sh = process(execve_file)
# sh = process(["qemu-arm", "-g", "1234", execve_file])
# sh = remote('', 0)
elf = ELF(execve_file)
# Create temporary files for GDB debugging
try:
gdbscript = '''
'''
f = open('/tmp/gdb_name', 'w')
f.write(execve_file)
f.close()
f = open('/tmp/gdb_script', 'w')
f.write(gdbscript)
f.close()
except Exception as e:
pass
sh.interactive()
os.remove('/tmp/gdb_name')
os.remove('/tmp/gdb_script')