TEA系列例题

解析 TEA 加密算法(C语言、python):_tea加密-CSDN博客

CTF-RE 从0到N: TEA_tea加密原理-CSDN博客

1 字节 = 8 位

牢记密文的64位和密钥的128位,最好可以自己独立的写出tea解密代码

相当于密文是传入8个字符类型数据或者是2个整型数据,

密钥是16个字符数据或者4个整型数据,

一.drink_tea

blob:https://ctf.xidian.edu.cn/7ae7c1a9-61a8-4343-be1f-a4ce1fafcf7e

int __fastcall main(int argc, const char **argv, const char **envp)
{__int64 v3; // rdx__int64 v4; // r8__int64 v6; // rdx__int64 v7; // r8int i; // [rsp+20h] [rbp-28h]__int64 v9; // [rsp+28h] [rbp-20h]sub_140001070(aPleaseInput, argv, envp);sub_140001120("%32s", byte_140004700);v9 = -1i64;do++v9;while ( byte_140004700[v9] );if ( v9 == dword_140004078 ){for ( i = 0; i < dword_140004078; i += 8 )sub_140001180(&byte_140004700[i], aWelcometonewst);if ( !memcmp(byte_140004700, &unk_140004080, dword_140004078) )sub_140001070(aRight, v6, v7);elsesub_140001070(aWrong_0, v6, v7);return 0;}else{sub_140001070(aWrong, v3, v4);return 0;}
}
int __fastcall main(int argc, const char **argv, const char **envp)
{__int64 v3; // rdx__int64 v4; // r8__int64 v6; // rdx__int64 v7; // r8int i; // [rsp+20h] [rbp-28h]__int64 v9; // [rsp+28h] [rbp-20h]printf(Format, argv, envp);scanf("%32s", falg);v9 = -1i64;do++v9;while ( falg[v9] );if ( v9 == len ){for ( i = 0; i < len; i += 8 )encrypt(&falg[i], aWelcometonewst);if ( !memcmp(falg, &miwen, len) )printf(aRight, v6, v7);elseprintf(aWrong_0, v6, v7);return 0;}else{printf(aWrong, v3, v4);return 0;}
}

分析了一下修改了函数名,查看密文和长度

查看加密函数

__int64 __fastcall encrypt(unsigned int *a1, _DWORD *a2)
{__int64 result; // raxunsigned int v3; // [rsp+0h] [rbp-38h]unsigned int v4; // [rsp+4h] [rbp-34h]int v5; // [rsp+8h] [rbp-30h]unsigned int i; // [rsp+Ch] [rbp-2Ch]v3 = *a1;v4 = a1[1];v5 = 0;for ( i = 0; i < 0x20; ++i ){v5 -= 1640531527;v3 += (a2[1] + (v4 >> 5)) ^ (v5 + v4) ^ (*a2 + 16 * v4);v4 += (a2[3] + (v3 >> 5)) ^ (v5 + v3) ^ (a2[2] + 16 * v3);}*a1 = v3;result = 4i64;a1[1] = v4;return result;
}

是tea加密,密文是32个字符类型数据,密钥是16个字符类型数据,让后学到了新的代码

uint32_t:32位无符号整数

uint32_t 是一个在 C 语言标准库 <stdint.h> 中定义的类型,可以处理特定大小数据,就比如tea中的密文和密钥

写代码

#include<stdio.h>
#include<stdint.h>
void decrypt(uint32_t *a1,uint32_t *a2)
{uint32_t  v3; // [rsp+0h] [rbp-38h]uint32_t  v4; // [rsp+4h] [rbp-34h]int v5; // [rsp+8h] [rbp-30h]uint32_t  i; // [rsp+Ch] [rbp-2Ch]v3 = a1[0];v4 = a1[1];v5 = -1640531527*32;for ( i = 0; i < 32; ++i ){v4 -= (a2[3] + (v3 >> 5)) ^ (v5 + v3) ^ (a2[2] + 16 * v3);v3 -= (a2[1] + (v4 >> 5)) ^ (v5 + v4) ^ (a2[0] + 16 * v4);v5 += 1640531527;}a1[0] = v3;a1[1] = v4;
}
int main()
{unsigned char a[]={120,  32, 247, 179, 197,  66, 206, 218, 133,  89, 33,  26,  38,  86,  90,  89,  41,   2,  13, 237, 7, 168, 185, 238,  54,  89,  17, 135, 253,  92, 35,  36};unsigned char key[]="WelcomeToNewStar";int i;uint32_t *v=(uint32_t*)a;uint32_t *k=(uint32_t*)key;for(i=0;i<8;i+=2){decrypt(v+i,k);}for(i=0;i<32;i++){printf("%c",a[i]);}
}

flag{There_R_TEA_XTEA_and_XXTEA}

二.xtea

int __fastcall main_0(int argc, const char **argv, const char **envp)
{char *v3; // rdi__int64 i; // rcx__int64 v5; // rax__int64 v6; // rax__int64 v7; // rax__int64 v8; // rax__int64 v10; // raxchar v11; // [rsp+20h] [rbp+0h] BYREFunsigned int v12; // [rsp+24h] [rbp+4h]char Str[48]; // [rsp+48h] [rbp+28h] BYREFint v14[12]; // [rsp+78h] [rbp+58h] BYREFchar Src[32]; // [rsp+A8h] [rbp+88h] BYREFchar v16[28]; // [rsp+C8h] [rbp+A8h] BYREFint j; // [rsp+E4h] [rbp+C4h]v3 = &v11;for ( i = 58i64; i; --i ){*v3 = -858993460;v3 += 4;}j___CheckForDebuggerJustMyCode(&unk_140028066, argv, envp);v12 = 32;memset(Str, 0, 0xDui64);v5 = sub_1400110AA(std::cout, "please input key:");std::ostream::operator<<(v5, sub_140011046);sub_14001153C(std::cin, Str);v14[0] = 2;v14[1] = 0;v14[2] = 2;v14[3] = 4;v6 = sub_1400110AA(std::cout, "let me check your key");std::ostream::operator<<(v6, sub_140011046);v7 = sub_1400110AA(std::cout, "emmm");std::ostream::operator<<(v7, sub_140011046);if ( j_strlen(Str) == 12 ){memset(v16, 0, 8ui64);j_memcpy(Src, Str, 8ui64);sub_14001119F(v12, Src, v14);j_memcpy(Str, Src, 8ui64);j_memcpy(v16, &Str[4], 8ui64);sub_14001119F(v12, v16, v14);j_memcpy(&Str[4], v16, 8ui64);for ( j = 0; j < 12; ++j ){if ( Str[j] != byte_140022000[j] )goto LABEL_5;}v10 = sub_1400110AA(std::cout, "Correct key! Your flag is moectf{your key}");std::ostream::operator<<(v10, sub_140011046);return 0;}else{
LABEL_5:v8 = sub_1400110AA(std::cout, "XD,wrong!");std::ostream::operator<<(v8, sub_140011046);return 0;}
}

是c++代码,猜测关键地方

进入sub_14001119F函数有xtea加密

__int64 __fastcall sub_1400148C0(unsigned int a1, unsigned int *a2, __int64 a3)
{__int64 result; // raxunsigned int i; // [rsp+24h] [rbp+4h]unsigned int v5; // [rsp+44h] [rbp+24h]unsigned int v6; // [rsp+64h] [rbp+44h]unsigned int v7; // [rsp+84h] [rbp+64h]j___CheckForDebuggerJustMyCode(&unk_140028066, a2, a3);v5 = *a2;v6 = a2[1];v7 = 0;for ( i = 0; i < a1; ++i ){v5 += (*(a3 + 4i64 * (v7 & 3)) + v7) ^ (v6 + ((v6 >> 5) ^ (16 * v6)));v7 -= 855655493;v6 += (*(a3 + 4i64 * ((v7 >> 11) & 3)) + v7) ^ (v5 + ((v5 >> 5) ^ (16 * v5)));}*a2 = v5;result = 4i64;a2[1] = v6;return result;
}

写注释来分析,其中

8ui64分析是对“8个无符号的64位整数”的非正式简写。这里的“ui64”通常指的是一个无符号的64位整数,而“8”表示数量。

由于一个无符号的64位整数占用8个字节(因为64位等于8字节),那么“8ui64”就意味着8个这样的64位整数。因此,计算总字节数是64字节


但是密文就只有12个字符是64字节,其中他还分了前后8位进行加密运算,所以合理猜测是表示有误,我们按照一般思路来解题目;

写代码

#include<stdio.h>
#include<stdint.h>
void decrypt( uint32_t *a2, int* a3)
{int i; // [rsp+24h] [rbp+4h]uint32_t v5; // [rsp+44h] [rbp+24h]uint32_t v6; // [rsp+64h] [rbp+44h]int v7; // [rsp+84h] [rbp+64h]v5 = *a2;v6 = a2[1];v7 = -855655493*32;for ( i = 0; i < 32; ++i ){v6 -= (a3[(v7 >> 11) & 3] + v7) ^ (v5 + ((v5 >> 5) ^ (16 * v5)));v7 += 855655493;v5 -= (a3[v7 & 3] + v7) ^ (v6 + ((v6 >> 5) ^ (16 * v6)));}*a2 = v5;a2[1] = v6;}
int main()
{unsigned char miwen[] ={163, 105, 150,  38, 189, 120,  11,  61, 157, 165, 40,  98,  };int key[]={2,0,2,4};int i;uint32_t*v=(uint32_t*)miwen;decrypt(v+1,key);decrypt(v,key);for(i=0;i<12;i++){printf("%c",miwen[i]);}
}
moectf2024!!

让后结合输出的格式

moectf{moectf2024!!}

之后遇到了有价值的题目再总结于此吧

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

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

相关文章

[241206] X-CMD 发布 v0.4.15:env 升级,mirror 支持华为/腾讯 npm 镜像,pb-wayland 剪贴板

目录 X-CMD 发布 v0.4.15&#x1f4c3;Changelog&#x1f4e6; env|pkg&#x1fa9e; mirror&#x1f4d1; pb&#x1f3a8; theme|starship|ohmyposh&#x1f916; chat&#x1f4dd; man✅ 升级指南 X-CMD 发布 v0.4.15 &#x1f4c3;Changelog &#x1f4e6; env|pkg 新增…

SpringBoot【一】零基础入门 springboot 及 idea 搭建

一、前言 springboot是什么&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。用我的话来理解&#xff0…

【kotlin 】内联类(value class / inline class)

官方文档&#xff1a;https://kotlinlang.org/docs/inline-classes.html 注&#xff1a;inline class 关键字已经被废弃&#xff0c;取而代之的是value class。现在使用内联类需要定义类为value class&#xff0c;并使用JvmInline注解进行标注。 一、使用场景 有时候&#xff…

3D 生成重建023-DMV3D用扩散模型做3D生成大模型

3D 生成重建023-DMV3D用扩散模型做3D生成大模型 文章目录 0 论文工作1 论文方法2 实验效果 0 论文工作 这个论文提出了一种新的三维生成方法DMV3D&#xff0c;它利用基于Transformer 的大型三维重建模型对多视图扩散进行去噪处理。重建模型包含三平面NeRF表示&#xff0c;并能…

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

【Redis】壹 —— Redis 介绍

文章目录&#xff1a; 前言 一、认识Redis 1. Redis 用途 作为数据库 作为流引擎 二、服务端高并发分布式结构演变 1. 单机架构 2. 应用数据分离架构 3. 应用服务集群架构 4. 读写分离 / 主从分离架构 5. 冷热分离 —— 引入缓存 6. 分库分表 7. 微服务架构 8. …

D88【python 接口自动化学习】- pytest基础用法

day88 pytest运行参数-q -s -v 学习日期&#xff1a;20241203 学习目标&#xff1a;pytest基础用法 -- pytest运行参数-q -s -v&pytest使用ini配置指定运行参数 学习笔记&#xff1a; pytest -q 说明&#xff1a;简化控制台的输出 pytest -q .\testcases\test_reques…

22 网络编程:Go 语言如何通过 RPC 实现跨平台服务

在上一讲中&#xff0c;我为你讲解了 RESTful API 的规范以及实现&#xff0c;并且留了两个作业&#xff0c;它们分别是删除和修改用户&#xff0c;现在我为你讲解这两个作业。 删除一个用户比较简单&#xff0c;它的 API 格式和获取一个用户一样&#xff0c;但是 HTTP 方法换…

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…

AI给我们生活带来了哪些便利?

在21世纪的科技浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;如同一股不可阻挡的力量&#xff0c;正深刻地改变着我们的生活方式&#xff0c;从日常琐事到复杂决策&#xff0c;无一不渗透着AI的智慧之光。它不仅极大地提升了生活效率&#xff0c;还为我们开启了前所未…

在vue3里使用scss实现简单的换肤功能

实现的换肤功能&#xff1a;主题色切换、亮色模式和暗黑模式切换、背景图切换 主题色就是网站主色&#xff0c;可以配置到组件库上面&#xff1b;亮色模式又分为两种风格&#xff1a;纯白风格和背景图风格&#xff0c;不需要背景图的话可以删掉这部分逻辑和相关定义&#xff1b…

css实现圆周运动效果

在CSS中可以通过 keyframes 动画 和 transform 属性实现元素的圆周运动。以下是一个示例代码&#xff1a; 示例代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content…

Python subprocess.run 使用注意事项,避免出现list index out of range

在执行iOS UI 自动化专项测试的时候&#xff0c;在运行第一遍的时候遇到了这样的错误&#xff1a; 2024-12-04 20:22:27 ERROR conftest pytest_runtest_makereport 106 Test test_open_stream.py::TestOpenStream::test_xxx_open_stream[iPhoneX-xxx-1-250] failed with err…

不一样的CSS(4)--icon图标系列之svg

序言 上一节内容我们讲解了如何利用css去画一个五角星&#xff0c;其中包括了使用svg的方法&#xff0c;有些小伙伴们对svg的使用不是很了解&#xff0c;那么本节内容我们主要来讲一下&#xff0c;关于svg标签的的使用。 目录 序言一、svg的介绍二、安装SVG扩展插件三、SVG基…

springSecurity认证流程

Spring Security 是spring家族中的一个安全管理框架。相比于另一个安全框架Shiro&#xff0c;它提供更丰富的功能和社区资源&#xff0c;但也较难上手。所以一般大项目用spring Security&#xff0c;小项目用Shiro。 一般web应用需要认证和授权&#xff0c;这也是spring Secur…

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行和测试 五…

react跳转传参的方法

传参 首先下载命令行 npm react-router-dom 然后引入此代码 前面跳转的是页面 后面传的是你需要传的参数接参 引入此方法 useLocation()&#xff1a;这是 react-router-dom 提供的一个钩子&#xff0c;用于获取当前路由的位置对象location.state&#xff1a;这是从其他页面传…

C++(十二)

前言&#xff1a; 本文将进一步讲解C中&#xff0c;条件判断语句以及它是如何运行的以及内部逻辑。 一&#xff0c;if-else,if-else语句。 在if语句中&#xff0c;只能判断两个条件的变量&#xff0c;若想实现判断两个以上条件的变体&#xff0c;就需要使用if-else,if-else语…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

三菱CNC数采超详细,资料全备教程,后续更新发那科数采教程

三菱数采详细教程 文章目录 三菱数采详细教程一、介绍1.背景2.需要掌握知识3.需要资料①三菱SDK包&#xff1a;A2②三菱com接口文档③C#代码&#xff1a;④VStudio⑤资料存放网盘 二、程序运行1.调试设备①条件②命令 2.运行软件①打开软件②运行程序 三、数据采集1.代码了解2.…