关闭aslr

sudo sysctl -w kernel.randomize_va_space=0

绑定libc

p=process([‘./bin’],env={‘LOAD_PRELOAD’:’./libc-2.23.so’})

Stack

ROP

Defcon 2015 Qualifier R0pbaby,AliCTF 2016 vss,PlaidCTF 2013 ropasaurusrex

ret2text

找后门位置

ret2shellcode

shellcode的编写,以及一些编码的方法,如可见字符的shellcode等

ret2syscall

参数的设置

ret2libc

leak出libc,以及确定libc的版本

ret2csu

__libc_csu_init中的gadgets

ret2reg

找call reg或者jmp reg

SROP

Defcon 2015 Qualifier fuckup

BROP

http://ytliu.info/blog/2014/05/31/blind-return-oriented-programming-brop-attack-er

HCTF 2016 出题人跑路了(pwn50)

stack pivot

EKOPARTY CTF 2016 fuckzing-exploit-200(基于栈的stack pivot)
HACKIM CTF 2015 -Exploitation 5(基于堆的stack pivot)

ret2dl_resolve

了解动态链接的过程:
《程序员的自我修养》
http://blog.chinaunix.net/uid-2477416-id-3053007.html

伪造动态链接的相关数据结构如linkmap、relplt:
http://rk700.github.io/2015/08/09/return-to-dl-resolve/
http://angelboy.logdown.com/posts/283218-return-to-dl-resolve
http://www.inforsec.org/wp/?p=389
Codegate CTF Finals 2015 yocto(fake relplt) http://o0xmuhe.me/2016/10/25/yocto-writeup
HITCON QUALS CTF 2015 readable(fake linkmap)

Hack.lu’s 2015 OREO

Stack smash

覆盖canary保护输出的字符地址

Partial Overwrite

http://ly0n.me/2015/07/30/bypass-aslr-with-partial-eip-overwrite/
HCTF 2016 fheap(基于堆溢出的Partial overwrite)
溢出位数不够:
XMAN 2016 广外女生-pwn
Codegate CTF Finals 2015,chess

Heap

堆管理机制

多数Linux发行版:ptmalloc/dlmalloc glibc内存管理ptmalloc源代码分析.pdf(精读1-27,粗读28-130)
Android/firfox:jemalloc
windows:微软自己实现了一套内存管理机制
Linux内核:slab、slub、slob分配器

堆漏洞的利用思想

破坏堆内存管理的相关数据结构:如arena、bin、chunk
破坏堆内存中的用户数据:覆盖变量指针、函数指针、数据等
一般情况下都是为了构造任意内存读写以及控制流劫持

堆漏洞的防护方法

保护堆内存管理相关的数据结构:Heap Canary、对数据结构进行加密、在堆管理代码中加入大量安全检查
通用防护:ASLR、DEP

堆漏洞利用技术与技巧

Use After Free & Double Free

UAF:DEFCON CTF Qualifier 2014:shitsco、BCTF 2016:router、HCTF 2016 5-days(较难)

Double Free: 0CTF 2016:freenote、HCTF 2016 fheap、HCTF 2016 5-days(较难)

Heap Overwrite

Overflow directly

XMAN 2016 fengshui(紫荆花 pwn),SSC安全大会百度展厅 heapcanary,攻防世界 babyfengshui

Fastbin attack

利用套路:Heap fengshui,house of Spirit

alictf 2016 fb,alictf 2016 starcraft,0ctf 2016 zerostorage(较难)

alictf 2016 starcraft,0ctf 2016 zerostorage(较难)

0ctf 2016 zerostorage(较难)

Unsorted bin attack

利用思路

​ victm->bk为要写入地址-4,再次分配时bck->fd=unsorted_chunks(av)会触发一个任意地址写。写入内容是libc中的一个地址。只不过此时unsortbin被破坏,再次分配代码会崩掉,通常可以改写global_max_fast,从而导致接下来所有分配都是在fastbin进行

​ 通过堆溢出覆盖victim->bk为一个size为fake chunk,再次分配unsorted_chunks(av)->bk=bck会改写unsortbin链表头的bk,此时再分配x-4大小的内存即可返回fakechunk。

0ctf2016 Zerostorage

Overwrite Topchunk

House of Force:

​ Bin中没有任何合适的内存时会从Topchunk分配内存

​ 改写Topchunk的size为一个很大的数,如0xffffffff,分配alloc_size-4大小的内存,由于alloc_size可控,所以此时topchunk位置可控,再次分配即可分配到想分配的位置

​ 需要预先泄漏topchunk地址

BCTF 2016 bcloud,BCT 2016 ruin(arm结构的程序)

Unlink:当free(mem)调用时,如果与mem相邻的块是空闲的,则会将其从空闲链表中拿(unlink)下来并与mem合并

classical Unlink Attack(现glibc中有检查,不可用):

​ 如果通过heapoverflow将P->bk以及P->fd覆盖位攻击者可控制的地址,那FD->bk=BK;BK-fd=FD;=>P->fd->bk=P->bk;P->bk->fd=p->fd;造成任意写,不过要求(要写的内容+4)or(要写的内容+8)必须可写,否则会崩溃。

Modern Unlink Attack:

​ 找一个Pointer X,*X=P,Overflow P-bk=X-4;P-fd=X-8

​ P->bk->fd==X-4->fd==P,P->fd->bk==X-8->bk=P

​ Unlink可得到*p=X,此时可通过P修改X,如果X是数据指针则可能造成任意地址读写

Hitcon 2014 qualifier stkof,MMA CTF 2016 Dairy,PlaidCTF 2014 200 ezhp

Off by one & Off by null

Glibc_Adventures-The_Forgotten_Chunks.pdf

off by one:MMA CTF 2016 Dairy

off by null:plaid CTF 2015 datastore,XMAN 2016 Final love_letter

Other techniques

改写morecore:HCTF 2016 5-days

House of Orange : 改写_IO_list_all : Hitcon 2016House of orange

General exploit techniques

Heap fengshui(堆风水/堆排布)

通过操纵内存的分配与释放,来控制堆快装内存中的相对位置

动机:真实漏洞在利用的时候,堆是混乱的,因为存在漏洞的服务可能已经服务过很多用户,在触发漏洞时无法预计堆已经做了多少次malloc多少次free

Heap fengshui可以让堆从混乱状态转换为确定状态

不同的内存管理策略对应的heap fengshui的方法不同

XMAN 2016 fengshui,33c3 CTF babyfengshui

Heap spray(堆喷)

不断分配分配内存,并填充(大量0x0c)+shellcode,直到0x0c0c0c0c内存地址被分配,多用于脚本语言漏洞的利用

大多数内存地址的值都是0x0c0c0c0c,0x0c0c0c0c地址也是0x0c slide+shellcode可以用其绕过ASLR,控制流劫持(jmpaddr/jmp addr)时,只要addr是喷过地址都可以执行shellcode,注意addr=0x0c0c0c0c **addr=0x0c0c0c0c ***addr=0x0c0c0c0c

必须在NX关闭时才能直接用heap spray劫持控制流

pwnhub.cn calc

Exploit mmap chunk

当malloc内存块大于128k时,glibc会直接mmap内存

如果mmap的内存将整个binary的地址空间全部覆盖,我们可以轻松拿到任意地址相邻的堆内存,ASLR就失去意义

适用于没有限制分配内存大小的题目

Hitcon 2014 qualifier stkof

0ops培训资料Linux heap internal.pdf

格式化字符串

MMACTF 2016 greeting,HCTF 2016 fheap,RuCTF 2016 weather

竞争条件漏洞

安恒杯 武汉大学邀请赛 fackfuzz,stupid shell

stupid shell

代码逻辑漏洞

UCTF 2016 note

类型混淆漏洞

CVE-2015-3077

缓冲区未初始化

栈未初始化时,栈中数据为上次函数调用留下的栈帧

堆未初始化时,堆中数据为上次使用该堆块所留下的数据

UCTF 2016 note,华山杯2016决赛 SU_PWN,33C3 CTF PWN