目录
某文件被加密了
最后修改时间是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@1
DWORD Seed; // ST38_4@1
int v5; // eax@2
signed int v7; // [sp+24h] [bp-34h]@1
v3 = time32(0i64); //0i64表示int64_t类型的0,time3()表示返回自1970年1月1日午夜起经过的秒数,或者在出现错误时返回-1
Seed = 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:00
tnNormal.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