re学习笔记(8)BUUCTF-re-CrackRTF

新手一枚,如有错误(不足)请指正,谢谢!!
题目链接:BUUCTF-re-CrackRTF
参考资料:
1. BUUCTF reverse:CrackRTF
2. BUUCTF Reverse CrackRTF
3. 内容hash,签名 (Windows Crypt API)
4. python hashlib模块
5. 在VC中使用自定义资源,FindResource,LoadResource,LockResource

IDA打开,进入main函数,分析代码

int main_0()
{
  DWORD v0; // eax
  DWORD v1; // eax
  char String; // [esp+4Ch] [ebp-310h]
  int v4; // [esp+150h] [ebp-20Ch]
  char String1; // [esp+154h] [ebp-208h]
  BYTE pbData; // [esp+258h] [ebp-104h]

  memset(&pbData, 0, 260u);                     // 将&pbData的前260长度设置为0
  memset(&String1, 0, 260u);                    // 将&String1的前260长度设置为0
  v4 = 0;
  printf("pls input the first passwd(1): ");
  scanf("%s", &pbData);                         // 将输入的字符串传递给pbData
  if ( strlen(&pbData) != 6 )                   // pbData的长度要等于6
  {
    printf("Must be 6 characters!\n");          // 如果pbData的长度不为6则错误
    ExitProcess(0);
  }
  v4 = atoi(&pbData);                           // 将pbData转换成整数然后给v4
  if ( v4 < 100000 )                            // v4要大于等于100000
    ExitProcess(0);
  strcat(&pbData, "@DBApp");                    // 把"@DBApp"拼接到pbData后
  v0 = strlen(&pbData);                         // v0等于pbData的长度
  sub_40100A(&pbData, v0, &String1);
  if ( !_strcmpi(&String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") )// 不比较大小写,判断string1是否等于……
  {
    printf("continue...\n\n");
    printf("pls input the first passwd(2): ");
    memset(&String, 0, 260u);
    scanf("%s", &String);                       // 输入字符串到string地址
    if ( strlen(&String) != 6 )                 // 输入的字符串长度要为6
    {
      printf("Must be 6 characters!\n");
      ExitProcess(0);
    }
    strcat(&String, &pbData);                   // 将pbData处存储的内容拼接到String后
    memset(&String1, 0, 0x104u);                // 给string1清零
    v1 = strlen(&String);                       // 让v1等于string的长度
    sub_401019(&String, v1, &String1);			// 与sub_40100A函数作用相同
    if ( !_strcmpi("27019e688a4e62a649fd99cadaafdb4e", &String1) )// string1处存储的内容要相等
    {
      if ( !sub_40100F(&String) )
      {
        printf("Error!!\n");
        ExitProcess(0);
      }
      printf("bye ~~\n");
    }
  }
  return 0;
}

进入sub_40100A函数
re学习笔记(8)BUUCTF-re-CrackRTF_第1张图片
查阅资料为哈希加密
在网址https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id查看了标识符0x8004为CALG_SHA1
查阅hashlib模块使用方法,写出代码
re学习笔记(8)BUUCTF-re-CrackRTF_第2张图片
知道pbData为"123321@DBApp"

返回main函数
由于第二次输入的六位字符串不知道是啥,不能爆破
分析sub_40100F函数……
re学习笔记(8)BUUCTF-re-CrackRTF_第3张图片
然后分析sub_401005函数
re学习笔记(8)BUUCTF-re-CrackRTF_第4张图片
查看大佬博客,下载resource_hacker软件
re学习笔记(8)BUUCTF-re-CrackRTF_第5张图片
与密码异或,密码长度是6,所以读取的长度是6 05 7D 41 15 26 01
异或的结果保存到dbapp.rtf中,所以要读取他里面的内容,并与前六位异或,就可以得到原先的值
.rtf开头都是{\rtf1\ansi
取前六位……
写脚本进行异或
re学习笔记(8)BUUCTF-re-CrackRTF_第6张图片
得到第二部分的输入为~!3a@0
re学习笔记(8)BUUCTF-re-CrackRTF_第7张图片
本地生成了一个dbapp.rtf文件,打开,发现flag
re学习笔记(8)BUUCTF-re-CrackRTF_第8张图片
Flag{N0_M0re_Free_Bugs}

往期回顾

小白学习笔记(0) CG-CTF-re-3 py交易
小白学习笔记(1) BUUCTF-re xor
小白学习笔记(2)BUUCTF-re-新年快乐
小白学习笔记(3) CG-CT re ReadAsm2
小白学习笔记(4)BUUCTF-re-reverse_1
小白学习笔记(5)BUUCTF-re-内涵软件
小白学习笔记(6)BUUCTF-re-SimpleRev
小白学习笔记(7)BUUCTF-re-rsa

你可能感兴趣的:(ctf小白成长ing,#,reverse)