CTF/리버싱

[2020CCE] Simple Botnet - 리버싱 / IDA

SecurityMan 2022. 10. 11. 11:00

 

2020년에 진행된 국정원 주최 사이버공격방어대회

 

오랫동안 컴퓨터에 당시 문제들을 묵혀놨다가 이제야 풀이 포스팅을 해본다.

 

당시는 거의 이런 대회에 나가본게 처음이라, 시간에 쫒겨서 캡쳐를 제대로 못한 부분이 많다.

 

 

Simple botnet 이라는 첫번째 리버싱 문제이다.

 

simple_botnet 이라는 이름의 바이너리 파일이 하나 주어진다.

 

 

file 명령어로 확인해보면

 

ELF 파일은 것을 알 수 있다.

 

ELF 는 리눅스 환경에서 실행가능한 파일이다.

 

 

한번 실행시켜 봤는데

 

아무런 동작도 없이 바로 프로그램이 종료된다.

 

 

자세히 보기위해 IDA 라는 디스어셈블러를 이용해

 

주어진 바이너리를 열어보았다.

 

main 함수의 수도코드를 한번 천천히 살펴보았다.

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  unsigned int v4; // eax
  unsigned int v5; // [rsp+1Ch] [rbp-4F4h]
  int v6; // [rsp+20h] [rbp-4F0h]
  int v7; // [rsp+24h] [rbp-4ECh]
  int v8; // [rsp+28h] [rbp-4E8h]
  __int64 v9; // [rsp+2Eh] [rbp-4E2h] BYREF
  char s[10]; // [rsp+36h] [rbp-4DAh] BYREF
  char v11[32]; // [rsp+40h] [rbp-4D0h] BYREF
  char v12[32]; // [rsp+60h] [rbp-4B0h] BYREF
  char v13[128]; // [rsp+80h] [rbp-490h] BYREF
  char s1[1032]; // [rsp+100h] [rbp-410h] BYREF
  unsigned __int64 v15; // [rsp+508h] [rbp-8h]

  v15 = __readfsqword(0x28u);
  if ( argc != 3 )
    return -1;
  v4 = atoi(argv[2]);
  v5 = connection_establish(argv[1], v4);
  if ( v5 != -1 )
  {
    strcpy(s, "run_shell");
    strcpy(v11, "send_client_info");
    strcpy(v12, "recv_server_info");
    v9 = 0x216465646E616CLL;
    memset(s1, 0, 0x400uLL);
    v6 = strlen(s);
    v7 = strlen(v11);
    v8 = strlen(v12);
    do_send(v5, &v9, 7LL);
    do_recv(v5, s1, 1023LL);
    if ( !strncmp(s1, "run_shell", v6) )
    {
      system(&s1[v6]);
    }
    else if ( !strncmp(s1, "send_client_info", v7) )
    {
      do_send(v5, "simple_bot v1.0", 15LL);
    }
    else if ( !strncmp(s1, "recv_server_info", v8) )
    {
      memset(v13, 0, sizeof(v13));
      do_recv(v5, v13, 127LL);
      if ( !strncmp(v13, "cce2020{", 4uLL)
        && v13[40] == 125
        && !strncmp(&v13[8], "2fe4b7f474e34cbc", 0x10uLL)
        && !strncmp(&v13[24], "ad5672dc66488ba3", 0x10uLL) )
      {
        do_send(v5, "success to validate for server", 30LL);
      }
    }
    sleep(0xAu);
  }
  return -1;
}

 

이 부분이 main 함수의 코드인데

 

딱 봐도 눈에 띄는 부분이 보인다.

 

 

바로 아래쪽에 있는 이 조건문이다.

 

v13 변수를 어떤 문자열과 단순히 strncmp 하고 있는데,

 

cce2020{ 이라는 플래그 포맷이 있는걸 보면 이 부분이 플래그 인듯 하다.

 

v13이 cce2020{ 이고,

 

v13[8] 이 2fe4b7f474e34cbc 이고,

 

v13[24] 가 ad5672dc66488ba3이고,

 

마지막으로 v13[40] 이 125 면 되는데

 

 

사실 125는 ASCII 코드로 } 를 의미한다.

 

v13 변수의 인덱스와 비교하는 문자열의 갯수를 비교해보면

 

결국 플래그는 cce2020{2fe4b7f474e34cbcad5672dc66488ba3} 인것을 알 수 있다.

반응형