某文件被加密了(基于时间的随机种子破解)

2024-01-20 20:50

本文主要是介绍某文件被加密了(基于时间的随机种子破解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 某文件被加密了

某文件被加密了

最后修改时间是2019/04/11 22:10:34。 猜测大概2019/04/11
22点11分之前,某一刻用户运行了genprik,生成了密钥加密文件。
加密算法已知,通过分析密文,只能得出密钥第1个字节是0x25第2个字节是0x61。 求完整的16个字节的密钥。

刚开始用IDA打开,IDA会提示exe的入口点在其他的位置,应该是有壳,先对它进行查壳脱壳:
在这里插入图片描述

再用IDA打开:
在这里插入图片描述

int __cdecl main(int argc, const char **argv, const char **envp)
{__time32_t v3; // ST40_4@1DWORD Seed; // ST38_4@1int v5; // eax@2signed int v7; // [sp+24h] [bp-34h]@1v3 = time32(0i64);        //0i64表示int64_t类型的0,time3()表示返回自1970年1月1日午夜起经过的秒数,或者在出现错误时返回-1Seed = GetCurrentProcessId() ^ v3;   //获取当前进程的唯一标识srand(Seed);v7 = 0;do{v5 = rand();printf(Format, (v5 >> 7) & 0xFF);++v7;}while ( v7 < 16 );return 0;
}

这就是代码的关键部分,获取当前系统时间和进程号,来进行运算生产16字节的密钥,所以我们将时间调整到2019/04/11 22:10:34之前进行爆破,因为我们是进行爆破,所以时间不用太准确,只要在这之前都行,当然这里的2019/04/11 22:10:34可能是老师给的hint:设置密钥的正确事件。我将当前时间设为了2019/04/11 22:10:00开始,先将它转换成从1970年1月1日以来持续时间的秒数:
源代码:time.c

#include<stdio.h>
#include<time.h>
/**
struct tm {int tm_sec;// 秒 - 取值区间为[0,59] /int tm_min; // 分 - 取值区间为[0,59] /int tm_hour; / 时 - 取值区间为[0,23] /int tm_mday; / 一个月中的日期 - 取值区间为[1,31] /int tm_mon; / 月份 (从一月开始,0代表一月) - 取值区间为[0,11] /int tm_year; / 年份,其值等于实际年份减去1900 /int tm_wday; / 星期 - 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 /int tm_yday; / 从每年的1月1日开始的天数 - 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 /int tm_isdst; / 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负. /
};
*/
int main(void)
{//获取时间差struct tm tnNormal;///开始的时间:2019/04/11 22:10:00tnNormal.tm_year = 2019-1900;tnNormal.tm_mon = 4-1;tnNormal.tm_mday = 11;tnNormal.tm_hour = 22;tnNormal.tm_min = 10;tnNormal.tm_sec = 0;tnNormal.tm_isdst = 0;time_t tmNormal;tmNormal = mktime(&tnNormal);///开始的时间:2019/04/11 22:10:00转化为的秒数:1554991800printf("开始的时间:2019/04/11 22:10:00转化为的秒数:%d\n",tmNormal);return 0;
}

运行结果:
在这里插入图片描述

将2019/04/11 22:10:00转化为的秒数是:1554991800。接下来从1554991800开始递加,当前进程ID从0到100000循环,爆破直到得出的密钥第1个字节是0x25第2个字节是0x61:
下面是源代码:key.c

#include<stdlib.h>
#include <stdio.h>
/**
0~100000和0~500的第一个解
0x25 0x61 0x6c 0xd5 0x1d 0xd3 0x4b 0xcb 0xe7 0x34 0x97 0x93 0xa4 0x92 0x53 0x1f
当前时间:1554991800,当前进程:32375
*/
int main()
{///开始的时间:2019/04/11 22:09:00__time32_t v3 = 1554991800; // ST40_4@1long Seed; // ST38_4@1int v5; // eax@2signed int v7; // [sp+24h] [bp-34h]@1int i;int flag = 0;int id;__time32_t now;///0x25和0x61__int8 v4,v6;///时间递加for(i = 0; i< 500; i++){now = v3+i;///获取当前进程的唯一标识GetCurrentProcessId()for(id = 0 ; id < 100000 ; id++){Seed = id ^ now;///设置时间种子srand(Seed);v7 = 0;__int8 temp = 0;do{///根据时间种子生成随机数v5 = rand();temp = (v5 >> 7) & 0xFF;///第一个数是0x25if( v7 ==0 && 0x25 == temp){v4 = 0x25;///第一个数不是0x25}else if(v7 == 0 && temp !=0x25){v4 = 0;break ;}///第二个数是0x61if(v7 == 1 && 0x61 == temp){v6 = 0x61;printf("0x25 ");///第二个数不是0x61}else if(v7 == 1 && 0x61 != temp){v4 = 0;v6 = 0;break;}///如果找到结果if(v4 == 0x25 && v6 ==0x61){printf("0x%x ",temp & 0xFF);}++v7;}while( v7 < 16 );if(v7 == 16){///输出正确答案printf("\n当前时间:%d,当前进程:%d\n",now,id);flag = 1;break;}}if(flag == 1){printf("flag\n");break;}}return 0;
}

运行结果:
在这里插入图片描述

最后破解的16字节密钥为:0x25 0x61 0x6c 0xd5 0x1d 0xd3 0x4b 0xcb 0xe7 0x34 0x97 0x93 0xa4 0x92 0x53 0x1f。
到这破解的密钥已经得到的,但是我们发现当前时间:1554991800,当前进程:32375,因为随机种子是由当前时间和当前进程异或得到的,所以随着当前时间和当前进程递增,会出现多个时间和进程的异或结果相同,然后它们都最终得到这同一个密钥:0x25 0x61 0x6c 0xd5 0x1d 0xd3 0x4b 0xcb 0xe7 0x34 0x97 0x93 0xa4 0x92 0x53 0x1f。
我们来输出一下增加的时间0500以内和进程ID在0100000以内的所有解:
源代码:

#include<stdlib.h>
#include <stdio.h>int main()
{///开始的时间:2019/04/11 22:10:00__time32_t v3 = 1554991800; // ST40_4@1long Seed; // ST38_4@1int v5; // eax@2signed int v7; // [sp+24h] [bp-34h]@1int i;int flag = 0;int id;__time32_t now;///0x25和0x61__int8 v4,v6;///时间递加for(i = 0; i< 500; i++){now = v3+i;///获取当前进程的唯一标识GetCurrentProcessId()for(id = 0 ; id < 100000 ; id++){Seed = id ^ now;///设置时间种子srand(Seed);v7 = 0;__int8 temp = 0;do{///根据时间种子生成随机数v5 = rand();temp = (v5 >> 7) & 0xff;///第一个数是0x25if( v7 ==0 && 0x25 == temp){v4 = 0x25;///第一个数不是0x25}else if(v7 == 0 && temp !=0x25){v4 = 0;break ;}///第二个数是0x61if(v7 == 1 && 0x61 == temp){v6 = 0x61;printf("0x25 ");///第二个数不是0x61}else if(v7 == 1 && 0x61 != temp){v4 = 0;v6 = 0;break;}///如果找到结果if(v4 == 0x25 && v6 ==0x61){printf("0x%x ",temp & 0xff);}++v7;}while( v7 < 16 );if(v7 == 16){///输出正确答案printf("\n当前时间:%d,当前进程:%d,异或的结果随机种子:%d\n",now,id,now^id);v4 = 0;v6 = 0;}}}return 0;
}

运行结果:
在这里插入图片描述

这是因为源文件算法中异或这个限制条件不够苛刻,又没有其他的条件来限制多解,才会出现这样的情况,题目的主要用意也是让我们明白以当前系统时间作为随机种子并不是安全的。

这篇关于某文件被加密了(基于时间的随机种子破解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627301

相关文章

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据