2023 RealWorldCTF “Ferris proxy”逆向题分析(不算wp)

news2025/1/15 19:36:50

这题第二天才开始做,结果到比赛后4个小时才做出来,真是老了,不过也算有收获,对rust的程序更熟悉了~

client编译后的代码有41M,WTF

主函数入口

根据main函数找到两个入口
在这里插入图片描述
第二个函数很明显是主入口,不过rust的主函数没有什么逻辑,跳过直接看上面一个
在这里插入图片描述
这里显示是一个轮询的任务
往下翻可以看到connect的函数

在这里插入图片描述
其参数明显有意义(127.0.0.1:8888),表示需要连接的端口:
在这里插入图片描述继续往下翻,可以找到RC4的加密,加密的密钥可以动态调试得到:在这里插入图片描述
在继续往下翻,可以看到还开启了监听端口(0.0.0.0:12345)
在这里插入图片描述
在这里插入图片描述
继续往下看,可以看到有accept函数和while循环,我猜测应该是接受12345端口的连接,然后接受请求并处理的过程
在这里插入图片描述
但是调试的时候发现12345端口有连接到中间这里就返回了,后面也不知道运行到哪里,只好再从外面找。
总结一下,这部分的逻辑就是客户端连接127.0.0.1:8888端口,同时开启RC4的流加密,此链路进行加密,然后开启监听12345端口,等待连接进行后续处理。
然后查找process_connection函数,找到两个
在这里插入图片描述
同理,选择第一个进行查看,这里设置断点可以发现会在上述的流程后命中
翻到下面可以看到有crypto的new函数,表示开启了新的加密算法,然后就是很重要的key_exchange函数
在这里插入图片描述

密钥交换

这个lib::protocol::crypto::Crypto$LT$T$C$V$GT$::key_exchange::_$u7b$$u7b$closure$u7d$$u7d$::he4df208cecf648f7函数就是检查密钥交换是否成功的函数,进去看看
在这里插入图片描述
首先是用如下的随机函数产生16bytes的随机串,这里的随机串被赋值到retstr[2]中

use rand::{thread_rng, Rng};

let mut rng = thread_rng();
let x: u128 = rng.gen();
println!("{}", x);

然后再用PublicKey的RSA算法加密得到256bytes的随机串发送给server
在这里插入图片描述
这里是发送部分
在这里插入图片描述
同时还需要读取server下发的16字节随机串通过公钥加密后的256字节
然后就是采用client的私钥对server发来的256字节进行解密
在这里插入图片描述
解密后得到16bytes数据放到data中
在这里插入图片描述
这里a赋值为前面client生成的16bytes随机串,然后和解密后的server随机串执行16字节的异或

a=CLIENT_RANDOM_KEYS
b=SERVER_RANDOM_KEYS
let key:String = zip(a,b)
    .map(|x,y| (x ^ y) as char)
    .collect();

值得注意的是,这里的异或逻辑在core::iter::traits::iterator::Iterator::collect::habb018b8b38ed0e7函数中,经过11层函数的调用,最终调用了lib::protocol::crypto::Crypto$LT$T$C$V$GT$::key_exchange::_$u7b$$u7b$closure$u7d$$u7d$::_$u7b$$u7b$closure$u7d$$u7d$::h5b42a29de422c367函数
在这里插入图片描述
可以发现,这个函数名比之前所在的key_exchange函数只多了一个_{{closure}}在函数名最后的16位随机串前
再往后就是对这16bytes进行sha256计算,并发送给对端校验
在这里插入图片描述
同时接收hash值,和刚刚sha256的结果进行比较,如果正确则函数返回1,否则返回0
在这里插入图片描述
至此,密钥交换的过程就已经结束了,下面我们再继续分析后续的处理。

会话加密部分

再回到之前的process_connection函数,密钥交换校验成功后就退出了,需要再次找到后续的线程函数
多次调试找到lib::protocol::crypto::Crypto$LT$T$C$V$GT$::process_data_dec_in函数
在这里插入图片描述
这里明显采用了AES_128_CBC加密
在这里插入图片描述
这里从报文中读取了内容放入了retstr[4].gap0[8]和retstr[3]
在这里插入图片描述
到这里程序的加密部分就已经分析结束了,可以解题了,最终写脚本跑出来flag:
在这里插入图片描述
看到没,出题人都觉得:人生苦短,别用Rust~

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

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

相关文章

数字图像相关系列笔记:DuoDIC

文章目录概述Algorithms and workflowStep 1: Stereo camera calibrationStep 2: Image cross-correlation (2D-DIC)Step 3: 3D reconstructionStep 4: Post processingValidation using a rigid body motion (RBM) testLimitations遗留问题参考资料附录概述 3D-DIC is a non-…

【C++、数据结构】AVL树 模拟实现

文章目录📖 前言1. AVL树的概念1.1 二叉搜索树的缺点:1.2 AVL树的引入:1.2 AVL树的性质:2. AVL树的模拟实现2.1 AVL树结点的定义:2.2 AVL树的插入:(重点)2.2.1 插入结点后平衡因子的…

【前端】Vue项目:旅游App-(14)home+search:搜索按钮及其路由跳转、分组数据的网络请求request、数据存储store和动态显示

文章目录目标过程与代码搜索部分:搜索按钮点击搜索按钮路由跳转并传数据search页面隐藏TabBar分类部分:数据请求:request、store显示数据分类的样式总代码修改或添加的文件common.cssrouter的index.jsservice的home.jsstore的home.jshome-cat…

Windows系统下 pyinstaller将python文件打包成可执行文件exe的方法

使用环境为Windows10系统(64),Python版本为3.11.1。 1.将pip加入环境变量 (1)右击此电脑点击"属性",点击高级系统设置, (2)选择最下面的环境变量&#xff1b…

C++之继承

文章目录一、继承的基本理解1.继承的概念2.继承的定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承1.继承关系2.菱形继承存在数据冗余和二义性的问题3.虚拟继承可以解决菱形继承…

前端优化原理篇(生命周期)

1, 性能评估模型 对于前端的性能的评判 主要是以下四个方面: 2,性能测量工具 1,浏览器的performarce功能 指路可看链接 2,lighthouse工具 3,生命周期 网站 页面的整个生命周期,通俗的讲&a…

移动端App 页面秒开优化总结

前言 App优化,是一个工作、面试或KPI都绕不开的话题,如何让用户使用流畅呢?今天谨以此篇文章总结一下过去两个月我在工作中的优化事项到底有那些,优化方面还算小白,有不对的地方还望指出海涵, 该文章主要通过讲述Nati…

CSS入门三、盒子模型

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

力扣sql基础篇(四)

力扣sql基础篇(四) 1 每位学生的最高成绩 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # rank()函数间隔排序 若前两个字段值相同且都是并列的第一名,那么后面的一个非连续数字就是第三名 如 1 1 3 SELECT e.student_id,e.course_id,e.grade FROM…

ISO12233分辨率测试卡分类及功能说明

概述相机图像分辨率的测试,依据的标准是ISO 12233. 目前分为 ISO12233:2000 ,ISO12233:4000, ISO12233:2014.目前很多厂家已经开始使用新的ISO标准,淘汰了十几年前的“落伍”标准,而更新成了ISO12233:2014。新的分辨率测试标板是由…

代码随想录算法训练营第四期第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 # 给定两个单词word1和word2,返回使得word1和word2相同所需的最小步数。 # 每步可以删除任意一个字符串中的一个字符。 # # 示例 1: # 输入: word1 "sea", word2 "eat" # 输出: 2 # 解释: 第一步将 &…

安顺控股冲刺A股上市:拟募资6.5亿元,九成收入来自天然气销售

近日,安顺控股股份有限公司(下称“安顺控股”)递交招股书,准备在上海证券交易所主板上市。本次冲刺上市,安顺控股计划募资6.50亿元,将用于溧阳市城镇燃气高压管网二期项目、溧阳市美丽乡村天然气利用项目一…

openstack私有网络

1.前情回顾 目前环境使用的是Provider网络现在需要将其修改为Self-service网络,类似于公有云的vpc网络 2.流程 1.控制节点配置修改 1.修改/etc/neutron/neutron.conf的[DEFAULT]区域 # 原来的配置 # core_plugin ml2 # service_plugins # # 修改后的配置 c…

GitHub Enterprise Server 存在授权不当漏洞(CVE-2022-46258)

漏洞描述 GitHub Enterprise Server 是一个面向开源及私有软件项目的托管平台,GitHub scope 用于限制 OAuth token 的访问范围。 在 GitHub Enterprise Server 中,除非提交位于同一存储库的不同分支中且和 Workflow files 内容相同的 Workflow 文件 &a…

【学习】Reptile、梯度下降的LSTM、Siamese Network、原型网络、匹配网络、关系网络

文章目录ReptileRNNLSTM梯度下降的LSTM基于度量的方法Siamese NetworkN-way Few/One-shot Learning原型网络匹配网络关系网络虚拟数据的少量学习Train Test as RNNReptile RNN LSTM RNN的变形 加入门 梯度下降的LSTM GD看似像简化的LSTM 可以让机器自动学习这些zf和zi …

sql的where使用运算后的列后报错

sql的where语句中如果使用了经过运算处理后的某个列的话会报错,例如:上面红框部分就是经过运算后的列,但这个语法是错误的,但如果想通过运算后的某个列来筛选条件,应该怎么办?可以使用嵌套查询:…

SpringBoot实践(三十八):自定义spring-boot-starter

目录 自动配置原理 自定义starter包 导入springboot的自动配置依赖 测试业务代码 spring.factories配置 ​编辑 本地包上传 使用自定义starter依赖 测试和配置 自动配置原理 基于springBoot的starter机制能够让我们在使用外部包时候非常方便,只需要引入该组…

PCB学习笔记—3D PCB封装的创建

放置3D元件体:常规的、自定义、圆柱形、球体。第一个是厚度,第二个是焊盘和芯片的悬浮高度。一般电阻的高度设置成0.6mm就够了,电容1.25mm,悬浮高度为0。按键:放置3D元件体,Tab键,选择常规&…

快过年静不下心?不如刷刷《剑指offer》静一静(第七天)

跟着博主一起刷题 这里使用的是题库: https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 49. 丑数剑指 Offer 51. 数组中的逆序对剑指 Offer 55 - I. 二叉树的深度剑指 Offer 49. 丑数 剑指 Offer 49. 丑数 我一开始的思路是,把数字1~无…

机器学习HW15元学习

文章目录一、简介Task: Few-shot Classification实验1、simple2、medium3、strong4、boss三、代码模型构建准备工作一、简介 任务对象是Omniglot数据集上的few-shot classification任务,内容是利用元学习找到好的初始化参数。 Task: Few-shot Classification The…