带着问题的学习是有效的
例题:攻防世界noleak ,这题解法好像有多种但是我是刚接触堆也是抱着学习的姿势学习攻击思路,这里就先例举我看明白的2种方式(爆破(在爆破__malloc_hook文章里面)、unsort bin攻击)
在ida分析后得到以下结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXIQy411-1639030347745)(unsort bin attack.assets/image-20211208214043274.png)]](https://i-blog.csdnimg.cn/blog_migrate/40f5c04ee106f77929c8c7fb63c5f9ac.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T78X37vt-1639030347747)(unsort bin attack.assets/image-20211208214219886.png)]](https://i-blog.csdnimg.cn/blog_migrate/4ec1baad0ce0abb2378f0236a2d61368.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SU1jBwy4-1639030347748)(unsort bin attack.assets/image-20211208214320212.png)]](https://i-blog.csdnimg.cn/blog_migrate/0a61f7e5abca212e0c24a408700dfad8.png)
总结:
1.用于保存chunk指针的bss数组最多存储10个
2.free时有double free、uaf漏洞
3.可以编辑free chunk数据,有堆溢出漏洞
4.因为程序简单但是因为开了got不可写的措施导致题目有了很多玩法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-man84Jnf-1639030347750)(unsort bin attack.assets/image-20211208214507601.png)]](https://i-blog.csdnimg.cn/blog_migrate/f91c591d21d18e3c39c8fb14984f3b5b.png)
没有开NX那么首先当然是shellcode,只要把shellcode放入一个指针处,然后将执行流指向它就可以getshell了
使用unsort bin攻击(最快的方式)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DI1v2lF1-1639030347753)(unsort bin attack.assets/image-20211208221232755.png)]](https://i-blog.csdnimg.cn/blog_migrate/31dabee0f52877ed4161e35e10afb749.png)
那么更具它的特性我们来编写exp
#start
add(0x100,'A'*0x100) #为了方便区别这里0x100就是small bin ,0x100是为了填充满chunk这样便于在调试时区分堆空间
add(0x60,'B'*0x100) #1.防止free上个chunk被top吃掉 2.下面要进行fast bin attack
dele(0)
target = 0x601060 #这里需要给上面留出0x8的空间因为fast bin attack需要构造的size位是malloc 第二次才用的上的,为了保证第一次malloc不会破坏size位
#unsort bin attack
payload = p64(0) + p64(target-0x10) #修改bk值
edit(0,len(payload),payload)
add(0x100,p64(0))
那么最后的执行效果如图: 已经成功的写入main_arena+88的地址到了程序用于存放chunk指针的ptr区
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMJFhDx8-1639030347754)(unsort bin attack.assets/image-20211209114403873.png)]](https://i-blog.csdnimg.cn/blog_migrate/77275ff51bc2a9f1cf1af736f4a034d9.png)
这里解释下为什么目标地址处要是0x601060给0x601058留了0x8的空位,因为下面我们进行fast bin attack时需要调用malloc2次,那么程序会默认在0x601058处开始进行添加chunk指针,那么那个被修改fd的chunk就会放置0x601058就不会覆盖到main_arena+88的值,从而可以进行正常的构造0x7fsize位的fake chunk
好接下来就是用fast bin的特性将fast chunk放置任意地址处,然后进行任意数据写:
首先将chunk1进行释放就是前面用来隔绝small chunk的fast chunk,此时它会进入到fast bin里面,因为将fast chunk拿出后进对它的size进行判断是否属于该类fast bin的大小范围,反之则会进行报错,fast bin attack攻击特性如图一,报错信息如图二:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbeCyc1K-1639030347755)(unsort bin attack.assets/image-20211209110939616.png)]](https://i-blog.csdnimg.cn/blog_migrate/7f7eabe9d315cf22e04c7fff20f708d6.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2DlNPKW-1639030347756)(unsort bin attack.assets/image-20211209110659461.png)]](https://i-blog.csdnimg.cn/blog_migrate/812c9dc541162560b71cd22399d48d17.png)
那么我们在修改fd指针时就需要对目标地址进行偏移,通过gdb调试可看到一般情况下在目标地址处减去0x3就会把地址的头部分给偏移出来如图所示:

本文详细介绍了利用攻防世界noleak挑战中的堆溢出、doublefree和UAF漏洞,通过unsortbin攻击和fastbinattack构造ROP链,最终实现shellcode执行的过程。通过ida分析,确定了攻击策略,包括修改chunk指针、利用fastbin特性等,展示了内存漏洞利用的技术细节。
最低0.47元/天 解锁文章
1695

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



