![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CTF-PWN-堆+IO
文章平均质量分 94
CTF-PWN-堆+IO
看星猩的柴狗
IT爱好者一枚,菜狗CTF-PWN手,记录自己的学习经历,请大佬多多指点
2022/9-2023/7:算法
2023/8-2023/9:web/渗透测试
2023/10-至今:pwn
展开
-
IO-源码阅读 glibc 2.35
会分配sizeof (struct locked_FILE)大小的结构体,然后_IO_no_init 初始化分配的结构体,_IO_JUMPS 对vatable赋值,_IO_new_file_init_internal 对结构体链接到list_all中,然后_IO_file_fopen 会系统调用打开文件并设置文件描述符。_IO_doallocbuf 会申请分配缓冲区并将指针_IO_buf_base和_IO_buf_end赋值。_IO_sputn 会调用到_IO_new_file_xsputn函数。原创 2024-06-09 19:01:17 · 849 阅读 · 0 评论 -
CTF-PWN-堆-【house of apple1】
IO_flush_all_lockp在清理时会检查_IO_list_all链表(这是glibc所管理的全局FILE流链表),并对每个FILE对象应用相应的操作,如果满足条件(例如流正在写入模式并且有未冲洗的数据),则会调用vtable中_overflow函数指针所指向的函数。这些手动打开的文件流,连同标准输出和标准错误,构成了程序的“所有打开的输出流”。正常终止过程中,会发生一系列的清理工作,例如关闭所有打开的流(尤其是标准I/O流)来确保数据不会丢失,并且所有缓冲的输出都被写入它们对应的文件或设备中。原创 2024-03-02 21:45:50 · 1441 阅读 · 0 评论 -
CTF-PWN-堆-【chunk extend/overlapping-2】(hack.lu ctf 2015 bookstore)
功能选择前就已经先创建三个大小为0x80的堆了(对于chunk的size为0x90),第一个chunk是order1的内容,第二个chunk是order2的内容,第三个chunk是dest的内容(这个存储字符串的),然后根据输入对应其功能函数,对应功能5的函数会创建一个0x140的堆(对于chunk的size为0x150),然后把之前函数定义的两个order的内容组合再加一个Your order is submitted!发现有个格式化字符串漏洞,但是在循环外,也就必须submit后才会执行该函数。原创 2024-02-07 18:32:35 · 1241 阅读 · 1 评论 -
CTF-PWN-堆-【chunk extend/overlapping-1】
修改其size大小,使其覆盖下一个目标chunk,free后再malloc可得到覆盖目标chunk的大chunk。通过修改当前chunk的pre_inuse和pre_size,当free当前chunk时,会根据pre_size和pre_inuse确定的前一个chunk的地址可是否free,如果是pre_inuse为0从而实现合并。修改可free至faastbin的chunk的size大小,使其覆盖下一个目标chunk,free后再malloc可得到覆盖目标chunk的大chunk。原创 2024-01-21 22:29:27 · 1102 阅读 · 0 评论 -
CTF-PWN-堆-【use after free-2】
再看实际的buf的有多少,如果大于15就用malloc分配实际长度的堆,其指针为dest,然后将buf的内容复制进去,同时更新ptr里的内容,前八个字节为dest的值然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free两次,先free存储内容的指针,再free原ptr指针。如果小于15,就直接将buf的内容赋值到ptr的开始部分,然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free一次。同样,AH是ax的高8位,而AL是ax的低8位,这就是说ah为33h,al为44h。原创 2023-12-20 16:48:26 · 1017 阅读 · 0 评论 -
CTF-PWN-堆-【use after free-1】
再看实际的buf的有多少,如果大于15就用malloc分配实际长度的堆,其指针为dest,然后将buf的内容复制进去,同时更新ptr里的内容,前八个字节为dest的值然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free两次,先free存储内容的指针,再free原ptr指针。notelist数组存储着malloc分配的8字节的节点指针,每个节点指针有两个元素,一个是put函数,另一个是对应malloc分配的节点内容的指针,节点内容的大小由输入决定。简单的输入然后根据输入的数字有不同功能。原创 2023-12-19 23:49:42 · 1080 阅读 · 0 评论 -
CTF-PWN-堆-【malloc和free的工作流程】
以下都是基于glibc-2.19版本,其他版本会有变动,但依然可提供参考。原创 2023-12-03 17:21:56 · 1154 阅读 · 0 评论 -
CTF-PWN-堆- 【off-by-one】
(2)可以利用同时构造pre_size和对应的NULL字节溢出,然后unlink时合并,此方法的关键在于 unlink 的时候没有检查按照 prev_size 找到的块的大小与prev_size 是否一致。两坨空间:off_202010和0ff_202018分别存储着偏移202060和202040的地址,偏移202060对应的是author name的,偏移202040对应的是第三类堆块的地址。7将虚假chunk的部位设置为某位置的地址即可得到该地址的内容,再次利用printf导致泄露,从而知道函数地址。原创 2023-11-18 00:05:12 · 474 阅读 · 0 评论 -
CTF-PWN-堆-【堆溢出相关概括基本流程及first-fit演示与】
向堆中写入的字节数超过本身可使用的字节数(可使用的字节数不一定等于申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),所以可能覆盖到相邻高地址的下一个堆块。chunkdata段地址对应的chunk与topchunk不相邻,相当于free(chunkdata段地址),malloc(size)相差容得下一个最小chunk,则切割chunk两部分,free掉chunkdata段地址对应的chunk的size-size的部分。一个三目运算符 a?原创 2023-11-17 11:31:15 · 380 阅读 · 0 评论 -
CTF-PWN-堆-【前置知识相关函数和术语】
通过pre_size字段来获取上一个chunk的大小及地址(空间复用:当一个chunk没有被free时,它的下一个chunk的prev_size可以被当前chunk使用。fd为前一个已经free的chunk的地址,bk为后一个已经free的chunk的地址。malloc一方面会检查malloc的参数在负数范围内不得大于-2*MINSIZE且top_size的值减去分配的chunk的size大小的值大于MINSIZE (MINSIZE是最小的chunk的size大小)原创 2023-11-16 23:56:43 · 144 阅读 · 0 评论 -
CTF-PWN-堆
4.然后再次malloc此时出来的的是之前fakechunk的fd位置的chunk,内容为随意,然后free该chunk两次,再次malloc此时内容为_free_hook的地址,然后再次malloc,内容随意,再次malloc此时内容为getshell的函数地址且得到的是以_free_hook地址为userdata地址的chunk。利用重写第一个chunk时溢出覆盖到第三个chunk的fd的值(修改为第五个chunk的地址)同时利用重写第四个chunk溢出覆盖到第五个chunk的size值为合适的值。原创 2023-10-24 17:58:45 · 174 阅读 · 0 评论