exeinfope查看信息
ida分析
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
DWORD v3; // eax
DWORD v4; // eax
char Str[260]; // [esp+4Ch] [ebp-310h] BYREF
int v7; // [esp+150h] [ebp-20Ch]
char String1[260]; // [esp+154h] [ebp-208h] BYREF
char Destination[260]; // [esp+258h] [ebp-104h] BYREF
memset(Destination, 0, sizeof(Destination));
memset(String1, 0, sizeof(String1));
v7 = 0;
printf("pls input the first passwd(1): ");
scanf("%s", Destination); // 第一次输入,6位
if ( strlen(Destination) != 6 )
{
printf("Must be 6 characters!\n");
ExitProcess(0);
}
v7 = atoi(Destination); // 将Destination转换为整数给v7
if ( v7 < 100000 )
ExitProcess(0);
strcat(Destination, "@DBApp");
v3 = strlen(Destination);
sub_40100A((BYTE *)Destination, v3, String1); // 对Destination进行加密处理
if ( !_strcmpi(String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") )// 得到了40位字符串,考虑加密方式为shal加密,忽略大小写进行比较
{
printf("continue...\n\n");
printf("pls input the first passwd(2): ");
memset(Str, 0, sizeof(Str));
scanf("%s", Str); // 第二次输入,6位
if ( strlen(Str) != 6 )
{
printf("Must be 6 characters!\n");
ExitProcess(0);
}
strcat(Str, Destination);
memset(String1, 0, sizeof(String1));
v4 = strlen(Str);
sub_401019((BYTE *)Str, v4, String1);
if ( !_strcmpi("27019e688a4e62a649fd99cadaafdb4e", String1) )// 得到32位字符串,考虑md5加密,忽略大小写进行比较
{
if ( !(unsigned __int8)sub_40100F(Str) )
{
printf("Error!!\n");
ExitProcess(0);
}
printf("bye ~~\n");
}
}
return 0;
}
分析 sub_40100A 函数
查阅资料发现为哈希加密,ALG_ID (Wincrypt.h) - Win32 apps | Microsoft Docs。
根据hashlib模块写出爆破脚本
import hashlib
string1 = '6e32d0943418c2c33385bc35a1470250dd8923a9'
data = '@DBApp'
for i in range(100000,1000000):
str1=str(i)+data
str2=hashlib.sha1(str1.encode('utf-8'))
res=str2.hexdigest()
if res==string1:
print(str(i)+data)
break
运行得到结果
第一次输入密码为123321,经过验证正确。
分析 sub_401019 函数
同理查阅发现为md5加密,得到32位字符串string1。
但由于输入没有提示范围限定,故不能爆破。接着往下看先......
分析 sub_40100F 函数
分析 sub_401005 函数
下载 Resource Hacker软件,打开题目文件
因为输入密码的长度为6位,故取前六位。异或结果存储在dbapp.rtf文件里,所以要读取.rtf文件的内容,并与前六位异或。
rtf文件的开头是 {\rtf1\ansi\ansicpg936\deff0\deflang1033...
取前六位即为 {\rtf1
写脚本
list1=[0x05,0x7D,0x41,0x15,0x26,0x01]
str3="{\\rtf1"
flag=''
for i in range(len(list1)):
key=ord(str3[i])^list1[i]
flag += chr(key)
print(flag)
运行结果
依次输入两次运行的结果,回车后发现题目文件所在文件夹中产生.rtf文件。
得到flag
参考:
re学习笔记(8)BUUCTF-re-CrackRTF