PWN-堆基础之Off By One
Off-By-OneOff-By-One即可以产生一个字节的溢出,Off-By-One中又包括Off-By-Null(poison_null_byte),即溢出的一个字节被设置为0,多产生于strcpy或自定义输入函数中,将末尾置空。
一般通过修改size字段进行漏洞利用。
Off-By-One利用场景1(控制heap_list):程序中存在Off-By-One漏洞会溢出修改heap_list(即bss上存放堆指针的)
利用思路:
首先在某块区域处构造一个fake_chunk块。
通过Off-By-One(null)溢出控制bss的最后一个字节指向构造的区域。
通过heap_list即可实现对fake_chunk块的读写操作。
**例题:Asis CTF 2016 b00ks**
漏洞点在于菜单之前输入user_name时,会产生off-by-null漏洞,而user_name后紧跟着的是heap_list。
add函数
12345678910111213141516171819202122232425262728293031323334353637383940414243444 ...
PWN-堆基础之LargeBin_Attack
LargeBin_AttackLargeBins结构:
bins[64] ~ bins[126]
63 个循环双向链表
FIFO
管理大于 504 Bytes 的 free chunks(32位下)
[
堆块结构:
1234567891011struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nex ...
PWN-几个简单堆题
1.hitcontraining_heapcreator一次add函数先申请固定0x10大小的chunk,又申请一个可控大小的chunk,其中第一个固定chunk的数据段存放第二个chunk的大小和第二个chunk的数据地址。
show函数会通过固定chunk块的数据地址找到固定chunk块打印内容。
漏洞点:edit编辑的时候,会读入size+1个字节,存在off-by-one漏洞。
漏洞利用:
通过off-by-one漏洞在修改chunk0时修改chunk1的size字段为较大字段0x81,此时free(1)再malloc(0x70)会将free掉的chunk1申请回来,并且申请回来的是0x80大小的chunk,这0x80大小的chunk是覆盖chunk2的,这样就实现了通过chunk1可以溢出到chunk2的内容(因为正常申请和释放是控制不到那个固定chunk块的,edit只能修改包含data的那个自定义chunk块)
修改chunk2的固定chunk块的chunk地址为free的got表地址,这样show调用时会打印处got表地址存放的内容,也就是free在libc中的真实 ...
PWN-PIE学习
PIEPIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题
开启PIE保护的时候每次运行时加载地址是随机变化的
PIE绕过方法1.partial writepartial write就是利用了PIE技术的缺陷。内存是以页载入机制,如果开启PIE保护的话,只能影响到单个内存页,一个内存页大小为0x1000,那么就意味着不管地址怎么变,某一条指令的后三位十六进制数的地址是始终不变的。因此我们可以通过覆盖地址的后几位来可以控制程序的流程。(开启了PIE的程序在ida中地址都较小,text段一般为后三或四位,该地址为实际地址相对于程序的基地址的偏移。未开启PIE的程序在ida中地址为实际地址)
程序开启PIE后,可以修改vuln函数返回值的后四位位后门函数后四位(即ida中地址),原返回地址为main函数,由于mai ...
PWN-Canary学习
Canary原理
通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖ebp,eip等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址让shellcode执行。
当启用栈保护时,函数开始执行的时候会先往栈底插入cookie信息,如果不合法就停止程序运行(栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将cookie信息覆盖掉,导致栈保护检查失败而阻止shellcode的执行,避免漏洞利用成功。在linux中我们将cookie信息成为canary。
64位系统中其栈结构如下1234567891011121314High Address | | +-----------------+ | args | +-----------------+ | return address | +------------- ...
Pwn-浅谈orw利用
沙箱沙箱保护是对程序加入一些保护,最常见的是禁用一些系统调用,如execve,使得我们不能通过系统调用execve或system等获取到远程终端权限,因此只能通过ROP的方式调用open, read, write的来读取并打印flag 内容
123fd = open('/flag','r')read(fd,buf,len)write(1,buf,len)
开启沙盒的两种方式在ctf的pwn题中一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
prctl函数调用如:
1return prctl(22, 2LL, &v1);
123456789101112131415// 函数原型#include <sys/prctl.h>int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);// option选项有很多,剩下的参数也由opt ...
PWN-堆基础之House of Orange
House of Orange1.IO_FILE在看House of Orange的例子之前,我们首先了解一个Linux中的利用机制_IO_FILE
可以使用ptype /o struct _IO_FILE查看这个结构的定义,在pwndbg中可以直接写为dt FILE
_IO_FILE这个结构体中有一个_chain可以看到它的类型是一个struct _IO_FILE *,也就是说是一个指向其他_IO_FILE结构体的指针;在使用fopen之类的函数打开一个文件之后,实际上系统会在堆上创建一个这样的_IO_FILE结构体,并将其加入到一个单链表中,单链表的头部为_IO_list_all,这个单链表可以理解为是一个专门存储_IO_FILE的fastbin。另外vtable为虚函数表指针,实际上是为了与C++的streambuf类兼容才会出现的,但是这里兼容性上的问题,让GLIBC的file stream有可能存在虚函数表劫持的漏洞
另一方面,我们知道Linux的文件系统中一切皆为文件
每一个进程创建时都会有三个标准I/O File Stream:
stdin
stdout
s ...
PWN-堆基础之Unsorted bin
Unsorted bin1.Unsorted bin leak简介
通过unsorted bin的partial unlink,泄露main_arena地址信息,通过计算在libc中的偏移进而获取libc基地址。
条件
1.存在UAF漏洞 或 其它可以修改unsorted bin中chunk的bk指针的漏洞。
2.glibc <= 2.28(2.29引入了UsortedBin Attack的缓解机制)。
利用
前面unsorted bin的基础知识中,我们了解到unsotred bin中的chunk会被分类到small bin和large bin
中。
这些chunk在被分类时,需要进行partial unlink操作。相比于之前提到的unlink,这里的断开连接更简
单:
victim的fd指针总是指向unsorted bin的头结点,因此可以被忽略。
victim->bk.fd = unsorted_bin_head
unsorted_bin_head.bk = victim.bk
首先,构造如下chunk:
12345c ...
PWN-堆基础之Safe Unlink
Safe Unlink简介
Safe Unlink增加了两个检测机制。
首先,检测大小是否一致,即检查next_chunk的prev_size和当前chunk的size域是否相等。
然后,检测双向链表完整性,即检查chunk.fd -> bk == chunk、chunk.bk -> fd == chunk。
条件
可以泄露保存chunk指针的数组地址。
存在堆溢出漏洞可以修改next_chunk的size域 或 存在UAF漏洞。
可以泄露libc地址。
利用
为方便描述,下文称chunk指针数组 = m_array。
在当前chunk数据段伪造一个fake_chunk,使得fake_chunk的fd指向&m_array - 0x18,bk指向
&m_array - 0x10。(绕过双向链表检测)
将next_chunk的prev_size修改为当前chunk大小,然后将size域中prev_inuse置0。(绕过大小
检查,prev_size用于程序定位到fake_chunk) ...
PWN-堆基础之Unsafe Unlink
Unsafe Unlink1.unsorted bin首先介绍unsorted bin,unsortedbin 是一个双向链表的结构,因此a中这两个指针分别是bk和fd,分别指向前一个和后一个chunk;free时,若该chunk没有紧邻top chunk,则不会与top chunk进行合并,它首先被链入unsorted bin中,被首次分配时,unsorted bin会扫描各chunk并根据大小链入不同bin中。
2.Unsafe Unlink简介
Unsafe Unlink指的是早期unlink,没有大小检查、双向链表完整性检查,并且没有NX保护
当进行unlink时,会执行如下操作:
12this->fd->bk = this->bk;this->bk->fd = this->fd;
因此,如果我们能够伪造fd和bk的指向,就可以实现任意地址写入,而要进行unlink操作我们需要修改next_chunk的pre_inuse为0,这是free掉next_chunk会使这两个chunk进行合并。
条件
未开启NX保护。
程序存在堆溢出漏洞 ...