본문 바로가기

CTF

[Defcon 2016] Baby-re

 

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
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax@4
  __int64 v4; // rbx@4
  unsigned int v5; // [sp+0h] [bp-60h]@1
  unsigned int v6; // [sp+4h] [bp-5Ch]@1
  unsigned int v7; // [sp+8h] [bp-58h]@1
  unsigned int v8; // [sp+Ch] [bp-54h]@1
  unsigned int v9; // [sp+10h] [bp-50h]@1
  unsigned int v10; // [sp+14h] [bp-4Ch]@1
  unsigned int v11; // [sp+18h] [bp-48h]@1
  unsigned int v12; // [sp+1Ch] [bp-44h]@1
  unsigned int v13; // [sp+20h] [bp-40h]@1
  unsigned int v14; // [sp+24h] [bp-3Ch]@1
  unsigned int v15; // [sp+28h] [bp-38h]@1
  unsigned int v16; // [sp+2Ch] [bp-34h]@1
  unsigned int v17; // [sp+30h] [bp-30h]@1
  __int64 v18; // [sp+38h] [bp-28h]@1
 
  v18 = *MK_FP(__FS__, 40LL);
  printf("Var[0]: ", argv, envp);
  fflush(_bss_start);
  __isoc99_scanf("%d"&v5);
  printf("Var[1]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v6);
  printf("Var[2]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v7);
  printf("Var[3]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v8);
  printf("Var[4]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v9);
  printf("Var[5]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v10);
  printf("Var[6]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v11);
  printf("Var[7]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v12);
  printf("Var[8]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v13);
  printf("Var[9]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v14);
  printf("Var[10]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v15);
  printf("Var[11]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v16);
  printf("Var[12]: ");
  fflush(_bss_start);
  __isoc99_scanf("%d"&v17);
  if ( (unsigned __int8)CheckSolution(&v5) )
    printf("The flag is: %c%c%c%c%c%c%c%c%c%c%c%c%c\n", v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17);
  else
    puts("Wrong");
  result = 0;
  v4 = *MK_FP(__FS__, 40LL) ^ v18;
  return result;
}
cs

Defcon 2016 baby-re 해당 바이너리를 IDA로 본 모습입니다.

12번의 정수값을 입력받은 후 CheckSolution에서 루틴을 검사한 후에 맞다면 플래그를 출력하는 형식입니다.

CheckSolution 함수를 hexray로 볼려고 하면..

 

ㅠㅠ 안된다고 나옵니다

 

해당 함수를 보면 저렇게 쓰레기값이 군데군데 들어간걸 확인할 수 있습니다.

쓰레기 값이 중간중간 마다 들어가 있기에 hexray가 되지 않으므로 어셈보고 분석해도 되지만 함수가 꽤.. 길고 시간이 오래 걸리기 때문에 IDA의 기능을 활용하였습니다

 

여기서 주목해야할 기능은 C, U 명령어 입니다

먼저 CheckSolution 함수 전체를 드래그 해준 후에 U를 눌러 주시면

 

이런식으로 나옵니다.

다시 전체 드래그 해준 후에 C를 눌러 디스어셈 형태로 변환시켜줍니다. 

 

이렇게 코드가 변환되고 자연스럽게 쓰레기 코드는 byte형태로 변형되어 분석에 영향을 끼치지 않는 것을 확인했습니다.

하지만 현재 옆에 빨갛게 뜨면서 hexray와 그래픽뷰 기능도 아예 안되는 상황이 발생합니다.

코드가 새로 만들어지고 함수가 인식이 안됐기 때문에 이런현상이 발생하는데 이때는 P 를 눌러서 함수를 인식해주게 하면 됩니다.

그렇다면 hexray를 진행해봅시당

 

[CheckSolution Decompile View]

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
void __fastcall CheckSolution(__int64 a1)
{
  __int64 v1; // rsi@14
 
  if ( 39342 * *(_DWORD *)(a1 + 44)
     + 21090 * *(_DWORD *)(a1 + 40)
     + 14626 * *(_DWORD *)(a1 + 36)
     + 57693 * *(_DWORD *)(a1 + 32)
     + 16388 * *(_DWORD *)(a1 + 28)
     + 29554 * *(_DWORD *)(a1 + 24)
     + 43166 * *(_DWORD *)(a1 + 20)
     + 50633 * *(_DWORD *)(a1 + 16)
     + 37485 * *(_DWORD *)a1
     - 21621 * *(_DWORD *)(a1 + 4)
     - 1874 * *(_DWORD *)(a1 + 8)
     - 46273 * *(_DWORD *)(a1 + 12)
     + 54757 * *(_DWORD *)(a1 + 48== 21399379
    && 22599 * *(_DWORD *)(a1 + 20)
     + 14794 * *(_DWORD *)(a1 + 16)
     + 38962 * *(_DWORD *)(a1 + 12)
     + 50936 * *(_DWORD *)a1
     + 4809 * *(_DWORD *)(a1 + 4)
     - 6019 * *(_DWORD *)(a1 + 8)
     - 837 * *(_DWORD *)(a1 + 24)
     - 36727 * *(_DWORD *)(a1 + 28)
     - 50592 * *(_DWORD *)(a1 + 32)
     - 11829 * *(_DWORD *)(a1 + 36)
     - 20046 * *(_DWORD *)(a1 + 40)
     - 9256 * *(_DWORD *)(a1 + 44)
     + 53228 * *(_DWORD *)(a1 + 48== 1453872
    && 5371 * *(_DWORD *)(a1 + 44)
     + 42654 * *(_DWORD *)(a1 + 40)
     + 17702 * *(_DWORD *)(a1 + 32)
     + 26907 * *(_DWORD *)(a1 + 12)
     + -38730 * *(_DWORD *)a1
     + 52943 * *(_DWORD *)(a1 + 4)
     - 16882 * *(_DWORD *)(a1 + 8)
     - 44446 * *(_DWORD *)(a1 + 16)
     - 18601 * *(_DWORD *)(a1 + 20)
     - 65221 * *(_DWORD *)(a1 + 24)
     - 47543 * *(_DWORD *)(a1 + 28)
     - 33910 * *(_DWORD *)(a1 + 36)
     + 11469 * *(_DWORD *)(a1 + 48== -5074020
    && 8621 * *(_DWORD *)(a1 + 40)
     + 34805 * *(_DWORD *)(a1 + 28)
     + 10649 * *(_DWORD *)(a1 + 24)
     + 54317 * *(_DWORD *)(a1 + 16)
     + 57747 * *(_DWORD *)a1
     - 23889 * *(_DWORD *)(a1 + 4)
     - 26016 * *(_DWORD *)(a1 + 8)
     - 25170 * *(_DWORD *)(a1 + 12)
     - 32337 * *(_DWORD *)(a1 + 20)
     - 9171 * *(_DWORD *)(a1 + 32)
     - 22855 * *(_DWORD *)(a1 + 36)
     - 634 * *(_DWORD *)(a1 + 44)
     - 11864 * *(_DWORD *)(a1 + 48== -5467933
    && 15578 * *(_DWORD *)(a1 + 44)
     + 43186 * *(_DWORD *)(a1 + 36)
     + 28134 * *(_DWORD *)(a1 + 32)
     + 54889 * *(_DWORD *)(a1 + 16)
     + 34670 * *(_DWORD *)(a1 + 12)
     + 43964 * *(_DWORD *)(a1 + 8)
     + -14005 * *(_DWORD *)a1
     + 16323 * *(_DWORD *)(a1 + 4)
     - 6141 * *(_DWORD *)(a1 + 20)
     - 35427 * *(_DWORD *)(a1 + 24)
     - 61977 * *(_DWORD *)(a1 + 28)
     - 59676 * *(_DWORD *)(a1 + 40)
     + 50082 * *(_DWORD *)(a1 + 48== 7787144
    && 10305 * *(_DWORD *)(a1 + 44)
     + 29341 * *(_DWORD *)(a1 + 40)
     + 13602 * *(_DWORD *)(a1 + 28)
     + 39603 * *(_DWORD *)(a1 + 24)
     + 13608 * *(_DWORD *)(a1 + 8)
     + -40760 * *(_DWORD *)a1
     - 22014 * *(_DWORD *)(a1 + 4)
     - 4946 * *(_DWORD *)(a1 + 12)
     - 26750 * *(_DWORD *)(a1 + 16)
     - 31708 * *(_DWORD *)(a1 + 20)
     - 59055 * *(_DWORD *)(a1 + 32)
     - 32738 * *(_DWORD *)(a1 + 36)
     - 15650 * *(_DWORD *)(a1 + 48== -8863847
    && 16047 * *(_DWORD *)(a1 + 36)
     + 55241 * *(_DWORD *)(a1 + 28)
     + 13477 * *(_DWORD *)(a1 + 8)
     + -47499 * *(_DWORD *)a1
     + 57856 * *(_DWORD *)(a1 + 4)
     - 10219 * *(_DWORD *)(a1 + 12)
     - 5032 * *(_DWORD *)(a1 + 16)
     - 21039 * *(_DWORD *)(a1 + 20)
     - 29607 * *(_DWORD *)(a1 + 24)
     - 6065 * *(_DWORD *)(a1 + 32)
     - 4554 * *(_DWORD *)(a1 + 40)
     - 2262 * *(_DWORD *)(a1 + 44)
     + 18903 * *(_DWORD *)(a1 + 48== -747805
    && 41178 * *(_DWORD *)(a1 + 44)
     + 47909 * *(_DWORD *)(a1 + 28)
     + 53309 * *(_DWORD *)(a1 + 24)
     + -65419 * *(_DWORD *)a1
     + 17175 * *(_DWORD *)(a1 + 4)
     - 9410 * *(_DWORD *)(a1 + 8)
     - 22514 * *(_DWORD *)(a1 + 12)
     - 52377 * *(_DWORD *)(a1 + 16)
     - 9235 * *(_DWORD *)(a1 + 20)
     - 59111 * *(_DWORD *)(a1 + 32)
     - 41289 * *(_DWORD *)(a1 + 36)
     - 24422 * *(_DWORD *)(a1 + 40)
     - 23447 * *(_DWORD *)(a1 + 48== -11379056
    && 15699 * *(_DWORD *)(a1 + 40)
     + 58551 * *(_DWORD *)(a1 + 20)
     + 46767 * *(_DWORD *)(a1 + 16)
     + 33381 * *(_DWORD *)(a1 + 12)
     + 1805 * *(_DWORD *)a1
     + 4135 * *(_DWORD *)(a1 + 4)
     - 16900 * *(_DWORD *)(a1 + 8)
     - 34118 * *(_DWORD *)(a1 + 24)
     - 44920 * *(_DWORD *)(a1 + 28)
     - 11933 * *(_DWORD *)(a1 + 32)
     - 20530 * *(_DWORD *)(a1 + 36)
     - 36597 * *(_DWORD *)(a1 + 44)
     + 18231 * *(_DWORD *)(a1 + 48== -166140
    && 10788 * *(_DWORD *)(a1 + 40)
     + 18975 * *(_DWORD *)(a1 + 36)
     + 15033 * *(_DWORD *)(a1 + 32)
     + 42363 * *(_DWORD *)(a1 + 28)
     + 47052 * *(_DWORD *)(a1 + 24)
     + 41284 * *(_DWORD *)(a1 + 12)
     + -42941 * *(_DWORD *)a1
     + 61056 * *(_DWORD *)(a1 + 4)
     - 45169 * *(_DWORD *)(a1 + 8)
     - 1722 * *(_DWORD *)(a1 + 16)
     - 26423 * *(_DWORD *)(a1 + 20)
     - 33319 * *(_DWORD *)(a1 + 44)
     + 63680 * *(_DWORD *)(a1 + 48== 9010363
    && 30753 * *(_DWORD *)(a1 + 40)
     + 22613 * *(_DWORD *)(a1 + 36)
     + 58786 * *(_DWORD *)(a1 + 28)
     + 12587 * *(_DWORD *)(a1 + 24)
     + 12746 * *(_DWORD *)(a1 + 20)
     + -37085 * *(_DWORD *)a1
     - 51590 * *(_DWORD *)(a1 + 4)
     - 17798 * *(_DWORD *)(a1 + 8)
     - 10127 * *(_DWORD *)(a1 + 12)
     - 52388 * *(_DWORD *)(a1 + 16)
     - 8269 * *(_DWORD *)(a1 + 32)
     - 20853 * *(_DWORD *)(a1 + 44)
     + 32216 * *(_DWORD *)(a1 + 48== -4169825
    && 57612 * *(_DWORD *)(a1 + 44)
     + 47348 * *(_DWORD *)(a1 + 36)
     + 48719 * *(_DWORD *)(a1 + 32)
     + 9228 * *(_DWORD *)(a1 + 20)
     + 65196 * *(_DWORD *)(a1 + 16)
     + 36650 * *(_DWORD *)a1
     + 47566 * *(_DWORD *)(a1 + 4)
     - 33282 * *(_DWORD *)(a1 + 8)
     - 59180 * *(_DWORD *)(a1 + 12)
     - 59599 * *(_DWORD *)(a1 + 24)
     - 62888 * *(_DWORD *)(a1 + 28)
     - 37592 * *(_DWORD *)(a1 + 40)
     + 40510 * *(_DWORD *)(a1 + 48== 4081505 )
  {
    *(_DWORD *)(a1 + 44);
    *(_DWORD *)(a1 + 36);
    *(_DWORD *)(a1 + 32);
    *(_DWORD *)(a1 + 28);
    *(_DWORD *)(a1 + 16);
    *(_DWORD *)(a1 + 12);
    *(_DWORD *)a1;
    *(_DWORD *)(a1 + 4);
    *(_DWORD *)(a1 + 8);
    *(_DWORD *)(a1 + 20);
    *(_DWORD *)(a1 + 24);
    *(_DWORD *)(a1 + 40);
    *(_DWORD *)(a1 + 48);
  }
  v1 = *MK_FP(__FS__, 40LL) ^ *MK_FP(__FS__, 40LL);
  JUMPOUT(locret_4025E6);
}
cs

 깔끔하게 디컴파일이 완료 되었습니다~~!

CheckSolution 함수에서는 12차 연립방정식을 이용해 루틴을 비교하네요

이럴때는 z3 module 을 이용해서 풀 수 있습니다.

 

[babyre_z3_solve]

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
from z3 import *
 
= Solver()
flag = [Int("flag[%d]" %i) for i in range(13)]
 
for i in range(13):
    s.add(flag[i] < 127)
    s.add(flag[i] >= 32)
 
s.add(22599 * flag[5]
     + 14794 * flag[4]
     + 38962 * flag[3]
     + 50936 * flag[0]
     + 4809 * flag[1]
     - 6019 * flag[2]
     - 837 * flag[6]
     - 36727 * flag[7]
     - 50592 * flag[8]
     - 11829 * flag[9]
     - 20046 * flag[10]
     - 9256 * flag[11]
     + 53228 * flag[12== 1453872)
  
s.add(5371 * flag[11]
     + 42654 * flag[10]
     + 17702 * flag[8]
     + 26907 * flag[3]
     + -38730 * flag[0]
     + 52943 * flag[1]
     - 16882 * flag[2]
     - 44446 * flag[4]
     - 18601 * flag[5]
     - 65221 * flag[6]
     - 47543 * flag[7]
     - 33910 * flag[9]
     + 11469 * flag[12== -5074020)
  
s.add(8621 * flag[10]
     + 34805 * flag[7]
     + 10649 * flag[6]
     + 54317 * flag[4]
     + 57747 * flag[0]
     - 23889 * flag[1]
     - 26016 * flag[2]
     - 25170 * flag[3]
     - 32337 * flag[5]
     - 9171 * flag[8]
     - 22855 * flag[9]
     - 634 * flag[11]
     - 11864 * flag[12== -5467933)
  
s.add(15578 * flag[11]
       + 43186 * flag[9]
       + 28134 * flag[8]
       + 54889 * flag[4]
       + 34670 * flag[3]
       + 43964 * flag[2]
       + -14005 * flag[0]
       + 16323 * flag[1]
       - 6141 * flag[5]
       - 35427 * flag[6]
       - 61977 * flag[7]
       - 59676 * flag[10]
       + 50082 * flag[12== 7787144)
  
s.add(10305 * flag[11]
       + 29341 * flag[10]
       + 13602 * flag[7]
       + 39603 * flag[6]
       + 13608 * flag[2]
       + -40760 * flag[0]
       - 22014 * flag[1]
       - 4946 * flag[3]
       - 26750 * flag[4]
       - 31708 * flag[5]
       - 59055 * flag[8]
       - 32738 * flag[9]
       - 15650 * flag[12== -8863847)
  
s.add(16047 * flag[9]
       + 55241 * flag[7]
       + 13477 * flag[2]
       + -47499 * flag[0]
       + 57856 * flag[1]
       - 10219 * flag[3]
       - 5032 * flag[4]
       - 21039 * flag[5]
       - 29607 * flag[6]
       - 6065 * flag[8]
       - 4554 * flag[10]
       - 2262 * flag[11]
       + 18903 * flag[12== -747805 )
  
s.add(41178 * flag[11]
       + 47909 * flag[7]
       + 53309 * flag[6]
       + -65419 * flag[0]
       + 17175 * flag[1]
       - 9410 * flag[2]
       - 22514 * flag[3]
       - 52377 * flag[4]
       - 9235 * flag[5]
       - 59111 * flag[8]
       - 41289 * flag[9]
       - 24422 * flag[10]
       - 23447 * flag[12== -11379056)
  
s.add(15699 * flag[10]
      + 58551 * flag[5]
      + 46767 * flag[4]
      + 33381 * flag[3]
      + 1805 * flag[0]
      + 4135 * flag[1]
      - 16900 * flag[2]
      - 34118 * flag[6]
      - 44920 * flag[7]
      - 11933 * flag[8]
      - 20530 * flag[9]
      - 36597 * flag[11]
      + 18231 * flag[12== -166140)
  
s.add(10788 * flag[10]
       + 18975 * flag[9]
       + 15033 * flag[8]
       + 42363 * flag[7]
       + 47052 * flag[6]
       + 41284 * flag[3]
       + -42941 * flag[0]
       + 61056 * flag[1]
       - 45169 * flag[2]
       - 1722 * flag[4]
       - 26423 * flag[5]
       - 33319 * flag[11]
       + 63680 * flag[12== 9010363)
  
s.add(30753 * flag[10]
    + 22613 * flag[9]
    + 58786 * flag[7]
    + 12587 * flag[6]
    + 12746 * flag[5]
    + -37085 * flag[0]
    - 51590 * flag[1]
    - 17798 * flag[2]
    - 10127 * flag[3]
    - 52388 * flag[4]
    - 8269 * flag[8]
    - 20853 * flag[11]
    + 32216 * flag[12== -4169825)
  
s.add(57612 * flag[11]
    + 47348 * flag[9]
    + 48719 * flag[8]
    + 9228 * flag[5]
    + 65196 * flag[4]
    + 36650 * flag[0]
    + 47566 * flag[1]
    - 33282 * flag[2]
    - 59180 * flag[3]
    - 59599 * flag[6]
    - 62888 * flag[7]
    - 37592 * flag[10]
    + 40510 * flag[12== 4081505)
  
s.add(25633 * flag[11]
    + 25252 * flag[9]
    + 28153 * flag[8]
    + 26517 * flag[7]
    + 59511 * flag[4]
    + 4102 * flag[3]
    + 51735 * flag[0]
    + 35879 * flag[1]
    - 63890 * flag[2]
    - 21386 * flag[5]
    - 20769 * flag[6]
    - 43789 * flag[10]
    + 7314 * flag[12== 1788229)
 
print s.check()
print s.model()
 
cs

 

 

 

'CTF' 카테고리의 다른 글

[Codegate 2017] angrybird  (0) 2018.01.30
[SECCON 2017] JPEG file  (0) 2018.01.20
[CSAW CTF 2017] tableEZ  (0) 2018.01.16
[Christmas CTF 2017] Simple_Bit  (2) 2018.01.10
TUCTF 2016 Reverse for the Holy Grail  (0) 2017.12.30