攻防世界-RE-CatFly

news/2025/2/11 23:51:18/文章来源:https://www.cnblogs.com/ylin07/p/18710719


我们将文件拖入虚拟机中运行看到这样的效果

其中上方的数字是不停变化的,下面的次数也在不断的增长。我们猜测这两者是有关联的。

接下来我们进行反编译程序的分析。最上面的字符输出肯定是与printf函数有关,所以我们检索printf在main函数中的调用

 time(&timer);v13 = 1;v24 = 0LL;v23 = 0;v22 = 0;v12 = off_FA88;while ( v13 ){if ( dword_E104 )printf("\x1B[H");elseprintf("\x1B[u");for ( k = dword_E1EC; k < dword_E1F0; ++k ){for ( m = dword_E1F4; m < dword_E1F8; ++m ){if ( k <= 23 || k > 42 || m >= 0 ){if ( m >= 0 && (unsigned int)k <= 0x3F && m <= 63 ){v19 = off_FA20[v24][k][m];off_FA88 = sub_6314((unsigned int)v24, k, m, (__int64)v12);}else{v19 = 44;}}else{v18 = (2 - m) % 16 / 8;if ( ((v24 >> 1) & 1) != 0 )v18 = 1 - v18;s[128] = (__int64)",,>>&&&+++###==;;;,,";v19 = asc_BFE3[v18 - 23 + k];if ( !v19 )v19 = 44;}if ( v25 ){printf("%s", *((const char **)&unk_FCC0 + v19));}else if ( v19 == v22 || !*((_QWORD *)&unk_FCC0 + v19) ){printf("%s", off_FA88);}else{v22 = v19;printf("%s%s", *((const char **)&unk_FCC0 + v19), off_FA88);}}sub_65E2(1);}if ( dword_E100 ){time(&time1);v11 = difftime(time1, timer);v10 = sub_63FF((unsigned int)(int)v11);for ( n = (dword_E1FC - 29 - v10) / 2; n > 0; --n )putchar(32);dword_E1E8 += printf("\x1B[1;37mYou have nyaned for %d times!\x1B[J\x1B[0m", (unsigned int)++dword_108E0);}v22 = 0;++v23;if ( dword_104C4 && v23 == dword_104C4 )sub_6471();if ( !off_FA20[++v24] )v24 = 0LL;usleep(1000 * v27);}return 0LL;
}

我们注意到这一部分,printf("%s", off_FA88);这里我们进一步跟进 off_FA88
看到了对它的赋值操作 off_FA88 = sub_6314((unsigned int)v24, k, m, (__int64)v12);
此时我们查看sub_6314的源代码

char *__fastcall sub_6314(__int64 a1, int a2, int a3, __int64 a4)
{if ( a2 != 18 )return (char *)a4;if ( a3 <= 4 || a3 > 54 )return (char *)a4;byte_104C9 = 32;dword_E120[a3 - 5] ^= sub_62B5();if ( (unsigned __int8)sub_62E3(dword_E120[a3 - 5]) )byte_104C8 = dword_E120[a3 - 5] & 0x7F;elsebyte_104C8 = 32;return &byte_104C8;
}

这里的a4实际上就是off_FA88的值,我们通过分析可以把这个函数理解为以下的函数

for (int i = 0; i < 50; ++i) {dword_E120[i] ^= sub_62B5();                   // 对数组的每个元素进行异或操作if ((unsigned __int8)sub_62E3(dword_E120[i]))  // 调用 sub_62E3 进行判断flag[i] = dword_E120[i] & 0x7F;            // 如果条件成立,设置 flag[i] 为 dword_E120[i] & 0x7Felseflag[i] = 32;                              // 否则,设置 flag[i] 为 32(空格字符)
}

也就是说接下来我们需要去进一步跟进 sub_62B5sub_62E3的内容

__int64 sub_62B5()
{dword_E1E8 = 1103515245 * dword_E1E8 + 12345;return (dword_E1E8 >> 10) & 0x7FFF;
}_BOOL8 __fastcall sub_62E3(char a1)
{return (a1 & 0x7Fu) <= 0x7E && (a1 & 0x7Fu) > 0x20;
}

这些都是做判断和计算用的函数,不用逆向,只需要直接调用即可
现在我们对flag的逆向加密逻辑完成了,我们需要去注意使用的参数,比如dword_E1E8 dword_E120,其中dword_E120可以直接提取出来,但是dword_E1E8 则需要计算得到,而且他在程序中还有自增操作

dword_E1E8 += printf("\x1B[1;37mYou have nyaned for %d times!\x1B[J\x1B[0m", (unsigned int)++dword_108E0);

每次他都会加上一个printf的返回值,由于调用printf返回是一件很麻烦的事情,所以我们手动计算它的返回值
综上我们可以写出以下解密脚本

#include<stdio.h>
#include<string.h>
#include<stdbool.h>int flag[50];
//可以在IDA中得到
int dword_E1E8 = 0x1106;
int dword_E120[50] = { 0x27fb, 0x27a4, 0x464e, 0x0e36, 0x7b70, 0x5e7a, 0x1a4a, 0x45c1, 0x2bdf, 0x23bd, 0x3a15, 0x5b83, 0x1e15, 0x5367, 0x50b8, 0x20ca, 0x41f5, 0x57d1, 0x7750, 0x2adf, 0x11f8, 0x09bb, 0x5724, 0x7374, 0x3ce6, 0x646e, 0x010c, 0x6e10, 0x64f4, 0x3263, 0x3137, 0x00b8, 0x229c, 0x7bcd, 0x73bd, 0x480c, 0x14db, 0x68b9, 0x5c8a, 0x1b61, 0x6c59, 0x5707, 0x09e6, 0x1fb9, 0x2ad3, 0x76d4, 0x3113, 0x7c7e, 0x11e0, 0x6c70 };bool __fastcall sub_62E3(char a1)
{return (a1 & 0x7Fu) <= 0x7E && (a1 & 0x7Fu) > 0x20;
}
__int64 sub_62B5()
{dword_E1E8 = 1103515245 * dword_E1E8 + 12345;return (dword_E1E8 >> 10) & 0x7FFF;
}
int charnum(unsigned int a){int c = 0;while(a != 0){a/=10;c+=1;}return c;
}int main(){unsigned int dword_108E0 = 0;while (1) {char flag[50];for (int i = 0; (int)i < 50; ++i) {dword_E120[i] ^= sub_62B5();if ((unsigned __int8)sub_62E3(dword_E120[i]))flag[i] = dword_E120[i] & 0x7F;elseflag[i] = 32;}if (!strncmp(flag, "CatCTF", 6)) {printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");puts(flag);printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n %d" ,dword_108E0);break;}dword_108E0 += 1;dword_E1E8 += 41;dword_E1E8 += charnum(dword_108E0);if(dword_108E0%1000000==0)printf("%d\n",dword_108E0);}return 0;
}

太抽象了,这真的是难度一吗?

总结:
明确flag是哪个参数,不断跟进,逆向加密逻辑,拿到解密数据,不要放弃,保持耐心与冷静

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

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

相关文章

Maui 内嵌网页直接调用本机原生功能 Demo

使用 MAUI 制作 H5 套壳程序有以下几个好处:跨平台支持:MAUI (Multi-platform App UI) 允许开发者在多个平台(如 iOS、Android、Windows 和 macOS)上运行应用程序。统一封装的MauiPlus库可以统一调用本机功能,确保在不同平台上有一致的用户体验。访问本地功能:MauiPlus库…

Deepseek最强白嫖指南-通过GROQ调用api使用deepseek-70B模型

众所周知最近deepseek很火,非常火!火出圈,各种博主割韭菜也是割到爆炸💥! 今天给大家写一个通过Groq调用Free api来使用deepseek的70B模型。当然不止这一个模型!DeepSeek-70B 是一款强大的大语言模型,您可以通过 Groq 提供的 API 免费调用该模型。以下是详细的教程,指…

【DeepSeek】本地DeepSeek下载慢,中断、内网无法安装方案来了

最近在群里有不少人反馈,ollama安装deepseek有以下几个问题。 1,特别慢,或者多次中断,导致下载不下来 2,无魔法 3,想在内网环境安装,没有网络 我研究了下解决方案。通过已经下载的模型,可以直接导入。 反向解析模型 查看本地的模型 ollama listNAME …

【Windows 日志】Windows 日志清理秘籍:基于登录日志精准清扫术

免责声明 如果使用本文档中的信息导致任何直接或间接的后果和损失,我们提醒您,这将由您个人承担。我们不承担由此产生的任何责任。前言 痕迹清理技术是渗透测试中的关键环节,它旨在消除操作痕迹以防止溯源、隐藏攻击手法,并为进一步的渗透活动争取时间。然而,并非每次渗透…

shell自动化编程简介0

自动化运维是未来的运维的必然趋势会写代码 会用工具Shell编程的特点简单、高效 功能强大 可移植性好作为运维开发人员,编写Shell脚本是第一步 误区:Shell编程就是Linux命令堆积?简单理解:Linux命令+编程语法(if/else、for、while、判断)经验之谈运维的核心就是执行正确的…

【免杀系列】 进程镂空

# 恶意软件 # 进程镂空免责声明 请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我们不鼓励也不支持任何非法活动。前言 进程镂空(Process Hollowing),又称为“傀儡进程”,是一种恶意软件(…

关于this的练习

题目: 刚开始没有想到用面向对象的方法对书这个类进行操作 /* 我在练习中出现的问题: 1.读题时,不确定方法有没有返回值,以为自己在方法中写了输出语句,但是没有 2.在main函数中,发先需要返回值,并误将double认为int类型 3.在方法中修改返回值之后忘记加return语句 其实…

昆明理工大学25考研计算机调剂名额

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理

【DeepSeek】打造智能微信机器人:wxauto 与 DeepSeek 的完美结合

免责声明: 本文仅用于交流学习,请大家务必保护好自己的账号安全,谨慎使用相关技术。# 自动化工具 在当今的数字化时代,自动化工具和人工智能技术的结合为我们的生活和工作带来了极大的便利。微信作为中国最流行的即时通讯工具之一,拥有庞大的用户群体。本文将介绍如何使用…

ZR 省选摆烂记

Day 1 - 数据结构 链表 Problem 1 - 洛谷 P10061 很精妙的链表题。 首先考虑特殊性质,旋转整个矩阵改怎么做。 显然只需要维护矩阵旋转了多少次即可。 特殊性质好做的原因正是矩阵的“结构”没有变,原来相邻的数还是相邻,即旋转后的修改可以映射到原来矩阵的修改。 因此考虑…

【Deepseek】教你将Deepseek接入WPS和Word/Excel日常办公使用

以下文章来源于像梦又似花 ,作者小编 以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用: 1、下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 OfficeAI 助手 是…