CTF/3SCTF2024

3SCTF2024) Find Spade 리버싱 문제

mitdog 2024. 7. 28. 10:01

일단 저 스페이드 문자는 실제로 유니코드 값으로 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