首先,检查一下程序的保护机制
然后,我们用IDA分析一下,经典的增删改查程序
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分析一下
首先,我们检查一下程序的保护机制
然后,我们用IDA分析一下,是一个经典的增删改查的程序,然后我们看到创建堆时,[前两个堆是用malloc创建,后面的堆用calloc创建]{.mark},这意味着,如果要泄露libc地址,只能靠前两个堆,后面的堆从bin里取出后会清空里面的信息。