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; // r8
  int 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);
    else
      sub_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; // r8
  int 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);
    else
      printf(aWrong_0, v6, v7);
    return 0;
  }
  else
  {
    printf(aWrong, v3, v4);
    return 0;
  }
}

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

查看加密函数

__int64 __fastcall encrypt(unsigned int *a1, _DWORD *a2)
{
  __int64 result; // rax
  unsigned 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; // rax
  char v11; // [rsp+20h] [rbp+0h] BYREF
  unsigned int v12; // [rsp+24h] [rbp+4h]
  char Str[48]; // [rsp+48h] [rbp+28h] BYREF
  int v14[12]; // [rsp+78h] [rbp+58h] BYREF
  char Src[32]; // [rsp+A8h] [rbp+88h] BYREF
  char v16[28]; // [rsp+C8h] [rbp+A8h] BYREF
  int 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; // rax
  unsigned 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!!}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

静态属性与实例属性:深入理解Java中的属性类型

在Java编程中&#xff0c;属性&#xff08;也称为字段&#xff09;是类的重要组成部分&#xff0c;它们用于存储对象的状态。根据属性的作用范围和生命周期&#xff0c;Java中的属性可以分为两类&#xff1a;静态属性&#xff08;Static Attributes&#xff09;和实例属性&…

洞察企业税务全面风险!

2020年底OECD《税收征管3.0&#xff1a;税收征管的数字化转型》的发布&#xff0c;拉开了全球各国税收征管数字化转型帷幕。中国政府积极响应&#xff0c;依托金税四期工程陆续推出全国统一电子税务局、乐企平台等系统&#xff0c;为企业税务数智化转型提供有效支撑。 用友积极…

快速搭建SpringBoot3+Vue3+ElementPlus管理系统

快速搭建SpringBoot3Vue3管理系统 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09;创建项目并下载依赖--执行以下命令 前端项目搭建&#xff08;默认开发环境&#xff1a;node20,Jdk17&#xff09; 创建项目并下载依赖–执行以下命令 创建项目 y…

链式设计模式——装饰模式和职责链模式

一、装饰模式 1、概述 动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更为灵活。 ConcreteComponent &#xff1a;是定义了一个具体的对象&#xff0c;可以给这个对象添加一些职责&#xff1b;Decorator &#xff1a;装饰抽象…

【Elasticsearch】实现用户行为分析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Linux评估网络性能

网络性能直接影响应用程序对外提供服务的稳定性和可靠性 ping命令检测网络的连通性 如果网络反应缓慢&#xff0c;或连接中断&#xff0c;可以用ping来测试网络的连通情况 time值(单位为毫秒)显示了两台主机之间的网络延时情况。如果此值很大&#xff0c;则表示网络的延时很大…

工业智能网关如何为企业实现智能制造赋能?

在数字化转型的浪潮中&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例&#xff0c;深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析&#xff0c;以及智能化决…

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面&#xff0c;点击**My Models**2. 然后&#xff0c;点击“...”&#xff0c;选择“change”&#xff0c;选择刚下载好的…

Python_Flask04(牛马问答平台01)

项目名称&#xff1a;牛马问答平台 项目简介&#xff1a;1.主要用来给社会上的牛马们探讨老板的恶心之处。 2. 用来学习交流。 技术手段&#xff1a;Python3.x Flask render_template pymysql flask_sqlalchemy........ 注意该博客为迭代项目&#xff0c;于最后一期展示完整…

【时时三省】(C语言基础)结构体内存对齐练习题

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 练习一 这个输出结果是8 练习二 这个输出结果是16 练习三 这个输出结果是32 上面的输出结果都是根据结构体对齐规则来计算的

在ARM Linux应用层下使用SPI驱动WS2812

文章目录 1、前言2、结果展示3、接线4、SPI驱动WS2812原理4.1、0码要发送的字节4.2、1码要发送的字节4.3、SPI时钟频率 5、点亮RGB5.1、亮绿灯5.2、亮红灯5.3、亮蓝灯5.4、完整程序 6、RGB呼吸灯7、总结 1、前言 事情是这样的&#xff0c;前段时间&#xff0c;写了一个基于RK3…

unity3d—demo(2d人物左右移动发射子弹)

目录 人物代码示例&#xff1a; 子弹代码示例&#xff1a; 总结上面代码&#xff1a; 注意点&#xff1a; 人物代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerTiao : MonoBehaviour {public f…

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…

怎么样能使Ubuntu的文件浏览器显示当前目录的路径,而不是只显示一个文件名?

默认情况下Ubuntu的文件浏览器是只显示当前目录的目录名的&#xff0c;这很不便我们查看路径或直接利用路径进行定位&#xff0c;那么怎么样能使Ubuntu的文件浏览器显示当前目录的路径呢&#xff1f; 两种方法&#xff1a; 第1种-临时方法 按下快捷键 Ctrl L&#xff0c;导航…

自制shell命令行解释器,深入理解Linux系统命令行实现原理

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 ​编辑 1.打印命令提示符 ​编辑 2.获取用户输入指令 3.重定向分析 4.命令行参数表与环境变量表 5.命令解析 6.命令执行 6.1.创建子进程 6.2.文件…

LangChain:大模型AI应用开发的强大引擎

文章目录 LangChain的核心功能LangChain的典型使用场景LangChain的未来展望《LangChain大模型AI应用开发实践》编辑推荐内容简介作者简介目录 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的应用开发正逐渐成为技术前沿的热门话题。随着技术的不断进步…

【MFC】vs2019中使用sqlite3完成学生管理系统

目录 效果图list Contral 控件的简单使用使用sqlite3 效果图 使用sqlite3完成简单的数据库操作。 list Contral 控件的简单使用 本章只介绍基本应用 添加表头&#xff1a;语法&#xff1a; int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat LVCFMT_LEFT…

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…

OSCP - Proving Grounds - Zino

主要知识点 SMB知识python脚本提权 具体步骤 执行nmap Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-10 01:24 UTC Nmap scan report for 192.168.52.64 Host is up (0.00077s latency). Not shown: 65529 filtered tcp ports (no-response) PORT STATE SER…