pwn题堆利用的一些姿势 -- IO_FILE
发布日期:2021-05-15 04:19:29 浏览次数:19 分类:精选文章

本文共 1666 字,大约阅读时间需要 5 分钟。

IO_FILE逆向分析与利用


概述

这是pwn题攻略系列中的第三篇文章,重点讲解了IO_FILE结构在pwn题中的应用方法。IO_FILE(FILE)在Linux系统中的标准IO库中用于描述文件流,基于此结构可以在pwn题中完成信息泄露。常规情况下,pwn题中会设计没有直接信息泄露的函数,这时即使堆漏洞存在,直接使用堆结构进行攻击也难以获取libc版本或内核地址等信息。因此,利用IO_FILE结构成为一种有效的手段。


IO_FILE结构介绍

在Linux系统的libc中,IO_FILE结构体描述了文件流的信息,包括文件指针、读取和写入的缓冲区、标志位等。这些结构体的内存地址在程序运行中会动态地进行链表连接。动态跟踪内核结构体可以帮助我们深入分析其工作原理。

_IO_FILE_plus与vtable

IO_FILE_plus 是一个扩展结构体,它包含一个vtable指针,其作用类似于调用表(virtual table)。vtable中存储了离散的跳转函数(file jumps),用于执行文件操作的特定逻辑。了解这些结构体的细节对于掌握信息泄露的方法至关重要。


利用IO_FILE进行信息泄露

原理分析

在没有leak函数的情况下,通过对IO_FILE结构的操控可以实现信息泄露。常规方法是将一个堆块分配至stdout,这样可以通过特定的IO_FILE标志设置,并修改vtable指针的值,最终使程序在执行写入操作时 thông quaputs或printf函数泄露内存地址、libc版本等信息。

重要字段介绍
  • _flags:文件标志位,用于控制文件流行为。
  • _IO_read_ptr、_IO_write_ptr:文件操作的当前位置指针。
  • _IO_write_end:写入操作的终点。
  • vtable:包含跳转函数的指针。
  • 通过合理设置这些字段,可以间接控制程序的行为。

    实际操作步骤
  • 堆块分配:将heap块分配到stdout或stderr的IO_FILE结构中。
  • 修改标志位:设置_flags为0xfbad1800,使得文件流处于一个特定状态。
  • 修改vtable指针:将vtable指针的第一个字节设置为0x58,使其指向_IO_file_jumps的函数。
  • 程序执行:此时,调用print函数会触发vtable中的函数,从而泄露vtable指针,进而获取_IO_file_jumps的地址。

  • 一个典型案例:one_heap

    题目分析与思路

    在2019年SCTF的一堆(one_heap)中,程序仅具备add和free两个功能,且每次功能调用只能记录一个堆地址,这使得Double Free Unsafe Array Handling(UAF)漏洞变得可行。解决方案如下:

  • 第一次Double Free:分配一个size为0x7f的堆块,随后使用free调用其两次,从而引发Double Free UAF。
  • 利用tcache中的堆块:通过破解tcache的堆指针,将堆块分配至控制堆(tcache)的位置。
  • 修改堆标志位:将堆块标志的最后两位置为0x150(0x150=0x000000000xŐ),使heap metadata结构为unsorted bin型。
  • 第二次Double Free:分配一个较小的堆块,破坏_unsorted bin中的指针,覆盖libc中的stdout地址。
  • 实现信息泄露:通过修改stdout的IO_FILE结构,将程序输出重定向至预先计算的heap地址,从而获取libc中的_jump_table地址。
  • 后续操作:将heap块分配至free_hook,修改其为system函数地址,最终实现命令执行。

  • FSOP(后续内容待补充)


    总结

    在面临没有明确信息泄露函数b的事势下,IO_FILE结构提供了一种灵活且强大的手段。通过结构体的特定操作,可以在没有额外漏洞的情况下获取到痛要的信息。这不仅适用于pwn题中的一些难题,也为你的逆向分析能力提供了强大的工具。

    不断打磨自己,向着目标前进!

    上一篇:SQL注入的一般过程
    下一篇:DVWA的部署和教程

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月28日 17时45分10秒