铁人三项2018 pwn [heapmain] Writeup

这个题目的原题是RHME3,直接拿来二进制修改,去掉网络函数,使用socat部署。这波操作可还行

分析

废话不多说,题目漏洞比较明显,在于使用函数delete_player后没有置空selected导致UAF。那么,我们能用这个UAF干什么呢?

程序中player的数据结构是这样的

struct player{
    int32 attack;
    int32 defense;
    int32 speed;
    int32 precision;
    char* name;
}

这块就有个关键点edit_player中的set_name函数,用来修改name字段的时候用到了realloc函数。这个函数比较特殊,可以在制定地址上重新分配一个堆,即可以对给定的指针所指的空间进行扩大或者缩小 。当然,扩大的时候会破坏其他内存则类似malloc重新分配一个指针指向的内存空间。

泄露堆地址(貌似没啥用)

首先,我们可以通过以下方法泄露堆的地址:

1.分配一个player 1,name的长度为23,则name会分配24字节。

2.选中这个player 1

3.释放这个player 1

4.显示这个player 1,这时候1->name中的fd指向player 1的地址。打印name的时候就会把player的地址打印出来。

泄露libc地址

接着,我们可以通过以下方法泄露libc的地址:

1.分配一个player 1,name的长度为23,则name会分配24字节。

2.选中这个player 1

3.释放这个player 1

4.分配一个player 2,这块内存其实是1->name。2->name长度为23,这块内存为1->player。

5.编辑player 1,1->name长度扩展为0x90。

6.再创建一个player 3(作用是隔开0x90的内存和top chunk,防止free后合并到top chunk)

7.然后释放palyer 2,也就是把1->name的内存释放,此时这块内存被放入unsorted bin里,link到main_arena上

8.show player1 会泄露出libc上的main_arena的地址,就可以计算出libc的基址,由于给了libc就可以求出system的地址

GOT劫持

接下来是控制执行流程(realloc分配内存到got上,覆盖aoit的got为system):

1.分配player 1,name长度80

2.分配player 2,name长度80

3.选中1

4.释放player 1,释放player 2

5.分配一个player 3,name的长度为23,内容为'a'*16 + atoi_got。此时player3 的内存为player2,player3->name为player1。

6.修改player->name为system,此时会将atoi_got分配给我们,然后system的地址会填入atoi。

7.最后输入sh即可

EXPLOIT

最后的利用脚本点击https://blog.formsec.cn/2018/06/05/%E9%93%81%E4%BA%BA%E4%B8%89%E9%A1%B92018-pwn-heapmain-Writeup/

查看

往期精彩回顾

DedeCMS任意用户密码重置漏洞

从CPU漏洞Meltdown&Spectre看侧信道攻击

渗透技巧 | Windows上传并执行恶意代码的N种姿势

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Core的配置(4):多样性的配置来源[上篇]

较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种...

2016
来自专栏java一日一条

Java编程常见问题汇总2

这里有一个前提,就是文件大小不能讲JVM的heap撑爆。否则就等着OOM吧,尤其是在高并发的服务器端代码。最好的做法是采用Stream的方式边读取边存储(本地文...

891
来自专栏积累沉淀

Python快速学习第十天

11.1 打开文件 open函数用来打开文件,语法如下: open(name[, mode[, buffering]]) open函数使用一个文件名作为唯...

2076
来自专栏李家的小酒馆

Redis-Nosql数据库入门

简介 Redis是Nosql数据库的一种,可基于内存亦可持久化的日志型、是一个Key-Value数据库,多用在缓存方面 安装 Windows 下载地址, 最...

2290
来自专栏Python

django:DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用

创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime...

5228
来自专栏我的博客

CI基础知识二

1.日历类 $this->load->library(‘calendar’); echo $this->calendar->generate();//根据服...

3665
来自专栏Python攻城狮

Python系统编程-进程1.进程1.多任务的引入2.多任务的概念

有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;

843
来自专栏Python自动化测试

Jmeter4.0接口测试之断言实战(六)

在接口测试用例中得有断言,没有断言的接口用例是无效的,一个接口的断言有三个层面,一个是HTTP状态码的断言,另外一个是业务状态码的断言,最后是某一接口请求后服...

5274
来自专栏余林丰

虚拟机类加载机制(2)——类加载器

《深入理解Java虚拟机》一书中将类的加载过程放到了类加载器前面一节,但在这里我想先讲“类加载器”。在上一篇类加载时机中我们用大量篇幅来讲解了类加载过程中的5个...

2126
来自专栏容器云生态

关于vim的简单设置以及使用技巧

vim快速指南: vim 使用技巧: 1、认识.命令 最理想的编辑模式:一次按键移动,一次编辑操作 .命令可以重复上一次的修改操作 在普通模式下: j...

2419

扫码关注云+社区