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

查阅资料为哈希加密
在网址https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id查看了标识符0x8004为CALG_SHA1
查阅hashlib模块使用方法,写出代码
在这里插入图片描述
知道pbData为"123321@DBApp"

返回main函数
由于第二次输入的六位字符串不知道是啥,不能爆破
分析sub_40100F函数……
在这里插入图片描述
然后分析sub_401005函数
在这里插入图片描述
查看大佬博客,下载resource_hacker软件
在这里插入图片描述
与密码异或,密码长度是6,所以读取的长度是6 05 7D 41 15 26 01
异或的结果保存到dbapp.rtf中,所以要读取他里面的内容,并与前六位异或,就可以得到原先的值
.rtf开头都是{\rtf1\ansi
取前六位……
写脚本进行异或
在这里插入图片描述
得到第二部分的输入为~!3a@0

本地生成了一个dbapp.rtf文件,打开,发现flag
在这里插入图片描述
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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgo7ten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值