HACKCTF - Welcome_REV

2020. 7. 11. 13:53CTF's Write-up

 

문제화면

 

해당 파일을 받아서 파일에 대해서 알아보면

 

file welcome_rev

 

32비트 파일인것을 확인합니다.

이를 실행시켜보면

 

실행화면

 

실행하면 password!를 제공해달라고합니다.

 

실행화면

 

인자로 값을 넣어주면 맞는지 아닌지 확인 후에 결과를 알려주는군요.

이를 ida로 분석해보면

 

main함수

 

8번쨰 줄에 check_password라는 함수가 있습니다.

이를 따라 들어가보면

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
cint __cdecl check_password(char *a1)
{
  void *v1; // esp
  int v2; // eax
  int v3; // eax
  int v4; // eax
  int v5; // eax
  int v6; // eax
  int v7; // eax
  int v8; // eax
  int v9; // eax
  int v10; // eax
  int v11; // eax
  int v13; // [esp+0h] [ebp-48h]
  char *s; // [esp+Ch] [ebp-3Ch]
  int v15; // [esp+10h] [ebp-38h]
  int v16; // [esp+14h] [ebp-34h]
  int i; // [esp+18h] [ebp-30h]
  int v18; // [esp+1Ch] [ebp-2Ch]
  size_t n; // [esp+20h] [ebp-28h]
  int v20; // [esp+24h] [ebp-24h]
  char *s1; // [esp+28h] [ebp-20h]
  int v22; // [esp+2Ch] [ebp-1Ch]
  int v23; // [esp+30h] [ebp-18h]
  int v24; // [esp+34h] [ebp-14h]
  unsigned int v25; // [esp+38h] [ebp-10h]
  unsigned int v26; // [esp+3Ch] [ebp-Ch]
 
  s = a1;
  v26 = __readgsdword(0x14u);
  v18 = strlen(a1);
  n = 4 * ((v18 + 2/ 3);
  v20 = 4 * ((v18 + 2/ 3);
  v1 = alloca(16 * ((4 * ((v18 + 2/ 3+ 16/ 0x10u));
  s1 = (char *)&v13;
  v15 = 0;
  v16 = 0;
  while ( v15 < v18 )
  {
    if ( v15 >= v18 )
    {
      v3 = 0;
    }
    else
    {
      v2 = v15++;
      v3 = (unsigned __int8)s[v2];
    }
    v22 = v3;
    if ( v15 >= v18 )
    {
      v5 = 0;
    }
    else
    {
      v4 = v15++;
      v5 = (unsigned __int8)s[v4];
    }
    v23 = v5;
    if ( v15 >= v18 )
    {
      v7 = 0;
    }
    else
    {
      v6 = v15++;
      v7 = (unsigned __int8)s[v6];
    }
    v24 = v7;
    v25 = (v23 << 8+ (v22 << 16+ v7;
    v8 = v16++;
    s1[v8] = alphabet[(v25 >> 18& 0x3F];
    v9 = v16++;
    s1[v9] = alphabet[(v25 >> 12& 0x3F];
    v10 = v16++;
    s1[v10] = alphabet[(v25 >> 6& 0x3F];
    v11 = v16++;
    s1[v11] = alphabet[v25 & 0x3F];
  }
  for ( i = 0; mod[v18 % 3> i; ++i )
    s1[n - 1 - i] = 61;
  return strncmp(s1, "SGFja0NURnt3M2xjMG0zXzcwX3IzdjNyNTFuNl93MHJsZEBfQCFfIX0=", n);
}
cs

 

위와 같은 코드를 발견할 수 있습니다.

많은 계산이 진행된 후 마지막에 SGFSGFja0NURnt3M2xjMG0zXzcwX3IzdjNyNTFuNl93MHJsZEBfQCFfIX0= 를 출력해주는데 이게 FLAG같은 느낌이 들고, "="을 보아서 base64 디코딩을 해보면

 

 

FLAG확인

위와 같이 FLAG를 획득할 수 있습니다.

'CTF's Write-up' 카테고리의 다른 글

HACKCTF - BF  (0) 2020.07.13
HACKCTF - Who am I?  (0) 2020.07.12
HACKCTF - x64 Buffer Overflow  (0) 2020.07.10
HACKCTF - Button  (0) 2020.07.09
HACKCTF - Home  (0) 2020.07.09