Reverse|Buuctf reverse1

发布时间 2023-05-06 14:31:51作者: scarecr0w7

查看程序信息

Detect It Easy查看程序信息,发现是64位应用且未加壳

反编译文件

使用IDA打开,shift+f12检索程序里的字符串,发现this is the right flag!,双击查看,发现被main_0函数引用

双击main_0函数查看

F5查看伪代码

int __cdecl main_0(int argc, const char **argv, const char **envp)
{
  char *v3; // rdi
  __int64 i; // rcx
  size_t v5; // rax
  char v7; // [rsp+0h] [rbp-20h] BYREF
  int j; // [rsp+24h] [rbp+4h]
  char Str1[224]; // [rsp+48h] [rbp+28h] BYREF
  __int64 v10; // [rsp+128h] [rbp+108h]

  v3 = &v7;
  for ( i = 82i64; i; --i )
  {
    *(_DWORD *)v3 = -858993460;
    v3 += 4;
  }
  for ( j = 0; ; ++j )
  {
    v10 = j;
    if ( j > j_strlen(Str2) )
      break;
    if ( Str2[j] == 111 )
      Str2[j] = 48;
  }
  sub_1400111D1("input the flag:");
  sub_14001128F("%20s", Str1);
  v5 = j_strlen(Str2);
  if ( !strncmp(Str1, Str2, v5) )
    sub_1400111D1("this is the right flag!\n");
  else
    sub_1400111D1("wrong flag\n");
  return 0;
}

通过 if ( !strncmp(Str1, Str2, v5) ),可以发现当输入的字符str1与预定的字符str2相等就为正确的flag
双击str2发现str2为{hello_world},所以flag为{hello_world},但是输入提示错误

再查看伪代码发现以下代码,这里将str2中的111替换为了48,这里看不懂111和48是什么

if ( Str2[j] == 111 )
      Str2[j] = 48;

这是111和48为int,是asicc码,使用快捷键R转换一下

可以看出这里是将o替换为了0,所以可以得出flag

flag{hell0_w0rld}