好久没看过pwn题目了,写一个入门的教程顺便复习了:
1. 安装gdb-peda
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"
2. 一些比较有用的技巧
print system
直接输出__libc_system的地址 , 用以验证信息泄露以及system地址计算的正确性
checksec 检查该二进制的一些安全选项是否打开
shellcode 直接生成shellcode
attach pid , 在利用脚本connect到socat上之后,socat会fork出一个进程,gdb attach上这个进程,即可以进行远程调试了
socat TCP4-LISTEN:12345,fork EXEC:./1 本机调试
3. pwntools
安装
git clone https://github.com/Gallopsled/pwntools
cd pwntools
python setup.py install
或者使用
pip install pwn
基本的模板
from pwn import *
context.log\_level = 'debug' #debug模式,可输出详细信息
conn = remote('127.0.0.1' , 12345) #通过socat将二进制文件运行在某个端口之后,可使用本语句建立连接,易于在本地与远程之间转换。
print str(pwnlib.util.proc.pidof('pwn')[0]) #这两条便于在gdb下迅速attach 上对应的pid
raw_input('continue')
conn.recvuntil('Welcome') #两种不同的recv
conn.recv(2048)
shellcode = p32(0x0804a028) #用于将数字变成\x28\xa0\x04\x08的形式
conn.sendline(shellcode) #向程序发送信息,使用sendline而非send是个好习惯
conn.interactive() #拿到shell之后,用此进行交互
from pwn import *
pwn=remote("127.0.0.1","12345")
payload='A'*136 + p64(0x00000000004005bd)
#pwn.recvuntil('Welcome') #两种不同的recv
pwn.sendline(payload)
pwn.interactive()
本地调试
socat tcp-listen:12345, fork EXEC:./pwn
GDB 命令
1. X 命令
o - octal
x - hexadecimal
d - decimal
u - unsigned decimal
t - binary
f - floating point
a - address