BUUCTF reverse:reverse1

1.查壳
BUUCTF reverse:reverse1_第1张图片无壳,64位文件
2.IDA分析
shift+F12查找字符串
BUUCTF reverse:reverse1_第2张图片发现关键字符串
BUUCTF reverse:reverse1_第3张图片
进入其所在函数中

__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 = -858993460;
    v0 += 4;
  }
  for ( j = 0; ; ++j )
  {
    v8 = j;
    v2 = j_strlen(Str2);
    if ( v8 > v2 )
      break;
    if ( Str2[j] == 111 )
      Str2[j] = 48;
  }
  sub_1400111D1("input the flag:");
  sub_14001128F("%20s", &Str1);
  v3 = j_strlen(Str2);
  if ( !strncmp(&Str1, Str2, v3) )
    sub_1400111D1("this is the right flag!\n");
  else
    sub_1400111D1("wrong flag\n");
  sub_14001113B(&v5, &unk_140019D00);
  return 0i64;
}
if ( !strncmp(&Str1, Str2, v3) )

这一行代码将我们输入的flag与str2作比较,如果相等则输出“this is the right flag!”
双击str2进入,str2为{hello_world}
但还需要注意上面的代码

for ( j = 0; ; ++j )
  {
    v8 = j;
    v2 = j_strlen(Str2);
    if ( v8 > v2 )
      break;
    if ( Str2[j] == 'o' )
      Str2[j] = '0';
  }

这一块代码将Str2中的‘o’替换为‘0’
所以正确的flag应该为{hell0_w0rld}

你可能感兴趣的:(CTF)