通过劫持线程arena实现任意地址分配 n1ctf2018_null
通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至
BUU上的n1ctf2018_null很好的说明了这个问题
看一下保护:

除了pie保护剩下的保护全开了,64位ida载入看一下

上来是一个输入密码,密码是i'm ready for challenge ,随后登录成功,创建了一个新的线程
我们进去看看

是一个死循环,可以看见对输入的chunk大小以及数量都是非常大的,而且程序还有一个溢出我们看一下sub_400bca

那么可以看见当我们输入的内容比size小的时候,我们可以二次输入这次最大可以输入size的大小,原因是a2没有进行更新,那么这里有溢出点
我们再看一下它下面的函数

如果我们能修改此处的地址为system,而参数是/bin/sh那么我们就可以得到shell
如果我们溢出的字节足够大可以覆盖线程arena,那么我们可将fake_chunk链接到fastbin,进而分配我们想要的地址,但是arena是先mmap出来的,heap是过后才分配出来,所以我们覆盖不了线程arena,但是如果,我们把这块内存耗完会发生什么,那么系统会重新分配mmap一段内存,但是由于它后面是libc的地址,所以它会往前面找一块地址,那么我们输入的内容就可能在线程arena的前面,我们先申请这么大看看

看一下vmmap

我们看一下此处内容,从链表特征上来看,这是一个线程arena结构,它位于地址较低的地方
、
看看我们输入的内容的位置

计算一下

那么我们加刚刚申请的这个是262个,我们再申请262个看看


我们输入的数据在它前面,那么可以看见我们再利用二次输入数据是可以覆盖线程arena的

现在计算偏移进行覆盖

填充0x50个垃圾数据覆盖到线程arena,这里注意这里有个大小我们不要随意去改变,可以适当改最前面的一个字节,不然会出现一系列的问题
后面我们在把我们的fake_chunk接上去


那么此时我们再次申请chunk就会申请到假chunk
选择0x60201d的原因是这里可以伪造假chunk的size位

然后我们把0x602038的地方改成system的plt地址

然后申请0x60大小的chunk就可以申请到fake_chunk

程序会把rbp-8处的位置给rdi,而且这个位置就是我们申请chunk输入的数据,随后call rax(0x602038)进而得到shell,记得补齐到0x60哦

wp:

通过劫持线程arena实现任意地址分配 n1ctf2018_null的更多相关文章
- CLR线程概览(一)
托管 vs. 原生线程 托管代码在“托管线程”上执行,(托管线程)与操作系统提供的原生线程不同.原生线程是在物理机器上执行的原生代码序列:而托管线程则是在CLR虚拟机上执行的虚拟线程. 正如JIT解释 ...
- APUE学习之多线程编程(一):线程的创建和销毁
一.线程标识 和每个进程都有一个进程ID一样,每个线程也有一个线程ID,线程ID是以pthread_t数据类型来表示的,在Linux中,用无符号长整型表示pthread_t,Solaris ...
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- 关于java中final关键字与线程安全性
在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...
- Java 7 Concurrency Cookbook 翻译 第一章 线程管理之六
十一.处理线程组中的未控制异常 每种编程语言一个很重要的特性就是其所提供的用来处理程序中错误情况的机制.Java语言和其他的现代语言一样,是提供了异常机制来处理对象程序中的错误.Java提供了很多的类 ...
- newCachedThreadPool线程池
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任 ...
- linux线程控制&线程分离
线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立 ...
- Java线程池应用
Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...
- [转]使用VC/MFC创建一个线程池
许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...
- 《day15---多线程安全问题_JDK1.5的锁机制》
//15同步问题的分析案例以及解决思路 //两个客户到一个银行去存钱,每个客户一次存100,存3次. //问题,该程序是否有安全问题,如果有,写出分析过程,并定于解决方案. /* 发现运行结果: su ...
随机推荐
- DW:优化目标检测训练过程,更全面的正负权重计算 | CVPR 2022
论文提出自适应的label assignment方法DW,打破了以往耦合加权的惯例.根据不同角度的一致性和非一致性指标,动态地为anchor分配独立的pos权重和neg权重,可以更全面地监督训练.此外 ...
- KingbaseES V8R6集群运维案例---数据块故障自动修复(auto_bmr)
案例说明: 在Oracle11.2版本之后,DataGuard 若搭建实时应用日志的物理备库,那么在主库数据文件少 量坏块的情况下,可以利用ABCR技术快速修复坏块. Starting in Orac ...
- c语言的printf常用的一些转换说明符及其含义
整数类型: %d: 十进制整数 (decimal: 十进制的) %u: 无符号整数 (unsigned: 无符号的) %i: 十进制整数 (integer: 整数) %o: 八进制数 (octal: ...
- 整合mybatis-spring需要的maven依赖配置
创建maven项目,导入相关jar包 junit 1 <dependency> 2 <groupId>junit</groupId> 3 <artifactI ...
- el-table设置列属性fixed导致滚动条无法拖动-骨灰级
一.前言说明 网上一搜索,千篇一律的设置el-table__fixed,如: .el-table__fixed { // 左固定列 height: auto !important; bottom: 1 ...
- openstack-train-ovs-ceph 部署
第一章 Openstack简介 https://baike.baidu.com/item/OpenStack/342467?fr=aladdin Openstack框架图.在应用软件大大小小的各种异常中,崩溃确实是最让人难以接受的 ...
- redis 简单整理——客户端常见异常[十七]
前言 这个还是比较常见的,也就是比较对开发有用的部分. 正文 1.无法从连接池获取到连接 JedisPool中的Jedis对象个数是有限的,默认是8个.这里假设使用的默 认配置,如果有8个Jedis对 ...
- 如何使用鞋厂ERP等企业管理软件提高企业运营整体效率?
ERP把企业客户需求.市场规划.产品研发.内部制造等活动以及供应商的资源整合在一起,形成企业一个完整的产业链和供应链,通过企业多个环节的无缝链接和整体运作来提高企业运营整体效率: (1) . 对整个产 ...