ez_rust_writeup

一道简单的[[rust逆向]]
#rust逆向 #位运算

题目信息

  • 文件名:ezrust.exe
    题目附件:https://wwfj.lanzoul.com/iczMR30k5j4h
    密码:bueq

题目分析

1. 初步分析

这是一道Rust编写的逆向题目。通过IDA分析可以看到,这是一个典型的flag验证程序。

2. 程序流程分析

程序的主要逻辑在sub_140002220函数中,让我们逐步分析:

  1. 用户输入:程序首先输出提示信息"please input your flag:",要求用户输入flag
  2. 长度检查:程序检查输入的长度是否为23字符
  3. 字符处理:对输入的每个字符进行特殊的位运算处理
  4. 比较验证:将处理后的结果与硬编码的目标数组进行比较

3. 核心算法分析

通过分析反编译代码,我们可以看到程序对输入进行了如下处理:

// 伪代码逻辑
for each character in input:v13 = character >> 4         // 右移4位v9 = 16 * ((character & 15) ^ 8)  // 低4位异或8后乘以16result = v9 + (v13 ^ 9)      // 组合结果

具体分析:

  • sub_140002AE0(v29, 4) 实现右移4位操作,提取高4位
  • sub_140002B30(v12, 15) 实现与15的按位与操作,提取低4位
  • 然后进行异或和移位运算的组合

4. 目标数组分析

程序中硬编码了一个23字节的目标数组:

[-82, -36, -66, -50, 124, -102, -66, 124, -115, 124, -66, -115, -17, -70, 124, -102, -97, 111, -1, -34, -97, -1, -33]

转换为无符号字节:

[174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]

5. 逆向算法推导

从算法分析可以看出,对于输入字符c:

  1. 取高4位:high = c >> 4
  2. 取低4位:low = c & 15
  3. 计算:result = 16 * (low ^ 8) + (high ^ 9)

要逆向这个过程,我们需要:

  1. 对于目标值target,求解原始字符c
  2. x = target // 16y = target % 16
  3. low ^ 8 = xhigh ^ 9 = y
  4. 所以 low = x ^ 8high = y ^ 9
  5. 原始字符 c = high * 16 + low

解题脚本

def solve_ezrust():# 目标数组(程序中硬编码的期望结果)target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]flag = ""for target_byte in target:# 暴力搜索:对每个目标字节,尝试所有可能的ASCII字符for char_val in range(32, 127):  # 可打印ASCII范围# 模拟程序的加密算法high_4_bits = char_val >> 4      # 提取高4位low_4_bits = char_val & 0x0F     # 提取低4位# 核心算法:result = 16 * (low ^ 8) + (high ^ 9)encrypted = 16 * (low_4_bits ^ 8) + (high_4_bits ^ 9)if encrypted == target_byte:flag += chr(char_val)breakreturn flag# 验证函数
def verify_algorithm(char):"""验证加密算法"""char_val = ord(char)high = char_val >> 4low = char_val & 15result = 16 * (low ^ 8) + (high ^ 9)return resultif __name__ == "__main__":flag = solve_ezrust()print(f"Flag: {flag}")# 验证结果target = [174, 220, 190, 206, 124, 154, 190, 124, 141, 124, 190, 141, 239, 186, 124, 154, 159, 111, 255, 222, 159, 255, 223]print("\n验证结果:")for i, char in enumerate(flag):calculated = verify_algorithm(char)expected = target[i]status = "✓" if calculated == expected else "✗"print(f"字符 '{char}' (ASCII {ord(char)}) -> {calculated} (期望 {expected}) {status}")# 检查是否所有字符都匹配all_match = all(verify_algorithm(char) == target[i] for i, char in enumerate(flag))print(f"\n整体验证结果: {'成功' if all_match else '失败'}")

运行结果

运行解题脚本后得到flag:

Flag: rUst_1s_@_s@f3_1anguage

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

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

相关文章

【QT】-隐式转换 explicit用法

通俗易懂的解释:隐式转换 vs 显式转换 什么是隐式转换? 隐式转换就是编译器偷偷帮你做的类型转换,你甚至都没意识到它发生了。 例子: cpp 运行 double x = 5; // 隐式:int → double(5 变成 5.0) int y = x * 2.5; // 隐式:double → int(截断小数部分) 构造函数的隐…

Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证

1. JSON数据格式详解1.1 什么是JSON?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下特点:独立于语言,几乎所有编程语言都支持易于人阅读和编写易于机器解析和生成基于文本&#xff…

[特殊字符] Python 实战 | 批量统计中文文档词频并导出 Excel

本文展示如何用 Python 脚本: 批量读取文件夹中的多篇中文文档; 用 jieba 分词并统计词频(过滤停用词与单字符); 将各文档词频输出为对应 Excel 文件; 是文本分析、内容审查、报告编写中的实用技巧。 &…

共享打印机(详细操作+常见问题:需输入用户名密码、无法连接等)

文章目录一、设置打印机共享的准备工作二、Windows系统下打印机共享设置1. 启用主机打印机共享2. 客户端添加共享打印机三、我所遇到的问题及解决方法客户机遇到输入用户名、密码错误代码 0x0000011b一、错误代码 0x0000011b 的含义二、解决方法添加打印机没成功其他问题此次打…

在 Windows 系统上配置 [go-zero](https://go-zero.dev) 开发环境教程

💻 在 Windows 系统上配置 go-zero 开发环境教程 本教程将详细介绍如何在 Windows 系统上配置 go-zero 微服务框架的开发环境,包括依赖安装、路径配置、常见问题等。 🧱 一、前置环境安装 1. 安装 Go 下载地址:https://go.dev/…

开源=白嫖?

国内有一个非常浓重的思想,开源,开源就是免费,就是白嫖,就是不花钱,白给。那么什么是开源?“源代码”是软件中大多数计算机用户从未见过的部分;它是计算机程序员可以操纵的代码,以改变一个软件(…

2048-控制台版本

2048控制台版 文章目录2048控制台版实现效果:在这里插入图片描述库函数使用:初始化变量功能函数实现:状态判断函数int Judge();数字生成函数 bool CtreateNumber()打印游戏界面 void…

提取出Wallpaper Engine壁纸的mpkg类静态壁纸

github 地址 https://github.com/notscuffed/repkg先下载软件2853…26目录这样获取有的直接mp4格式,就不能用这方法准备好后 cmd 进入repkg目录 执行 repkg extract ./294...333/scene.pkg

AI健康小屋“15分钟服务圈”:如何重构社区健康生态?

AI健康小屋作为“15分钟服务圈”的核心载体,通过技术赋能与场景重构,正推动社区健康生态从被动治疗向主动预防、从单一服务向全周期管理转型。那我们应该如何重构社区健康生态呢?服务模式创新1.全时段覆盖AI健康小屋通过分时段服务满足不同群…

[netty5: WebSocketFrame]-源码分析

WebSocketFrame WebSocketFrame 是 Netty 中用于表示 WebSocket 消息帧的抽象基类,封装了帧的内容、分片标志和扩展位信息,供各类具体帧(如文本、二进制、控制帧)继承使用。 public abstract class WebSocketFrame extends Buffer…

【加解密与C】非对称加解密(三)ECC椭圆曲线

ECC椭圆曲线的基本概念椭圆曲线密码学(Elliptic Curve Cryptography,ECC)是一种基于椭圆曲线数学的公钥密码体制。与传统的RSA相比,ECC在相同安全级别下使用更短的密钥,计算效率更高,适用于资源受限的环境。…

力扣网编程150题:加油站(贪心解法)

一. 简介 前面一篇文章使用暴力解法来解决力扣网150 题目:加油站。文章如下: 力扣网编程150题:加油站(暴力解法)-CSDN博客 暴力解法就是遍历了所有元素作为起始点的可能,算法时间复杂度为 O(n*n)&#x…

windwos 设置redis长久密码不生效

1、设置长久密码redis.windows.conf 文件修改对应的设置密码2、启动时设置对应的加载配置文件

物联网(IoT)领域存在多种协议

物联网(IoT)领域存在多种协议,主要是因为不同的应用场景对通信的需求差异很大,包括实时性、带宽、功耗、设备兼容性、安全性等。以下从协议多样性的原因和你提到的具体协议(如 dc3-driver-* 模块)展开说明&…

二、encoders

文章目录一、batch_encoder (用于 BFV)1. 概述2. 数学原理3. 使用方法4. 代码示例二、ckks_encoder (用于 CKKS)在 1. bfv_basics.cpp 中,我们展示了如何使用BFV方案执行非常简单的计算。计算是在 plain_modulus 参数的模下执行的,并且 只使用了 BFV 明文…

数据一致性解决方案总结

数据一致性解决方案总结 我们在系统中,主要进行了数据冗余,那么就会带来数据一致性的问题。常见的数据一致性问题有:数据库主从同步延迟导致的读数据不一致;数据库主主之间数据的不一致;缓存和数据库之间的数据不一致。…

17.Spring Boot的Bean详解(新手版)

文章目录1. 什么是Bean?从零开始理解1.1 Bean的定义1.2 为什么需要Bean?1.3 Bean vs 普通对象的区别2. Spring容器:Bean的家2.1 什么是Spring容器?2.2 容器的工作流程3. Bean的声明方式详解3.1 使用Component及其专门化注解3.1.1 …

cherryStudio electron因为环境问题无法安装解决方法或打包失败解决方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是关于electron安装失败的解决方法. 也可以通过到git上下面包,解压后,放到对应的目录下面,并把里面的build文件夹删除, b…

微服务架构中数据一致性保证机制深度解析

在微服务架构中,数据一致性是分布式系统设计的核心挑战。由于服务拆分后数据自治(每个服务独立数据库),跨服务操作的一致性保障需突破传统单体事务的局限。本文从一致性模型、核心解决方案、技术实现及面试高频问题四个维度&#…

【Gin】HTTP 请求调试器

文章目录 项目概述代码功能详解1. 导入必要的包2. 主函数和路由设置3. 请求信息捕获4. 请求参数和头信息5. 请求体处理5.1 JSON 数据处理5.2 表单数据处理5.3 Multipart 表单数据处理5.4 其他类型数据处理6. 构造响应对象7. 返回 JSON 响应功能特点使用场景完整代码项目概述 这…