Double fetch漏洞是一种条件竞争漏洞,由于多线程的原因,使得内核里多次访问到用户的数据不一致而引发的漏洞。我们用户态传数据给内核,如果是简单的数据,则按传值传递,如果数据量很大很复杂,我们则传指针给内核。内核里首先会对数据的合理性进行校验,校验成功后,待会内核又重新在某处来访问我们的数据,而如果有另外一个线程在这之前篡改了数据,就使得数据不一致,从而可能形成漏洞。
我们以0ctf2018-final-baby这题为例
首先,我们用IDA分析一下ko驱动文件
Double fetch漏洞是一种条件竞争漏洞,由于多线程的原因,使得内核里多次访问到用户的数据不一致而引发的漏洞。我们用户态传数据给内核,如果是简单的数据,则按传值传递,如果数据量很大很复杂,我们则传指针给内核。内核里首先会对数据的合理性进行校验,校验成功后,待会内核又重新在某处来访问我们的数据,而如果有另外一个线程在这之前篡改了数据,就使得数据不一致,从而可能形成漏洞。
我们以0ctf2018-final-baby这题为例
首先,我们用IDA分析一下ko驱动文件
House of force能够使我们将堆申请到任意地址,满足以下条件,即可达到利用
能够改写top chunk的size域
能够自由控制堆分配大小
能够知道目标地址与top chunk地址之间的距离(可以泄露地址,计算出偏移)
详细见CTF-WIKIhttps://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/house_of_force-zh/
在linux下,二进制引用的外部符号加载方式有三种,FULL_RELRO、PARTIAL_RELRO、NO_RELRO,在PARTIAL_RELRO和NO_RELRO的情况下,外部符号的地址延迟加载,并且,在NO_RELRO下,ELF的dynamic段可读写。
ELF有plt表和got表,程序调用外部函数函数时,call的是plt表项,而plt表中,是这样的
shellcode是一段用于利用软件漏洞而执行的代码,在实际的软件中,某些软件对允许输入的字符范围做了限制,导致检测到非法字符,从而无法成功输入shellcode。这时就需要加密shellcode。谷歌有一个开源工具ALPHA 3,可以将shellcode加密为全ascii可见字符。其大致原理根本文我们讲的是差不多的。
本文,我们要自己实现一个shellcode加密。我们就从攻防世界的一题holy_shellcode来看吧。这题的附件,攻防世界上没有,到这里下载https://pwn-1253291247.cos.ap-chengdu.myqcloud.com/holy_shellcode
我们用IDA分析一下