Jarvis OJ - Baby's Crack - Writeup
解压是一个.exe 文件 一个.enc文件
这个.enc文件用wireshark打不开,用记事本打开,是一串疑似加密后的字符
下载后解压有exe和flag.enc两个文件,初步推测flag.enc是用exe加密后的文件 .enc文件可以用来存放加密后的数据
而且根据主要函数推断,里面多次出现打开文件,文件读写操作
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
char Dest; // [rsp+20h] [rbp-80h]
FILE *v5; // [rsp+88h] [rbp-18h]
FILE *File; // [rsp+90h] [rbp-10h]
char v7; // [rsp+9Fh] [rbp-1h]
int v8; // [rsp+B0h] [rbp+10h]
const char **v9; // [rsp+B8h] [rbp+18h]
v8 = argc;
v9 = argv;
_main();
if ( v8 <= 1 )
{
printf("Usage: %s [FileName]
", *v9);
printf(aFilename);
exit(1);
}
File = fopen(v9[1], "rb+");
if ( File )
{
v5 = fopen("tmp", "wb+");
while ( feof(File) == 0 )
{
v7 = fgetc(File);
if ( v7 != -1 && v7 )
{
if ( v7 > 47 && v7 <= 96 )
{
v7 += 53;
}
else if ( v7 <= 46 )
{
v7 += v7 % 11;
}
else
{
v7 = 61 * (v7 / 61);
}
fputc(v7, v5);
}
}
fclose(v5);
fclose(File);
sprintf(&Dest, "del %s", v9[1]);
system(&Dest);
sprintf(&Dest, "ren tmp %s", v9[1]);
system(&Dest);
result = 0;
}
else
{
printf(&byte_40404B, v9[1]);
result = -1;
}
return result;
}
转化为ASCII码,用ord(i)
.enc文件只有52位,可以直接爆破(第一次使用爆破)
import string
enc = 'jeihjiiklwjnk{ljj{kflghhj{ilk{k{kij{ihlgkfkhkwhhjgly'
v7 和 enc 的位数是一样的,所以按位判断
这个需要一个字符序列吧(这个就是所有可打印字符,python里面直接使用)
dic = string.printable
flag = ''
num = []
for i in enc:
num.append(ord(i))
def entrcy1(x):
for i in dic:
if ord(i) + 53 == x:
return chr(i)
f1 = lambda x: chr(x - 53)
def entrcy2(x):
for i in dic:
if ord(i) + ord(i) % 11 == x:
return chr(i)
def entrcy3(x):
for i in dic:
if ord(i) - ord(i) % 61 == x:
return chr(i)
爆破函数,逐位爆破
def crack():
ans = ''
for i in num:
except:try:
ans += f1(i)
pass
try:
ans += entrcy2(i)
except:
pass
try:
ans += entrcy3(i)
except:
pass
return ans
print(crack())