Chunk Extend (Overlapping)
仅供个人学习参考
通过chunk extend 可以实现 chunk overlapping (块重叠)利用条件:1.程序中存在基于堆的漏洞2.漏洞可以控制chunk header 中的数据
效果:当chunk1 包含住chunk2时,chunk2可以正常使用,并且通过chunk1可以修改chunk2的内容
例题附件:https://raw.githubusercontent.com/GNchen1/Pages/main/Img/heapcreator
先用ida分析一下各部分main函数就没什么好看的了,就是一个switch函数read_input如图
create函数就是根据你输入的size大小来创建堆块,并且填入contentedit函数这里有个off-by-one漏洞,与上面的create一对比就能发现,编辑content内容时可以多写入一个字节show函数和delete函数也无漏洞
那么我们目前可利用的就是这个off-by-one,它能达到什么效果呢gdb调试一下先创建两个堆块进入调试界面后查看chunk内容红色框是heap结构体 绿色框是我们第一次创建的堆块的内 ...
canary绕过
仅供个人学习参考
canary保护Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。
我们知道,通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖 ebp、eip 等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让 shellcode 能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode 的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。
由于 stack overflow 而引发的攻击非常普遍也非常古老,相应地 ...
Use After Free
仅供个人学习参考
原理简单的说,Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用。但是其实这里有以下几种情况
内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。
而我们一般所指的 Use After Free 漏洞主要是后两种。此外,我们一般称被释放后没有被设置为 NULL 的内存指针为 dangling pointer。
例题HITCON-training 中的 lab 10 hacknotehttps://raw.githubusercontent.com/GNchen1/Pages/main/Img/hacknote
在delete函数中发现有uaf漏洞
magic函数可以获取flag
结合add_not ...
堆中的off-by-one
仅供个人学习参考
off-by-one 是一种特殊的漏洞利用,实质上是缓冲区溢出,但是只溢出一个字节,虽然不足以让我们像之前那样构造payload,但依旧可以加以利用。
Ubuntu 16.04 下安装VMware Tools
仅供个人学习参考
123sudo apt-get upgratesudo apt-get install open-vm-tools-desktop -ysudo reboot
使用echo命令输出flag
仅供个人学习参考
在获取shell后,有的时候会发现/bin/sh目录下只有echo命令(无法使用ls cat之类),这个时候可以使用如下命令输出flag文件的内容
1echo "$(<fileName)"
整数溢出
仅供个人学习参考
原理先看c语言常见数据类型及其范围因为数据类型的大小范围是编译器决定的
当程序中的数据超过其数据类型的范围时,会造成数据溢出,其中整数类型的溢出称为整数溢出以32位为例无符号上溢:无符号数 0xffffffff 加 1 会变成 0。无符号下溢:无符号数 0 减去 1 会变成 0xffffffff,即-1。有符号上溢:有符号正数 0x7fffffff 加 1 变成 0x80000000, 即从 2147483647 变成了-2147483648。有符号下溢:有符号负数 0x80000000 减去 1 变成 0x7fffffff,即从-2147483648 变成了 2147483647。
例题https://raw.githubusercontent.com/GNchen1/Pages/main/Img/intoverflow
其中v3为unsigned int8,范围为0到255(0xff),存在整数溢出,同时strcpy(dest, s)存在栈溢出风险,也存在后门函数思路:利用整数溢出绕过对v3的检查(使payload长度为260到264),再构造栈溢出re ...
堆相关
仅供个人学习参考
堆块大小chunk的大小(至少)都是8字节对齐,所以mchunk_ size的 低3位固定为0 (8D= 1000B)。为了充分利用内存空间,mchunk_ size的低3位分别存储PREV_ INUS、IS_MMAPPED、NON_MAIN_ARENA信息。NON_MAIN_ARENA用来记录当前chunk是否不属于主线程,1表示不属于,0表示属于。IS_ MAPPED用来记录当前chunk是否是由mmap分配的。 PRE_INUSE用来记录前个chunk块是否被分配, 如果与当前chunk向 上相邻的chunk为被释放的状 态,则PREV_ INUSE标志位为0。
32位:用户分配到的最小堆块是17B: pre_size(4B) + size(4B) + fd(4B) + bk(4B) + pre_inuse (1B)若用户申请的大小超过最小堆块大小,会与8B对齐(2size_sz)64位:用户分配到的最小堆块是33B: pre_size(8B) + size(8B) + fd(8B) + bk(8B) + pre_inuse (1B)若用 ...
栈上的partial overwrite(绕过pie)
仅供个人学习参考
原理我们知道, 在开启了随机化(ASLR,PIE)后, 无论高位的地址如何变化,低 12 位的页内偏移始终是固定的, 也就是说如果我们能更改低位的偏移, 就可以在一定程度上控制程序的执行流, 绕过 PIE 保护
例题2018 - 安恒杯 - babypie https://raw.githubusercontent.com/GNchen1/Pages/main/Img/babypie
可以看到保护全开(除了relro半开)ida查看,发现有两次栈溢出,且有后门函数在第一次 read 之后紧接着就有一个输出, 而 read 并不会给输入的末尾加上 \0, 这就给了我们 leak 栈上内容的机会。我们利用第一次read泄露canary而返回地址与 get shell 函数的地址只有低位的 16 bit 不同,而返回地址低两位字节中只有4 bit是无法控制的,如果覆写低 16 bit 为 0x?A3F, 就有一定的几率 get shell所以考虑低位爆破后门函数的地址
canary为了防止被泄露,最低字节固定为\x00,所以我们可以覆盖这个字节来达到泄露的目的
ex ...
Stack pivoting(栈翻转)
仅供个人学习参考
原理如其名,劫持栈指针指向攻击者能够控制的内存,再进行rop
利用情况:1.可以控制的栈溢出的字节数较少,难以构造较长的 ROP 链2.开启了 PIE 保护,栈地址未知,我们可以将栈劫持到已知的区域。3.其它漏洞难以利用,我们需要进行转换,比如说将栈劫持到堆空间,从而在堆上写 rop 及进行堆漏洞利用
利用条件:1.可以控制程序执行流。2.可以控制 sp 指针。
例题X-CTF Quals 2016 - b0verfl0w https://raw.githubusercontent.com/GNchen1/Pages/main/Img/b0verfl0w
存在栈溢出,但溢出后可供写入的字节数很少,考虑Stack pivoting
思路:往栈上写shellcode,再劫持esp到shellcode处
栈变化如下,其中padding为填充的垃圾数据fgets读入数据后leave ret后,pop eipeip执行jmp esp后eip执行sub esp, 0x28;jmp esp后
exp如下:
123456789101112131415from pwn im ...