buuctf_reverse1

题目链接 : https://buuoj.cn/challenges#reverse1

这个题我们运行的话会提示缺少 dll

IDA 载入打开字符串定位到 flag 的关键函数

我们直接 F5, 然后分析好的代码如下

__int64 sub_1400118C0()
{
  char *v0; // rdi
  signed __int64 i; // rcx
  size_t v2; // rax
  size_t v3; // rax
  char v5; // [rsp+0h] [rbp-20h]
  int j; // [rsp+24h] [rbp+4h]
  char Str1; // [rsp+48h] [rbp+28h]
  unsigned __int64 v8; // [rsp+128h] [rbp+108h]

  v0 = &v5;
  for ( i = 82i64; i; --i )
  {
    *(_DWORD *)v0 = 3435973836;
    v0 += 4;
  }                                             // v0 貌似什么都没干
  for ( j = 0; ; ++j )
  {
    v8 = j;
    v2 = j_strlen(Str2);                        // Str2 = {hello_world} 长度 = 13
    if ( v8 > v2 )                              // v8 和 j 一样, 是循环计数器
      break;
    if ( Str2[j] == 'o' )                       // 把 Str2 字符串里面的英文字母 o 替换成数字 0
      Str2[j] = '0';
  }
  printf("input the flag:");
  scanf("%20s", &Str1);
  v3 = j_strlen(Str2);                          // 如果输入的 Str1 与替换字母之后的 Str2 完全一样的话, 就输出这个是正确的 flag
  if ( !strncmp(&Str1, Str2, v3) )
    printf("this is the right flag!\n");
  else
    printf("wrong flag\n");
  sub_14001113B((__int64)&v5, (__int64)&unk_140019D00);// 不知道干啥用的, 应该是退出程序之类的
  return 0i64;
}

flag{hell0_w0rld}