攻防世界[GoodRe]
攻防世界[GoodRe]
学到知识:
- 逆向的精髓:三分懂,七分蒙。
- TEA 算法快速识别(蒙):
- 数据处理的形式:进入加密时的数据和加密结束后的数据,处理时数据的分组等等,都能用来识别TEA算法。
- 关键数据识别,循环次数,dalte值,key。
- 题目地址:攻防世界 (xctf.org.cn)
题解:
- 动调,需要输入输入,后面输出error。

-
进入main函数看逻辑:要求输入的长度为64,完事后进一个循环,while循环中处理了一堆数据,后面加密时使用,依次看这两个函数。

check_num函数:其中查了一个十六进制字符表,光静态分析不方便,直接上动态调试来分析,按其中的要求十六进制必须是大写,不然白费,观察rax寄存器的值,他是返回值,将我们的输入转化为了对应的数值,所以函数的功能就是 每8个一组 挨个查 十六进制表 返回字符对应的数值。



init_num函数:逻辑比较简单,将传入的a2放到a1数组中,前面多放一个4(不知道有啥用),一起动调看一下,确实把v6的值放进入了。


- 最后这个循环的逻辑就清楚了:进行了三个组参数的初始化,首先数我们输入的字符每 8个一组 转化为对应的 十六进制数值 ,其次用0x11初始化v14,再使用程序本身自带的 dword_5580AECA2020 初始化v15/v8。
-
循环结束后续重复调用了四个一样的函数,这里推测大概率是加密函数了(后续直接就判断并输出error),但是v11,v12,v13似乎还并未初始化,这里直接去看汇编观察传入了哪些参数:这里是传入了两个地址,一个是前面初始化的v14,一个是,前面初始化的我们输入,这里换一个清晰点的输入 6677888899999999AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF 。



- 这里仔细观察下一个encode函数,其接受的参数:其直接从 AAAAAAAA 开始接受,跳过了中间的 99999999 ,下一个encode函数任然如此,跳过了 BBBBBBBB ,直接从 CCCCCCCC 开始。结合前面初始化时将我们输入的64个字符每8个一组进行分组,共8组,说明这加密函数是将分组后的数据两两一起加密,最后共加调用encode函数4次,加密4次,刚好架构8组数据全部加密完,再众多加密函数中,大概率只有TEA加密时需要将两个数据同时进行加密,所以可以盲猜该算法可能时TEA加密。


- 进入该函数查看:其中一大堆函数,首先看到显眼的32,while循环的轮数为32与TEA算法刚好契合,里面还有两串数值 0x830A5376 和 0x1D3D2ACF 生成了v9,v9在后面函数中被调用过一次,猜测v9应该就是 dalte (动调拿到0x9E3779B9),再找key,a2被调用三次一次传入不同的地址,取不同地址处的值来初始化v10,v11,v12,v13,虽然地址不同但初始化最后都为0x11(前面循环时只用0x11来初始化v14),观察函数调用时传入的参数逻辑,v6就是sum,函数调用中对sum采用的是加 dalte 且是再循环开始时,v4、v5就是待加密的两个值。



- 最后的加密结果是由 dword_56267207D020 处的值来初始化的,直接提取即可,解密脚本如下,注意最后全部时大写才行:
#include <debugapi.h>
#include <stdio.h>
int main()
{unsigned int key[4] = {0x11, 0x11, 0x11, 0x11}; // 密钥unsigned int value[8] = {0x79AE1A3B, 0x596080D3, 0x80E03E80, 0x846C8D73, 0x21A01CF7, 0x0C7CACA32, 0x45F9AC14, 0x0C5F5F22F}; // 密文int dalte = 0x9e3779b9;int i = 0, j = 0, h = 0;int wheel = 32; // 轮数unsigned int sum = 0;// 逆算法for (i = 0; i < 8; i++, i++){sum = (dalte * (wheel));// 每轮加密// for (j = 0; j < 4; ++j){for (h = 0; h < wheel; ++h){value[i + 1] -= (key[3] + (value[i] >> 5)) ^ (sum + value[i]) ^ (key[2] + 16 * value[i]);value[i] -= (key[1] + (value[i + 1] >> 5)) ^ (sum + value[i + 1]) ^ (key[0] + 16 * value[i + 1]);sum -= dalte;}}}for (i = 0; i < 8; i++){printf("%X", value[i]);}return 0;
}
//7DEA3F6D3B3D6C0C620864ADD2FA2AE1A61F2736F0060DA0B97E8356D017CE59
- 最后验证结果正确:

相关文章:
攻防世界[GoodRe]
攻防世界[GoodRe] 学到知识: 逆向的精髓:三分懂,七分蒙。TEA 算法快速识别(蒙): 数据处理的形式:进入加密时的数据和加密结束后的数据,处理时数据的分组等等,都能用来…...
IntelliJ IDEA实用插件:轻松生成时序图和类图
IntelliJ IDEA生成时序图、类图 一、SequenceDiagram1.1 插件安装1.2 插件设置1.3 生成时序图 二、PlantUML Integration2.1 插件安装2.2 插件设置2.3 生成类图 在软件建模课程的学习中,大家学习过多种图形表示方法,这些图形主要用于软件产品设计。在传统…...
SpringBoot + Mybatis-Plus中乐观锁实现
悲观锁 悲观锁是一种悲观思想,它认为数据很可能会被别人所修改 所以总会对数据进行上锁,读操作和写操作都会上锁,性能较低,使用较少! 乐观锁 乐观锁是一种乐观思想,它认为数据并不一定会被别人所修改 所以…...
设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨IT界的两大巨头交锋✨ 👋 在IT界的广阔天地中,有两座…...
转行一年了
关注、星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 来公司一年了。 说是转行其实还是在半导体行业,熟悉我的朋友知道 ,我在18年开始进入半导体行业,那个时候想着行业很重要,站对了…...
【LeetCode 151】反转字符串中的单词
1. 题目 2. 分析 这题要是用Python写,就非常简单了。 3. 代码 class Solution:def reverseWords(self, s: str) -> str:s " ".join(reversed(s.strip().split()))return s...
Behind the Code:Polkadot 如何重塑 Web3 未来
2024 年 5 月 17 日 Polkadot 生态 Behind the Code 第二季第一集 《创造 Web3 的未来》正式上线。第一集深入探讨了 Polkadot 和 Web3 技术在解决数字身份、数据所有权和去中心化治理方面的巨大潜力。 🔍 查看完整视频: https://youtu.be/_gP-M5nUidc?…...
for循环里如果std::pair的类型写不对,可能会造成性能损失
第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格,是因为ms在调试的时候,尤其是模板比较多的时候,经常断点的行号有问题。比如第5行的断点&…...
【Linux】Linux的基本指令_2
文章目录 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待续 二、基本指令 8. man Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问…...
Effective C++(3)
3.资源管理 条款13:以对象管理资源 以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acqu…...
自定义RedisTemplate序列化器
大纲 RedisSerializerFastJsonRedisSerializer自定义二进制序列化器总结代码 在《RedisTemplate保存二进制数据的方法》一文中,我们将Java对象通过《使用java.io库序列化Java对象》中介绍的方法转换为二进制数组,然后保存到Redis中。实际可以通过定制Red…...
Flutter 中的 CupertinoContextMenuAction 小部件:全面指南
Flutter 中的 CupertinoContextMenuAction 小部件:全面指南 在 Flutter 中,CupertinoContextMenuAction 是一个专门用于构建 iOS 风格的上下文菜单选项的组件。它为用户提供了一种便捷的方式来执行与特定项目相关的操作,例如在列表项上长按可…...
Element-Ul快速入门
引言 Element UI是一个vue.js的桌面UI库。它提供了一套丰富、灵活和实用的UI组件,使开发者能以最少的时间和代码量完成复杂的界面设计。本文将会介明如何快速上手Element UI。 安装和基本使用 首先,你需要在你的项目中安装Element UI。如果你已经安装…...
Django的模型层——2模型实例
1. 类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class BookInfo(models.Model):...books models.Manager()当为…...
Python筑基之旅-MySQL数据库(四)
目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…...
OceanBase SQL 诊断和调优实践——【DBA从入门到实践】第七期
数据库作为绝大多数应用系统储存数据的核心系统,在用户系统需要访问数据时,有着至关重要的作用。在这些交互中,SQL 语言是应用与数据库系统之间“沟通”的桥梁,它负责将应用的指令传达给数据库。因此,SQL 的性能好坏直…...
C++之std::is_trivially_copyable(平凡可复制类型检测)
目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中,平凡类型(Trivial Type)、平凡可复制类型(TrivialCopyable&#x…...
宝石收集,tarjan
0宝石收集 - 蓝桥云课 (lanqiao.cn) nint(input()) s0input() mint(input()) mp[[] for i in range(n1)] for i in range(m):a,bmap(int,input().split())a1b1mp[a].append(b)import sys sys.setrecursionlimit(100000000) dfn[0 for i in range(n1)] low[0 for i in range(n1…...
python 面对对象 类 继承
继承 继承就是为了解决两个有大量重复性代码的类,抽象出一个更抽象的类放公共代码,主要是代码复用,方便代码的管理与修改 类的继承包括属性和方法,私有属性也可继承 class Person(): # 默认是继承object超类pass…...
Rust腐蚀怎么用服务器一键开服联机教程
1、进入控制面板 首次登陆需要点击下方重置密码,如何再点击登录面板,点击后会跳转到登录页面,输入用户名和密码登录即可 2、设置游戏端口 由于腐蚀的设置需要三个端口,它们用于游戏端口(必须为首选端口)&a…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
