终于来到了传说中的堆,这是攻防世界里面的堆第一次,刚遇到的时候有点懵逼,看了wp也看不懂,后来才知道是堆题。。。
嗯,我回来了,哈哈哈哈,首先详细了分析了一波题目,先把重要的函数例举出来
纵观全局在我菜鸟看来就只有个system(“asdadasd;/bin/sh;as21sad12e”);这个漏洞,因为system的参数由我们控制,所以就有无限可能,这里有两个全局变量,第一个被格式化为整型了,另一个是字符串类型,那么就是构造”;/bin/sh;”的最好容器,嗯,如图:可以看到ida列出来对ptr的操作只有3个
分别是一个malloc后的赋值、free释放和现在的system参数,但是呢通过malloc赋值那里有格式字符的限制输入不了”;”,然后再看程序总共可供我们输入的有分别是1、2、3这3个接收分别对应3个全局变量,前面说了dword_602120会直接变为整型用不了,那么就只有对value赋值这个函数有操作空间了。
通过学习malloc函数定义知识知道,malloc开辟内存后需要free释放并且对返回的指针置空,如果不释放会造成内存泄漏,指针不置空则会造成内存空间复用(glibc内存重新分配),因为这里没有在释放内存对指针进行初始化处理,就可以利用堆重新分配规则使我们输入的值指向上一个free chunk的地址
嗯,看demo
首先输入1开辟一块内存进行赋值操作然后输入AAAAAAAA,就可看到通过malloc(函数中strdup就是(strcpy + malloc)的结合)我们的chunk再看看它的数据
然后再看看全局变量ptr的值
然后再对它进行释放,这样我们再申请同样大小的内存就会让这块chunk进行重新分配了
这里再选5、输入n保证程序不退出进行free chunk,此时的chunk数据为:
那么这时再通过malloc申请一样大小的内存、我们选择3、再输入我们的’;/bin/sh’再看看heap信息是否如期所致如图:可以看到之前free 的chunk已经被重新复用了,并且地址还是指向之前的位置,上面parseheap的status显示freed有点问题,时不时会这样显示不对,但看内存数据就可以了,因为没有fd和bk所以它是使用中的chunk
最后的exp:
sla = lambda delim, data: p.sendlineafter(delim, data)
sla('> ','1')
sla('Format: ','%s')
sla('> ','5')
sla('?','n')
sla('> ','3')
sla('Time zone: ',"\';/bin/sh\'")
sla('> ','4')
p.interactive()