CTF PWN 题之 setbuf 的利用
setbuf 的利用前言在学习IO_FILE的时候,学到关于IO_FILE结构体的时候死活都不理解为什么在pwn题要设置缓冲区才能够有显示,不设置的话就没有显示,学到了setbuf的时候了解到了setbuf的利用,于是写这篇笔记,算是对自己的学习加深理解,文章很多参考其他师傅的,后面会给出参考链接
setbuf关于IO__FILE的结构体介绍和几个std(stdin,stdout,stderr)这里就不介绍了。有兴趣的师傅可以参考我的另一篇笔记
C 库函数 void setbuf(FILE *stream, char *buffer) 定义流 stream 的缓冲区在哪。除非 buffer 是 NULL 。
也就是说buffer这个数组会被设置为stream的缓冲区,当你调用 setbuf 函数并将其 BUFF 参数设置为 NULL(通常用数字 0 表示)时,你正在告诉标准I/O库停用缓冲机制。
deme案例为了方便理解setbuf函数的用法,这里写两个demo案例
demo (setbuf buff)代码如下
12345678#include<stdio.h>i ...
off-by-one-Plaiddb
[off-by-one]–plaidctf 2015 plaiddb前言这个题做了很久,太累了,放暑假还是没得在学校学习效率高,不是不想学就是有其他的事情,准备做完这些堆题,开始转为re为主了,还是感觉PWN没什么钱途呀。
分析12345678[!] Could not populate PLT: invalid syntax (unicorn.py, line 110)[*] '/ctf/work/off_by_one/PLAiDB/PlaidDB' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled RUNPATH: '/tmp/ld-2.23.so'
不是很妙,因为防护全开了,但不是很影响,这些防护基本上只能防护防护栈溢出,对于堆溢出基本没什么用。
tips
这里有个小知识点,因为这个这个漏洞需要用到一些基于lib2.23的性质 ...
ISCC-regis复现
ISCC-regis复现register
可以改got表
存在off_by_one漏洞
存在结构体
1234struct { int size; char * heapaddr; }user;
尝试修改heapaddr的值,便可以实现任意地址写
通过那个off-by-one漏洞来将一个块给扩大到那个0x20的那个大小,便可以构造堆重叠,然后edit那个chunk即可edit那个0x20的chunk,于是可以达到任意写的功能,将free_hook改为system即可,
exp如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243# --------------------------exploit--------------------------def exploit(): li('exploit...') for i in range(0,2): add(0x10,"1") ...
IO_FILE调试
IO_FILE做题流程前言在调试IO_FILE类型的题的时候总结的知识点
关于IO_FILE的libc更换在调试IO类型的题的时候,在之前我们需要换libc,因为一般题目给的libc都是没有符号表的,于是我们寻找一个与之对应的有符号表的libc即可,最好是一样的
![image-20231208151227955](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208151227955.png)
没有一模一样的带符号的libc的,相同版本号的也可以
IO_FILE结构体查看有时候我们在分析IO的时候有对应的结构体可以看是最好的,这样我们就能明确知道我们改了哪些数据,这也是我们为什么要换libc的原因
自带的符号表变量如果是libc里面本身就有的符号,下面的命令可以直接打印出结构
1p [*_IO_list_all]
可以看到输出结果如下
![image-20231208151953793](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆 ...
house of apple
house of apple简介House of apple 是 roderick01 师傅在 2022 年 7 月提出的一种新型的 IO 利用思路,总共提出了三种调用方式,分为了 House of apple1、House of apple2、House of apple3,这三种调用方式都是基于 roderick01 师傅发现的新调用链:IO_FILE -> _wide_data
前置基础在 libc2.34 以上的高libc版本中,glibc 逐渐将许多 hook全局变量移除了,包括 _malloc_hook / _free_hook / _realloc_hook ,这就导致我们无法在向从前那样利用 hook 作为钩子函数来 getshell 了,所以到了高版本,堆利用便离不开对 _IO_FILE 的伪造和对 IO 流的劫持
在 House of apple 之前的高版本 IO 利用方式有(详细可以见我之前写的几篇文章):
House of pig :多手法联合IO利用之House of pig 学习利用
House of kiwi & House of emm ...
伪造 vtable 劫持程序流程
伪造 vtable 劫持程序流程简介前面我们介绍了 Linux 中文件流的特性(FILE),我们可以得知 Linux 中的一些常见的 IO 操作函数都需要经过 FILE 结构进行处理。尤其是_IO_FILE_plus 结构中存在 vtable,一些函数会取出 vtable 中的指针进行调用。
因此伪造 vtable 劫持程序流程的中心思想就是针对_IO_FILE_plus 的 vtable 动手脚,通过把 vtable 指向我们控制的内存,并在其中布置函数指针来实现。
因此 vtable 劫持分为两种,一种是直接改写 vtable 中的函数指针,通过任意地址写就可以实现。另一种是覆盖 vtable 的指针指向我们控制的内存,然后在其中布置函数指针。
实践这里演示了修改 vtable 中的指针,首先需要知道_IO_FILE_plus 位于哪里,对于 fopen 的情况下是位于堆内存,对于 stdin\stdout\stderr 是位于 libc.so 中。
1234567891011int main(void){ FILE *fp; long long *vtabl ...
Unsorted Bin Attack
Unsorted Bin Attack概述Unsorted Bin Attack,顾名思义,该攻击与 Glibc 堆管理中的的 Unsorted Bin 的机制紧密相关。
Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指针。
Unsorted Bin Attack 可以达到的效果是实现修改任意地址值为一个较大的数值。
Unsorted Bin 回顾在介绍 Unsorted Bin 攻击前,可以先回顾一下 Unsorted Bin 的基本来源以及基本使用情况。
基本来源
当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。
释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。关于 top chunk 的解释,请参考下面的介绍。
当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是 ...
Unlink
Unlink原理我们在利用 unlink 所造成的漏洞时,其实就是对 chunk 进行内存布局,然后借助 unlink 操作来达成修改指针的效果。
我们先来简单回顾一下 unlink 的目的与过程,其目的是把一个双向链表中的空闲块拿出来(例如 free 时和目前物理相邻的 free chunk 进行合并)。其基本的过程如下
下面我们首先介绍一下 unlink 最初没有防护时的利用方法,然后介绍目前利用 unlink 的方式。
Tcache attack
Tcache attack
tcache makes heap exploitation easy again
前言tcache 是 glibc 2.26 (ubuntu 17.10) 之后引入的一种技术(see commit),目的是提升堆管理的性能。但提升性能的同时舍弃了很多安全检查,也因此有了很多新的利用方式。正如前面说的,在2.26后面增加的tcache使得堆的利用更加方便简单了,下面的文章是整理与ctfwiki上的知识和其他大佬的博客的
tcache结构体tcache引入了两个新的结构体,tcache_entry 和 tcache_perthread_struct。
这两个结构体和fastbin结构体很像,但是不太一样。
tcache_entry
123456/* We overlay this structure on the user-data portion of a chunk when the chunk is stored in the per-thread cache. */typedef struct tcache_entry{ str ...
PWN堆溢出技巧:ORW的解题手法与万金油Gadgets
PWN堆溢出技巧:ORW的解题手法与万金油Gadgets前言在做堆题的时候基本上都会结合沙箱去出了,不再是单一的getshell了,感觉出的越来越卷了,本文将介绍一下堆溢出的一些ORW做法
思路低版本在 Glibc2.29以前的 ORW解题思路已经比较清晰了,主要是劫持 free_hook 或者 malloc_hook写入 setcontext函数中的 gadget,通过 rdi索引,来设置相关寄存器,并执行提前布置好的 ORW ROP chains,查看setcontext函数发现,在修改rcx的值后接着有个push操作将rcx压栈,然后汇编指令按照顺序会执行截图中最后的retn操作,而retn的地址就是压入栈的rcx值,因此修改rcx就获得了控制程序流程的能力。
1234567891011121314151617<setcontext+53>: mov rsp,QWORD PTR [rdi+0xa0]<setcontext+60>: mov rbx,QWORD PTR [rdi+0x80]<setcontext+67>: mov ...