这个很久总结的了,基本很久没打比赛了,现在发出来了—— 20190903
本文分为信息泄露和漏洞利用技术,因为很多时候信息泄露都是通用,下面的这两部分会重合
信息泄露
- 程序本来就给你泄露就再好不过了
- 利用wrtite,puts,printf等泄露
- 利用%s这个遇到00才停止的可能可以泄露(strlen,strdup等都需要关注)
- 格式化字符串%x或这%p泄露
- uaf的任意读取
- smallbin(unsortbin)的fd或者bk泄露libc
- fasbin的fd可泄露heap基址
- 有时候题目甚至都没泄露函数(wrtite,puts,printf等),这时候就要将某个函数的got表改为输出函数的plt达到可泄露的目的(Hitcon 2014 stkof)
- 有时候利用strcpy复制到\x00才结束可以利用程序本有的功能泄露,还可以进行溢出
- 可能还有申请了一个字符串数组,没有初始化清零,即可泄露栈地址,heap或者libc等,应该栈地址比较多
漏洞利用技术
栈
- dep没开的基本为执行shellcode或者覆盖返回地址为cat flag的函数
- 覆盖返回地址为getflag的函数
- 有libc的,泄露之后写/bin/sh到bss,再执行system(静态编译的使用系统调用),没libc就尝试libc database查或者DynELF泄露
- 有时候栈上的地址不够可以转移到bss或者堆上进行rop,这时候就需要栈翻转了,一般使用pop ebp;ret; leave;ret;这两个gadgets
- canary的话有条件的可以逐个字节爆破或者利用其他漏洞泄露
- ret2dlreslove
- brop(待实践)
- srop(待实践)
- 有时可能是纸老虎,seccon 2017 babystack (go lang pwn)
格式化字符串
- 写got表
- 假如格式化传在堆上就通过将ebp覆盖为leave,ret的地址,在堆上进行rop
- 好像0ctf的EasiestPrint就是格式化绕过full relo
堆
- uaf
- fastbin attack(包含house of spirit)【可用double free或堆溢出来干】
- unlink
- off by one
- house_of_lore(small bin的前后的chunk伪造)
- unsortbin attack
- house_of_force(覆盖top chunk,返回几乎任意的指针)
- house_of_einherjar(控制pre size操纵合并后的地址)
- house of orange
- 堆重叠
- 利用“堆漏”洞泄露libc,canary,之后覆盖返回地址 0x00ctf 2017 Memo
总的利用方式
其实就是劫持控制流方式
- 覆盖返回地址
- 覆盖got表
- 覆盖malloc hook或这free hook
- 覆盖虚表指针(简单uaf)
- 覆盖IO FILE 的vtable并伪造 (0x00sec 2017 babyheap)
- 覆盖ld的
_dl_fini
什么的绕过full relo,可以劫持exit函数(这个还需实践)
套路
- 00截断绕过长度检测
- 整数溢出绕过数字(长度)检测
堆套路
1、任意地址写:fastbin 的uaf,unlink,普通的uaf
2、泄露堆地址:fastbin的free
3、泄露libc地址:非fastbin的free,如smallbin
4、堆溢出:fastbin的uaf可以在当前堆块伪造同样大小的size之后就可以溢出下一个堆块的size了
重点关注 -1 因为0-1就整数溢出了
题目环境构建
socat tcp-listen:port,fork exec:./程序名,reuseaddr
nc -vc “./程序名” -kl ip port //好像不太行哦
(k即fork)