본문으로 바로가기

Brixel CTF winter edition

category CTF/CTF Playground 2021. 1. 6. 17:55

Programming :: Are you fast enough?

화면에 나오는 랜덤 문자열을 form에 넣어서 POST로 빨리 보내주면 된다.

Python으로 파싱하는게 편했겠지만 NodeJS 연습해보기 위해 아래와 같이 코드를 썼다.

서버가 느려서 플래그 가져오는 것도 여러번 시도해야 했다.

 

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
const request = require('request');
const cheerio = require('cheerio');

const URL = 'http://timesink.be/speedy/index.php';
var cookieJar = request.jar();

request.get(
    {
        urlURL,
        jarcookieJar
    },
    function (errresbody) {
        const $ = cheerio.load(body);
        var text = $('#rndstring').html();

        console.log('[+] string: '+text);

        request.post(
            {
                urlURL,
                jarcookieJar,
                form: {
                    inputfieldtext
                }
            },
            function (errresbody) {
                console.log(body);
            }
        );
    }
);

 

Flag: brixelCTF{sp33d_d3m0n}

 

Programming :: Keep walking...

간단한 점화식 코딩 문제다.

 

1
2
3
4
5
6
7
8
9
if __name__ == '__main__' :
    x = 1
    r = 1

    while x <= 525 :
        r = x*x + r + 3
        x += 1

    print(r)

 

Flag: 48373851

 

Programming :: A song...

주어진 텍스트 파일을 Rockstar로 돌리면 문자열(플래그)이 나온다.

 

Flag: brixelCTF{ 5 66 7236 34 66 14 }

 

Programming :: An arduino project

setup 함수의 주석을 보면 7 Segment Display에 2~9번 핀이 연결되어있다는 것을 눈치챌 수 있다.

tinkercad에서 시뮬레이션해서 숫자를 뽑았다.

 

 

Flag: 406798190332

 

Programming :: Quizbot

문제 순서가 똑같기 때문에 먼저 이상한 답을 넣어서 정답을 쭉 받아온 뒤 새로운 세션에서 정답을 1000개 넣으면 플래그를 얻을 수 있다.

 

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
const request = require('request');
const cheerio = require('cheerio');

const URL = 'http://timesink.be/quizbot/index.php';
var cookieJar = request.jar();

var answers = [];

function InitConnection() {
    return new Promise(function (resolvereject) {
        request.get(
            {
                urlURL,
                jarcookieJar
            },
            function (errresbody) {
                if (err) {
                    reject(0);
                }
                else if (res.statusCode != 200) {
                    reject(res.statusCode);
                }

                resolve();
            }
        );
    });
}

function SubmitAnswer(indexsubmit) {
    return new Promise(function (resolvereject) {
        request.post(
            {
                urlURL,
                jarcookieJar,
                form: {
                    insert_answersubmit
                }
            },
            function (errresbody) {
                if (err) {
                    reject(0);
                }
                else if (res.statusCode != 200) {
                    reject(res.statusCode);
                }
    
                const $ = cheerio.load(body);

                if ($('#answer').length != 0) {
                    var answer = $('#answer').html();
                    resolve(answer);
                }
                else {
                    if (index == 999) {
                        console.log(body);
                    }

                    resolve(1);
                }
            }
        );
    })
}

async function Main() {
    try {
        await InitConnection();
        console.log('[+] Connection established');

        for (var i=0 ; i<1000 ; i++) {
            var answer = await SubmitAnswer(i'');
            answers.push(answer);
            console.log('[+] Answer #'+(i+1).toString()+': '+answer);
        }

        cookieJar = request.jar();
        await InitConnection();
        console.log('[+] Connection established');

        for (var i=0 ; i<1000 ; i++) {
            var result = await SubmitAnswer(ianswers[i]);

            if (result === 1) {
                console.log('[+] Solved question #'+(i+1).toString());
            }
            else {
                console.log('[-] Something went wrong');
            }
        }
    } catch (code) {
        console.log('[-] Connection failed: '+code.toString());
    }
}

Main();

 

Flag: brixelCTF{kn0wl3dg3}

 

Forensics :: A message from space

SSTV decode 문제다. QSSTV를 사용해서 풀었으며 아래 링크를 참고했다.

(https://ourcodeworld.com/articles/read/956/how-to-convert-decode-a-slow-scan-television-transmissions-sstv-audio-file-to-images-using-qsstv-in-ubuntu-18-04)

 

 

Flag: brixelCTF{SP4C3L4B}

 

Forensics :: Lottery ticket

조작된 숫자를 전부 더하면 된다.

그림을 확대해 보면, 대부분의 숫자에 노이즈가 있는데 특정 숫자에는 노이즈가 없다.

 

fake
real

 

노이즈가 없는 숫자인 42(A4), 88(C2), 25(C3), 48(D4) 을 더하면 플래그가 된다.

 

Flag: 203

 

Forensics :: Lost evidence

이미지 파일이 주어진다. 해당 파일을 마운트하고 EaseUS로 리커버리를 돌리면 wav 파일 2개를 얻을 수 있다.

 

 

두 파일은 동일하기 때문에 하나만 가져와서 분석해도 된다.

소리를 들어보면 이체를 위해 이런저런 정보를 입력하고 65초부터 메시지를 입력하는 부분이 나온다. 해당 부분을 잘라내서 DTMF Tone에 따라 텍스트로 변환하면 "thx for the cocaine bruh" 문자열을 얻을 수 있다.

(GoldWave로 잘라내고 http://dialabc.com/sound/detect/index.html 에서 키값을 가져왔다.)

 

cocaine을 플래그 형식에 씌우면 정답 플래그가 된다.

 

Flag: brixelCTF{cocaine}

 

OSINT :: A quick search

images.google.com

 

Flag: Eben-Ezer

 

Reverse engineering / cracking :: Cookieee!

Cheat Engine

 

Flag: brixelCTF{m3m0ry}

 

Reverse engineering / cracking :: no peeking!

JetBrains dotPeek

 

Flag: brixelCTF{d0tP33K}

 

Reverse engineering / cracking :: registerme.exe

Visual Basic 6.0 리버싱 문제다.

VB Decompiler로 살펴보면 Form1에 3개의 함수가 있는데, 대충 어셈블리를 들여다 보면 Timer 함수에 뭔가 중요한 게 있어보인다.

 

.text:00402BA4                 mov     [ebp+var_34], offset aActivationKey ; "activation.key"
.text:00402BAB                 mov     [ebp+var_3C], 8
.text:00402BB2                 call    ds:__vbaVarDup
.text:00402BB8                 lea     edx, [ebp+path]
.text:00402BBB                 push    ebx             ; attributes
.text:00402BBC                 push    edx             ; path
.text:00402BBD                 call    ds:rtcDir
.text:00402BC3                 mov     edx, eax        ; src
.text:00402BC5                 lea     ecx, [ebp+dst]  ; dst
.text:00402BC8                 call    ds:__vbaStrMove
.text:00402BCE                 push    eax             ; _DWORD
.text:00402BCF                 push    offset dword_401BFC ; _DWORD
.text:00402BD4                 call    ds:__vbaStrCmp
.text:00402BDA                 mov     edi, eax
.text:00402BDC                 lea     ecx, [ebp+dst]
.text:00402BDF                 neg     edi
.text:00402BE1                 sbb     edi, edi
.text:00402BE3                 neg     edi
.text:00402BE5                 neg     edi
.text:00402BE7                 call    ds:__vbaFreeStr
.text:00402BED                 lea     ecx, [ebp+path]
.text:00402BF0                 call    ds:__vbaFreeVar
.text:00402BF6                 mov     eax, [esi]
.text:00402BF8                 cmp     di, bx
.text:00402BFB                 push    esi
.text:00402BFC                 jz      loc_402CA9

 

VB internal function에 대해서는 여기를 참고했다.

이 코드를 요약하면, Dir("activation.key") 를 호출하고 반환값을 길이가 0인 문자열과 비교해서 같다면 0x402CA9로 점프한다. 0x402CA9는 활성화가 실패했다는 로직을 포함하므로 Dir 함수의 반환값은 길이가 0이 아닌 문자열이 되어야 한다. 이는 프로그램 위치에 activation.key 파일을 하나 만들어 주는 것으로 해결할 수 있다.

 

파일 생성 후 프로그램을 실행하면 플래그를 얻을 수 있다.

 

 

Flag: brixelCTF{f1l34cc3ss}

 

Reverse engineering / cracking :: android app

jadx에서 appinventor.ai_kevin_erna.brixelCTF.Screen1 클래스 열면 Button1$Click 메소드에 플래그가 그대로 보인다.

 

Flag: brixelCTF{th3_4ndr0ids_y0u_4r3_l00k1ng_f0r}

 

Old tech :: punchcard

http://laighside.com/punchcard.htm

 

Flag: BRIXELCTF(M41NFR4M3)

 

Old tech :: Goodbye old friend

https://github.com/jindrapetrik/jpexs-decompiler

 

Flag: brixelCTF{n0_m0r3_5upp0rt}

 

Old tech :: The tape

wavprg로 테이프를 프로그램으로 변환한 뒤 CCS64에서 에뮬레이션하면 플래그가 나온다.

 

 

Flag: BASIC

 

Cryptography :: Sea code

THE FLAG FOR THIS CHALLENGE IS SEAGULL

 

Flag: SEAGULL

 

Cryptography :: Merde

Vigenère cipher, key=confidentel

 

Flag: brixelCTF{baguette}

 

Cryptography :: Merda

ROT13, amount=21

 

Flag: brixelCTF{pizzanapoli}

 

Cryptography :: s̸͖̾̀͊͠h̸̜̒ï̷̧̲͙̭̤͛͒̋t̷̢̲͚͖̑͜

BASE64 + Binary Conversion

 

Flag: brixelCTF{robocop}

 

Cryptography :: Scheiße

Abwehr Enigma G-312

Reflector: UKW, Ring=Z, Position=K

Rotor II, Ring=F, Position=L / Rotor I, Ring=P, Position=Q / Rotor III, Ring=A, Position=L

 

Der Flag ist Sauerkraut

 

Flag: Sauerkraut

 

Cryptography :: flawed

MD5 rainbow table decrypt

 

Flag: notsecure

 

Cryptography :: Don't be salty

MD5 bruteforce

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import binascii
import hashlib
import string

SALT = '04532@#!!'
HASH = b'\x2b\xaf\xea\x54\xca\xf6\xf8\xd7\x18\xbe\x0f\x23\x47\x93\xa9\xbe'

if __name__ == '__main__' :
    for v in range(26**5) :
        s = ''.join([string.ascii_lowercase[(v//(26**i))%26for i in range(5)][::-1])
        h = hashlib.md5((s+SALT).encode()).digest()

        if h == HASH :
            print(s)
            break

 

Flag: brute

 

Internet :: Easy

메인페이지의 소스에 주석으로 플래그가 달려있다.

 

Flag: brixelCTF{notsosecret}

 

Internet :: Hidden Code

Flag: mario

 

Internet :: robotopia

robots.txt

 

Flag: brixelCTF{sadr0b0tz}

 

 

Internet :: Discord

Flag: brixelCTF{th4nk5_f0r_r34d1ng_th3_rulz}

 

Internet :: login1

verify 함수에 플래그가 그대로 들어있다.

 

Flag: brixelCTF{w0rst_j4v4scr1pt_3v3r!}

 

Internet :: login2

login1 문제와 같은 형식이고 순서만 잘 맞춰주면 된다.

 

Flag: brixelCTF{st1ll_b4d_j4v45cr1pt_h3r3.18079054270}

 

Internet :: login3

password.txt

 

Flag: brixelCTF{n0t_3v3n_cl05e_t0_s3cur3!}

 

Internet :: login4

password.txt + BASE64

 

Flag: brixelCTF{even_base64_wont_make_you_secure}

 

Internet :: Browsercheck

User-Agent 헤더를 Mozilla/5.0 (compatible; Ask Jeeves/Teoma +http://about.ask.com/en/docs/about/webmasters.shtml) 로 바꾸고 요청을 보내면 플래그가 보인다.

 

Flag: brixelCTF{askwho?}

 

Internet :: Readme

Flag: freepoints

 

Internet :: SnackShack awards

options 태그에서 value를 5000으로 바꾼 뒤 투표하면 된다.

 

Flag: brixelCTF{bakpau}

 

Internet :: Flat earth

admin.php에서 username에 SQL Injection으로 항상 참을 만들어 주면 된다.

'OR'1'='1' -- 

 

Flag: brixelCTF{aroundtheglobe}

 

Internet :: Hiding in the background

메인페이지에 있는 svg 파일을 열어보면 플래그를 발견할 수 있다.

 

Flag: brixelCTF{happy_holidays}

 

Internet :: login5

난독화가 가볍게 적용되어 있어서 하나하나 풀 수 있다.

난독화를 해제한 코드는 다음과 같다.

 

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
function verify() {
    password = document.getElementById('get_password').value,
    alphabet = 'abcdefghijklmnopqrstuvwxyz1234567890!{}',
    newpassword = alphabet.substr(0x10x1),
    newpassword = newpassword + alphabet.substr(0x110x1),
    newpassword = newpassword + alphabet.substr(0x80x1),
    newpassword = newpassword + alphabet.substr(0x170x1),
    newpassword = newpassword + alphabet.substr(0x40x1),
    newpassword = newpassword + alphabet.substr(0xb0x1),
    newpassword = newpassword + alphabet.substr(0x20x1),
    newpassword = newpassword + alphabet.substr(0x13,0x1),
    newpassword = newpassword + alphabet.substr(0x50x1),
    newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x20x1),
    newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x40x1),
    newpassword = newpassword + alphabet.substr(0x10x1),
    newpassword = newpassword + alphabet.substr(0x50x1),
    newpassword = newpassword + alphabet.substr(0x140x1),
    newpassword = newpassword + alphabet.substr(0x120x1),
    newpassword = newpassword + alphabet.substr(0x20x1),
    newpassword = newpassword + alphabet.substr(0x00x1),
    newpassword = newpassword + alphabet.substr(0x130x1),
    newpassword = newpassword + alphabet.substr(0x80x1),
    newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x40x1),
    newpassword = newpassword + alphabet.substr(0xd0x1),
    newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x10x1),
    password == newpassword ? alert('PasswordVerified') : alert('Incorrectpassword');
}

 

코드 복붙하고 newpassword 출력하면 된다.

 

Flag: brixelctf{0bfuscati0n}

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

TetCTF 2021  (0) 2021.01.09
IJCTF 2020  (0) 2020.04.27
Houseplant CTF  (0) 2020.04.27
TAMUctf 2020  (0) 2020.03.30
Securinets Prequals 2K20  (0) 2020.03.23