BCTF2017 BabyUse

问题

问题在于drop函数中在释放块之后没有清空bss_gun_list中的指针。

一般因为存在对bss_gun_flag的验证,所以不会出现什么问题,但是在use功能中没有验证bss_gun_flag

 struct_ptr = bss_gun_list[global_index_saved];

因此use功能存在UAF,不得不说这个设计的还是比较隐蔽的,有点考验眼神。

想法

首先因为题目给了我们分配任意大小堆块的能力,并且我们在阅读代码时候发现并没有对分配的内存进行清零。

这就存在内存未初始化漏洞,我们可以通过布局读出之前释放的usorted块中的fd和bk地址,从而计算出libc的基地址。

其次,我们考虑的是利用UAF漏洞去控制gun结构中的函数表地址,我们在issue部分说了,UAF限制了其它功能唯独没有限制use功能,因此我们的目的就是构造函数表地址,然后进行跳转。

做法

前面提出了利用的思路,但是在实际利用的时候会发现内存未初始化因为存在着'\x00'截断实际上是泄漏不了的。因此这道题的泄漏是一个问题,我在泄漏时尝试了一些内存布局比如

buy(1,15,'a'*15)
buy(1,31,'a'*15) select(0)
drop(0) rename(1,15,'AAAA\n')
buy(1,15,'a'*15)
use()

结果发现drop之后再buy的话会挤占掉UAF结构的指针 ORZ。。

这道题应该是晨升师傅做出来的,不得不膜一发。我真是没想到能利用输入时的那个空字节进行部分覆盖,覆盖之后就可以直接得到主模块的基地址和堆基址了。

之后直接泄漏got就能得到libc,再伪造函数表就可以了,这里不多说了。

BCTF2017 BabyUse的更多相关文章

随机推荐

  1. WebApplication与WebSite区别

    1. WebApplication(Web应用程序)和WebSite(网站)的区别:WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的,用起来简单,例如:不需要创建命名控件.C#代码修改以 ...

  2. java 栈和堆

  3. c# 行转列

    将下面表(1)格式的数据转换为表(2)格式的数据.很明显,这是一个行转列的要求,本想在数据库中行转列,因为在数据库中行转列是比较简单的,方法可以参考本站SQLServer中(行列转换)行转列及列转行且 ...

  4. mysql8.0+修改用户密码

    查看初始安装密码登陆: [root@VM_133_71_centos yum.repos.d]# cat /var/log/mysqld.log|grep 'A temporary password' ...

  5. 【BZOJ1228】[SDOI2009]E&D(博弈论)

    [BZOJ1228][SDOI2009]E&D(博弈论) 题面 BZOJ 洛谷 题解 这种打表找规律的题目真的不知道可以说什么好啊... #include<iostream> #i ...

  6. keystone v3.0与2.0的区别

    参看http://blog.chinaunix.net/uid-21335514-id-3497996.html

  7. SQL Server 查询性能优化——覆盖索引

    覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...

  8. mongoDB的使用(NodeJs)

    MongoDB相信大家都不太陌生了,但是究竟它和我们熟悉的MySQL(MariaSQL).SQLServer有什么区别呢? 我们熟悉的MySQL是关系型数据,每个数据表都有严格的数据结构规定,因而我们 ...

  9. webpack插件去除没用到的css

    去除没用到的css需要用到purifycss-webpack插件,而这个插件又依赖于purify-css 1.安装 npm i purifycss-webpack purify-css -D 2.加入 ...

  10. python爬虫 抓取一个网站的所有网址链接

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...