WolvCTF 2023 - child-re (rev)

You’ve graduated from baby, congrats!

  • [141 solves / 100 points]

리버싱 문제에서 솔브가 가장 많아서 도전해봤다.

Analysis

main을 살펴보면 플래그는 어디엔가 있다고 한다. 문자열 검색으로는 보이지 않고 함수 목록을 살펴보면 아래와 같은 함수가 보인다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int __fastcall sub_1165(char a1)
{
char v2[43]; // [rsp+10h] [rbp-60h] BYREF
char s[42]; // [rsp+40h] [rbp-30h] BYREF
char v4; // [rsp+6Ah] [rbp-6h]
int i; // [rsp+6Ch] [rbp-4h]

memset(s, 0, sizeof(s));
v4 = 0;
strcpy(v2, "]I^LQb\x1B^IBB\x1BA\x19X\x1Fum_\x1BN\x19u^\x1Au^B\x19um\x1EF\x1ERS\v\vu\x1E\x18W");
for ( i = 0; i <= 41; ++i )
s[i] = a1 ^ v2[i];
return puts(s);
}

원래 strcpy가 보이지 않았는데 변수들 자료형이나 배열 크기를 조절해주니까 보였다. 뭔가 puts 함수를 통해 flag를 출력해준다고 생각해서 저 함수만 따로 실행시켜보기로 했다.

Solve

아래와 같이 코드를 작성해주고 컴파일 후 실행하면..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1.c
#include <stdio.h>
#include <stdlib.h>

/*char v2[43]; // [rsp+10h] [rbp-60h] BYREF*/
char* v2;
char s[42]; // [rsp+40h] [rbp-30h] BYREF
char v4; // [rsp+6Ah] [rbp-6h]
int i; // [rsp+6Ch] [rbp-4h]

int main() {
/*memset(s, 0, sizeof(s));*/
v4 = 0;
v2 = "]I^LQb\x1B^IBB\x1B\x41\x19X\x1Fum_\x1BN\x19u^\x1Au^B\x19um\x1E\x46\x1ERS\v\vu\x1E\x18W";
char a1 = 42;
for ( i = 0; i <= 41; ++i )
s[i] = a1 ^ v2[i];

puts(s);
}

flag가 짠! 하고 나온다.

Flag

1
wctf{H1tchh1k3r5_Gu1d3_t0_th3_G4l4xy!!_42}