首页
社区
课程
招聘
[原创] CTF2017 秋季赛 第四题 club pwn 提交
发表于: 2017-10-31 02:54 6455

[原创] CTF2017 秋季赛 第四题 club pwn 提交

2017-10-31 02:54
6455

double free的题

但是开了挺多保护的
这里需要一些unlink的知识,如果不会以下是参考
http://cb.drops.wiki/drops/tips-16610.html
http://cb.drops.wiki/drops/tips-7326.html

图片描述
在free的时候并没有将指针置零,可以多次free

另外程序还有一个漏洞,
图片描述
程序在做read的时候,没有加上'\x00',有一个off-by-one的一字节漏洞,..

继续往下看
图片描述

在guess_a_randnum函数中,程序调用的是rand(),事实上,这是一个伪随机函数,

这个函数中,当我们猜中randnum后,程序会讲seed地址给我们打印出来,那么我们将获取一个地址

get ...我们能获取地址,意味着我就可以做unlink了

图片描述

rand()的值决定与srand(&seed) 当这个我们知道&seed的时候,我们就可以去预测rand()的值,

那么我们可以去暴力猜测 seed,然后再去预测下一个rand()

通过这样的方法,我们能获取seed的指针地址

进一步,我们可以计算获取free_got_addr,一个bss地址

那么下一步,我们的思路就是,泄漏libc地址,我们这个时候有了一个free的got地址,

我们可以构造 paload 去泄漏地址,然后计算system偏移 最后getshell
首先我们构造三个chunk
图片描述

然后将他free掉,这个时候指针并没有清零
然后再去创建第四块

图片描述
第四块要比之前free掉的两块都要大
然后伪造 fd bk

图片描述

紧着我们去free掉 第三块,去触发unlink
图片描述
这个时候堆上的情况如下:
图片描述
进一步 。我们去构造leave_me_a_message(2,p64(1)+p64(1)+p64(free_got_addr))
这样的payload 可以将free地址打印出来

图片描述
从而我们可以获取free的地址

最后,我们可以计算system在内存中的地址
然后传入
图片描述
我们会发现这个时候 fd_nextsize 指向了system地址
那么下一步我们去传入system的参数/bin/sh
图片描述

最后再free 一次 第三个块触发一次unlink 就能get shell了

完整exp:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
膜sw湿敷
2017-11-13 08:15
0
雪    币: 870
活跃值: (2264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写的很好
2018-7-22 23:02
0
游客
登录 | 注册 方可回帖
返回
//