OFF-BY-NULL Tcachebin该利用链利用了 **Off-By-Null **漏洞来触发 **Backward Consolidation(向后合并)**从而制造出 **Overlapping **。接着,它通过 Unsorted Bin 泄露 libc 的基址,并利用 double-free 进行 Tcache Poisoning,将 __free_hook 覆盖为 one_gadget 从而获取 shell。 hitcon_2018_children_tcache(Off-By-NULL) main1234567891011121314151617181920212223242
OFF-BY-ONE 例题分析npuctf_2020_easyheap题目提示 ubuntu18.04 版本,高版本 libc 2.27 tcachebin attack( tcache poisoning ) 12345678910111213141516171819202122232425262728293031323334int __fastcall main(int argc, const char **argv, const char **envp){ char buf[4]; // [rsp+4h] [rbp-Ch] BYREF unsigned __int64
Off-By-One漏洞原理及利用参考文献:https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/off-by-one/ 什么是off-by-one?off-by-one是一种比较特殊的溢出漏洞,指的是当程序向缓冲区写入的字节数超过了这个缓冲区本身申请的字节数并且只越界了一个字节。 off-by-one漏洞原理offbyone只单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关,也不排除写入的大小正好只多出了一个字节 边界验证不严通常包括: 使用循环语句向堆块中写入数据的时候,循环的次数设置错误 字符串操作不合适 一
Fastbin DOUBLE FREEFastbin Attack 基本介绍fastbin attack是一类漏洞的利用方法,是指所有基于fastbin机制的漏洞利用方法。这类利用的前提是: 存在堆溢出、UAF 等能够控制 chunk 内容的漏洞。 漏洞发生于 fastbin 类型的 chunk 当中。 Fastbin Attack 漏洞原理fastbin attack 存在的原因在于 fastbin 是使用单链表来维护释放的堆块的,若一个 chunk 被释放之后进入 fastbin,那么其相邻下一个堆块的 prev_inuse 标志位不会被清空(prev_inuse 简写为 P,位于 s
fastbin 错位伪造这个其实没有说专门去了解过这种攻击手法,不过在很多题目当中都遇到过。大概是什么意思呢: 比如我们在 fastbin 链表中伪造了某个 bin,glibc 是要检查 size 的大小是否符合申请的堆块大小的。 但在我们伪造的 chunk 当中并不存在这么个 size 位,使得能够通过 size 的判断条件。 此时我们就需要通过 UAF 或者堆溢出去修改当前 fake_chunk 的 size 位去绕过这个判断。 不过这就带出了一系列问题:size 值从哪里来?即使 size 问题解决了,又怎么在 fake_chunk 内填入合适的内容去篡改已知函数?例如 free_got
Use After Free 例题分析hitcontraining_uaf main 函数分析123456789101112131415161718192021222324252627282930313233343536373839404142int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ int n2; // eax char buf[4]; // [esp+0h] [ebp-Ch] BYREF int *p_argc; // [esp+4h] [ebp-8h] p_a
UAF/use after freeUAF 的本质是复用未清零的指针,使已经释放到 bin 当中的堆块内容可以被修改或者打印出来,依据泄露的 fd 和 bk 指针或者在堆中布置 system(‘/bin/sh’);去调用获取 shell UAF的概述UAF 是 Use After Free 的缩写,中文叫 “释放后使用”,是堆漏洞利用的重要方式 当我们 free 适当大小的chunk时,我们 free 掉的chunk会先被放入bins,在我们再次申请适合大小的chunk 时,系统会有限从我们的 bins 中取出之前free掉的chunk返回给我们,我们此时会有两种
内存空间的开辟与释放程序运行时的标准内存布局:代码段(.text )存放编译后的机器指令,只读,不可修改。CPU 会从这里读取指令执行 数据段(.data)已初始化的全局变量、静态变量。在程序运行前就分配好,生命周期是整个程序。 bss 段(.bss)存放未初始化的全局变量、静态变量。特点:系统自动清 0,在运行分配。 栈(stack)存放局部变量,函数参数,返回地址。自动分配自动释放。 堆(heap)是程序员手动申请的动态内存,不连续、空间大、手动管理、易泄露 bin 的分类体系:Tcache bin: 大小范围:0x20-0x410 单链表 线程私有缓存,LIFO,几乎无 size 检查,
堆利用/glibc内存管理什么是堆?首先明确一下堆的概念,堆不同于栈,堆是(由操作系统内核或者堆管理器)动态分配的,**只有在程序需要时才会分配。**在CTFpwn程序中,栈是程序加载进内存后就会出现,而堆是由malloc,alloc,realloc函数分配内存之后才会出现。 堆(chunk)内存是一种允许程序在运行过程中动态分配和使用的内存区域。相比于栈内存和全局内存,堆内存没有固定的生命周期和固定的内存区域,程序可以动态地申请和释放不同大小的内存。被分配后,如果没有进行明确的释放操作,该堆内存区域都是一直有效的。 windows和linux下的堆分配,管理方式都不同,这里主要是l