일단 저 스페이드 문자는 실제로 유니코드 값으로 0x2660이다.
그리고 아래 식들을 보면, 한 줄당 하나의 알파벳의 값을 구할 수 있음을 알 수 있다.
그리고 Flag는 해당 알파벳들을 순서대로 나열하고 아스키 코드값으로 바꾸면 된다는 것을 명시해 놓았다.
그래서 차례대로 알파벳을 계산해 보면(아래 파이썬 코드로 계산시켰다)
i = 1
cnt = 0
alphabets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
while cnt < 7:
if i + 0x25eb == 0x2660:
alphabets[0] = i
cnt += 1
if 0x2674 - i == 0x2660:
alphabets[1] = i
cnt += 1
if 0x26d1 - i == 0x2660:
alphabets[2] = i
cnt += 1
if (i * 0x72) - 0xf10 == 0x2660:
alphabets[3] = i
cnt += 1
if 0x200 * (i >> 1) + 0x1460 == 0x2660:
if not alphabets[5]:
alphabets[5] = i
cnt += 1
if 0x75 * (i << 4) - 0x34720 == 0x2660:
alphabets[6] = i
cnt += 1
if (i + 3) ^ 0x2635 == 0x2660:
alphabets[8] = i
cnt += 1
i += 1
i = 1
while cnt < 10:
if 0x25 * (i - alphabets[1]) + 0x195e == 0x2660:
alphabets[4] = i
cnt += 1
if alphabets[2] + i + 0x258e == 0x2660:
alphabets[7] = i
cnt += 1
if (i ^ alphabets[0]) + 0x2644 == 0x2660:
alphabets[9] = i
cnt += 1
i += 1
for a in alphabets:
print(chr(a), end=" | ")
print(a)
실행결과 :
u | 117
| 20
q | 113
x | 120
n | 110
| 18
x | 120
a | 97
R | 82
i | 105
?? 뭔가 말도 안되는 값들이 나온다. 그리고 이건 플래그가 아니었다.
일단 이건 리버싱 문제니까. 해당 exe파일을 리버싱해보았다. (기드라로 열었다)
int __cdecl _main(int _Argc,char **_Argv,char **_Env)
{
HANDLE pvVar1;
WCHAR local_96 [15];
int local_78 [25];
int local_14;
int *local_c;
local_c = &_Argc;
___main();
_setlocale(0,"");
local_78[0] = 0x1080;
local_78[1] = 0x2a00;
local_78[2] = 0x2900;
local_78[3] = 0x2c80;
local_78[4] = 0x2f80;
local_78[5] = 0x2c00;
local_78[6] = 0x1800;
local_78[7] = 0x2900;
local_78[8] = 0x2f80;
local_78[9] = 0x1800;
local_78[10] = 0x3c00;
local_78[11] = 0x1900;
local_78[12] = 0x1b80;
local_78[13] = 0x1080;
local_78[14] = 0;
for (local_14 = 0; local_14 < 0xf; local_14 = local_14 + 1) {
local_96[local_14] = (WCHAR)(local_78[local_14] >> 7);
}
pvVar1 = _CreateMutexW@12((LPSECURITY_ATTRIBUTES)0x0,0,local_96);
if (pvVar1 != (HANDLE)0x0) {
_wprintf(L"[+] ♠ == UNICODE(0x2660)\n\n");
_wprintf(L"[?] A + 0x25eb == ♠\n");
_wprintf(L"[?] 0x2674 - B == ♠\n");
_wprintf(L"[?] 0x26d1 - C == ♠\n");
_wprintf(L"[?] (D * 0x72) - 0xf10 == ♠\n");
_wprintf(L"[?] 0x25 * (E - B) + 0x195e == ♠\n");
_wprintf(L"[?] 0x200 * (F >> 1) + 0x1460 == ♠\n");
_wprintf(L"[?] 0x75 * (G << 4) - 0x34720 == ♠\n");
_wprintf(L"[?] C + H + 0x258e == ♠\n");
_wprintf(L"[?] (I + 3) ^ 0x2635 == ♠\n");
_wprintf(L"[?] (J ^ A) + 0x2644 == ♠\n\n");
_wprintf(L"[+] Flag: 3S{ASCII(ABCDEFGHIJ)}\n\n");
_system("pause");
}
return (uint)(pvVar1 == (HANDLE)0x0);
}
보면 local_78 이라는 배열에 특정 값들을 담고 local_96에 변환하여 넣어준다. 그래서 해당 값들을 한번 출력해 보았다. (거의 걍 복붙하고 local_96만 출력해 본 것)
#include <stdio.h>
#include <stdlib.h>
#define WCHAR wchar_t
int main()
{
WCHAR local_96 [15];
int local_78 [25];
int local_14;
int *local_c;
local_78[0] = 0x1080;
local_78[1] = 0x2a00;
local_78[2] = 0x2900;
local_78[3] = 0x2c80;
local_78[4] = 0x2f80;
local_78[5] = 0x2c00;
local_78[6] = 0x1800;
local_78[7] = 0x2900;
local_78[8] = 0x2f80;
local_78[9] = 0x1800;
local_78[10] = 0x3c00;
local_78[11] = 0x1900;
local_78[12] = 0x1b80;
local_78[13] = 0x1080;
local_78[14] = 0;
for (local_14 = 0; local_14 < 0xf; local_14 = local_14 + 1) {
local_96[local_14] = (WCHAR)(local_78[local_14] >> 7);
}
for(int i=0;i<0xf;i++) {
wprintf(L"%c", local_96[i]);
}
return 0;
}
출력해 보면,
? 0x27로 XOR 연산을 해보라고 한다!!!
그래서 아까 짰던 파이썬 코드 부분에서 마지막에 XOR 연산만 추가해서 출력하면,
for a in alphabets:
print(chr(a ^ 0x27), end=" | ")
print(a)
결과:
R | 117
3 | 20
V | 113
_ | 120
I | 110
5 | 18
_ | 120
F | 97
u | 82
N | 105
FLAG : 3S{R3V_I5_FuN}
'CTF > 3SCTF2024' 카테고리의 다른 글
3SCTF2024) 돈돈돈 쓰쓰쓰 돈돈돈 MISC문제 (0) | 2024.07.28 |
---|---|
3SCTF2024) DUM DUM :P 포렌식 문제 (0) | 2024.07.28 |