제리의 블로그

picoCTF 2018 be-quick-or-be-dead-1 Reversing 본문

CTF/reversing

picoCTF 2018 be-quick-or-be-dead-1 Reversing

j3rrry 2018. 9. 30. 11:59
void header()
{
  unsigned int i; // [sp+Ch] [bp-4h]@1

  puts("Be Quick Or Be Dead 1");
  for ( i = 0; i <= 0x14; ++i )
    putchar('=');
  puts("\n");
}

void __noreturn alarm_handler()
{
  puts("You need a faster machine. Bye bye.");
  exit(0);
}

void set_timer()
{
  if ( __sysv_signal(SIGALRM, (__sighandler_t)alarm_handler) == (__sighandler_t)-1 )
  {
    printf(
      "\n\nSomething went terribly wrong. \nPlease contact the admins with \"be-quick-or-be-dead-1.c:%d\".\n",
      59LL);
    exit(0);
  }
  alarm(1);
}

void get_key()
{
  puts("Calculating key...");
  key = calculate_key();
  puts("Done calculating key");
}

void print_flag()
{
  puts("Printing flag:");
  decrypt_flag(key);
  puts(&flag);
}

int __cdecl main(int argc, const char **argv, const char **envp)
{
  header();
  set_timer();
  get_key();
  print_flag();
  return 0;
}
바이너리를 주는데
분석 해보면 위와 같이 된다.

alarm(1); 로 세팅해놓고
SIGALRM 이 울리면 종료하게 만들었다.

키값을 복호화하는 알고리즘을 분석할 필요 없이
바이너리 패치로 alarm() 시간을 크게 하면 된다.




# ./be-quick-or-be-dead-1_patched
Be Quick Or Be Dead 1
=====================

Calculating key...
Done calculating key
Printing flag:
picoCTF{why_bother_doing_unnecessary_computation_27f28e71}


Comments