常回家看看之堆溢出

· 浏览次数 : 0

小编点评

**堆溢出修改指针导致libc泄露** 题目描述: 题目介绍了一个利用堆溢出修改指针导致libc泄露的漏洞题目。漏洞涉及申请了多个块内存,然后通过修改指针来修改“got”表,最终导致libc泄露。 **漏洞分析** 1. **申请多个块内存**:题目申请了多个块内存,每个大小为0x80。 2. **通过修改指针来修改“got”表**:通过修改指针,修改了“got”表的地址,从而让它指向内存的末尾。 3. **导致libc泄露**:修改后的“got”表指向了内存的末尾,导致libc泄露。 **漏洞解决方案** 1. **只申请所需大小的内存**:在申请内存时,只申请了必要大小的内存,而不是申请多倍的内存。 2. **使用校验和**:在申请内存之前,对申请的地址进行校验,以确保它与预期地址相匹配。 3. **使用安全内存分配函数**:选择安全内存分配函数,如 `malloc_checked()` 或 `calloc()`, 来分配内存。 4. **释放内存时进行清理**:在释放内存时,及时清理并释放多个块内存。 **漏洞代码** 以下代码展示了如何利用堆溢出修改指针导致libc泄露的漏洞: ```python # 申请多个块内存 memory = malloc(4 * 0x80) # 修改“got”表地址 address = memory + 0x80 # 打印chunk1的地址 print(address) # 修改chunk1的指针 free_got_table_ptr = address # 释放内存 free(memory) ``` **漏洞影响** 漏洞的严重性取决于所申请的内存大小。如果申请的内存大小足够大,那么可以攻击者通过修改“got”表指针将恶意代码注入内存,从而执行代码或控制系统进程。

正文

💧对于堆溢出,有很多漏洞可以和它打配合可以说是堆里面很常见的漏洞,常见的有off_by_null,House系列(后续学习到了会继续更新这个系列),unlink,等等

今天来看一个,堆溢出修改指针,导致libc泄露以及通过指针来修改got表的题目

题目连接我放下面了,对堆有兴趣的可以去看看✔️

题目链接🔗:https://pan.baidu.com/s/1_j2gw22PQHK-PiC8HUcVvg?pwd=d2wt 
提取码:d2wt

接下来分析一下题目,首先看一下保护

32位,got可以修改,其实对于堆题目,有很多都是,保护全开的,这在堆里面很常见,都是我们还是要看保护,got可以修改,那么我们可以修改free或者malloc的got表,如果不能修改got表,我们还可以考虑__free_hook和__malloc_hook

32位ida静态看一下

有一些功能函数,我们具体看一下,add函数

注意这里是申请了两个chunk,第一个大小是我们输入的,第二个是0x80固定的大小,然后我们输入的name保存到了第二个chunk,而且这里把第一个chunk的指针放到了第二个chunk的数据里面,继续看

这里对输入的chunk的判断依据大小是name chunk和我们输入数据chunk之间的距离,如果先申请一些chunk把他们隔开那么就可以实现很大的堆溢出

update函数这里也是这样判断的

delete函数,把chunk1,2都进行了free

show函数可以进行name和text的打印

❗思路:我们知道申请chunk的时候会首先到bin里面去找,如果没有在从Topchunk里面切割一块,如果申请的大小超过0x20000,那么就不是mmap分配了,释放的时候如果两块chunk物理相邻,那么会把他们进行合并,如果我们申请一个0x80大小的堆块,(chunk1,2现在都是0x80),释放的时候他们就会合并成一个0x100的chunk,如果我们再次申请那么就会申请到这里,中间再申请一个0x80大小的chunk和一个0x8的chunk(用来存放/bin/sh),那么再次申请0x100大小chunk的时候name chunk就会跑到最后面,他们之间有0x80*3+0x10大小的空间,足够我们溢出了

 

 

进行了合并

指针修改之前

修改之后

chunk1的指针换成了free_got表地址,那么打印chunk1的时候就可以进行泄露,之后修改chunk1那么就可以进行修改free_got表为system,最后free chunk2(/bin/sh)

就可以获得shell

exp:

 

常回家看看系列持续更新..........

 

与常回家看看之堆溢出相似的内容:

常回家看看之堆溢出

对于堆溢出,有很多漏洞可以和它打配合,可以说是堆里面很常见的漏洞,常见的有off_by_null,House系列(后续学习到了会继续更新这个系列),unlink,等等。 今天来看一个,堆溢出修改指针,导致libc泄露以及通过指针来修改got表的题目。 题目连接我放下面了,对堆有兴趣的可以去看看✔

常回家看看之off_by_one

❗off_by_one这个漏洞比较特殊,它不像上一期的堆溢出,可以溢出很多字节,它只能溢出一个字节,在栈里面也可以通过这个漏洞修改返回地址什么的,在堆里面我们主要利用它来修改堆块的大小,形成fake_chunk也就可以进行堆的重叠,在64位的时候如果申请0x18,0x28,0x38这样的堆它的siz

堆的原理以及实现O(lgn)

大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。 今天我们就来看看堆这种数据结构。 源

flutter系列之:在flutter中使用导航Navigator

简介 一个APP如果没有页面跳转那么是没有灵魂的,页面跳转的一个常用说法就是Navigator,flutter作为一个最为优秀的前端框架,Navigator肯定是必不可少的,那么在flutter中如何使用Navigator呢? 一起来看看吧。 flutter中的Navigator Navigator

[转帖]Kafka常见使用场景与Kafka高性能之道

https://juejin.cn/post/6958997115012186119 消息队列使用场景 队列,在数据结构中是一种先进先出的结构,消息队列可以看成是一个盛放消息的容器,这些消息等待着各种业务来处理。 消息队列是分布式系统中重要的组件,kafka就可以看做是一种消息队列,其大致使用场景:

ebpf 单行程序学习

# ebpf 单行程序学习 ## 背景 ``` 公司方神借给我一本: 《BPF之巅:洞悉linux系统和应用性能》纸质书 拿回家晚上在沙发上看了几天。 感觉书很厚看的不是很系统。 仅能凭自己的感觉总结一下这些天的读书感悟。 本来计划是2023年的春节 7 天长假系统的学习ebpf 但是因为学习Lin

[转帖]电脑硬件入门——基础之计算机架构

https://zhuanlan.zhihu.com/p/63322067 谈电脑硬件的文章很多,但一般是从电脑有哪些配件说起。这篇文章我尝试从架构方面来阐述,希望更有助于萌新对电脑的各种配件的作用进行理解吧。 1、冯·诺依曼架构[1] 现代计算机,常见的有两种架构,其中一种是冯·诺依曼架构。先看图

[转帖]下一代JVM:GraalVM的十大特性

https://it.deepinmind.com/jvm/2019/08/27/graalvm-ten-things.html GraalVM有许多不同的组件,如果你只是听说过它或有些简单的了解,肯定无法一窥全豹。本文将列举下GraalVM的几大常用功能,看看它们都能做些什么。 高性能的现代Jav

6个常见的IB网络不通问题

摘要:如果遇到IB网络不通,可以试着从高层往底层逐步分析看看。 本文分享自华为云社区《常见IB网络不通问题记录》,作者: tsjsdbd 。 如果遇到IB网络不通,可以试着从高层往底层逐步分析看看。仅记录下,供难友参考: 一、NCCL不通 报错: machine-19: [0] transport/

[转帖]《Linux性能优化实战》笔记(十五)—— 磁盘IO的工作原理

前一篇介绍了文件系统的工作原理,这一篇来看看磁盘IO的工作原理 一、 磁盘 1. 按存储介质分类 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。 机械磁盘,也称为硬盘驱动器(Hard Disk Driver,HDD),主要由盘片和读写磁头组成,数据存储在盘