buu-re-CrackRTF

exeinfope查看信息

buu-re-CrackRTF

 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 函数

buu-re-CrackRTF

查阅资料发现为哈希加密,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

运行得到结果

buu-re-CrackRTF

 第一次输入密码为123321,经过验证正确。

分析 sub_401019 函数

buu-re-CrackRTF

同理查阅发现为md5加密,得到32位字符串string1。

但由于输入没有提示范围限定,故不能爆破。接着往下看先......

分析 sub_40100F 函数

 buu-re-CrackRTF

分析 sub_401005 函数

buu-re-CrackRTF

 下载 Resource Hacker软件,打开题目文件

buu-re-CrackRTF

 因为输入密码的长度为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)

运行结果

buu-re-CrackRTF

依次输入两次运行的结果,回车后发现题目文件所在文件夹中产生.rtf文件。

得到flag

buu-re-CrackRTF

参考:

re学习笔记(8)BUUCTF-r​​​​​​e-CrackRTF

BUUCTF Reverse CrackRTF

ALG_ID

上一篇:BUUCTF [SUCTF2019]Akira Homework


下一篇:读取连接数据库信息