通过劫持线程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 ...
随机推荐
- RepVGG:VGG,永远的神! | CVPR 2021
RepVGG将训练推理网络结构进行独立设计,在训练时使用高精度的多分支网络学习权值,在推理时使用低延迟的单分支网络,然后通过结构重参数化将多分支网络的权值转移到单分支网络.RepVGG性能达到了SOT ...
- echarts 中国地图tooltip实现提示框
point: 鼠标位置,如 [20, 40]. params: 同 formatter 的参数相同. dom: tooltip 的 dom 对象. rect: 只有鼠标在图形上时有效,是一个用x, y ...
- #最大公约数,容斥#洛谷 3166 [CQOI2014]数三角形
题目 分析 总方案就是\(C(n*m,3)\),考虑减掉不合法的方案, 横向\(n*C(m,3)\),纵向\(m*C(n,3)\)再减去斜着的, 对于\((x_1,y_1)(x_2,y_2),x_1& ...
- 使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令
背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情. 解决方案 定制化一键 ESLint,执行文件下载地址: https://gi ...
- 密码学系列之:IDEA
密码学系列之:IDEA 目录 简介 IDEA简介 IDEA原理 IDEA子密钥的生成 简介 IDEA的全称是International Data Encryption Algorithm,也叫做国际加 ...
- 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
Java 修饰符 Java 修饰符 用于控制类.属性.方法和构造函数的访问权限和行为.它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问. private: 意味着代码只能在声 ...
- Linux编译静态库、动态库
一.Linux上编译静态库 # 1.编译成.o文件 gcc -c a.c b.c // 2.编译成静态库 ar -r liba.a a.o b.o // 3.链接成可执行文件 gcc main.c - ...
- spring复习(二)AOP
1.aop基于xml以及注解的AOP配置 什么是AOP 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强. AOP术语: ...
- VSCode如何通过Ctrl+P快速打开node_modules中的文件
背景 咱们新建一个NodeJS项目,必然会安装许多依赖包,因此经常需要查阅某些依赖包的源码文件.但是,由于node_modules目录包含的文件太多,出于性能考虑,在VSCode中默认情况下是禁止搜索 ...
- SSH的密码qsnctfwp
开启 kali,在终端输入ssh root@challenge.qsnctf.com -p [port]可以访问远程 SSH 系统 根据提供的 passlist.txt 文件内容进行密码爆破 编写 S ...