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( { url: URL, jar: cookieJar }, function (err, res, body) { const $ = cheerio.load(body); var text = $('#rndstring').html(); console.log('[+] string: '+text); request.post( { url: URL, jar: cookieJar, form: { inputfield: text } }, function (err, res, body) { 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 (resolve, reject) { request.get( { url: URL, jar: cookieJar }, function (err, res, body) { if (err) { reject(0); } else if (res.statusCode != 200) { reject(res.statusCode); } resolve(); } ); }); } function SubmitAnswer(index, submit) { return new Promise(function (resolve, reject) { request.post( { url: URL, jar: cookieJar, form: { insert_answer: submit } }, function (err, res, body) { 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(i, answers[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를 사용해서 풀었으며 아래 링크를 참고했다.
Flag: brixelCTF{SP4C3L4B}
Forensics :: Lottery ticket
조작된 숫자를 전부 더하면 된다.
그림을 확대해 보면, 대부분의 숫자에 노이즈가 있는데 특정 숫자에는 노이즈가 없다.
노이즈가 없는 숫자인 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))%26] for 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(0x1, 0x1), newpassword = newpassword + alphabet.substr(0x11, 0x1), newpassword = newpassword + alphabet.substr(0x8, 0x1), newpassword = newpassword + alphabet.substr(0x17, 0x1), newpassword = newpassword + alphabet.substr(0x4, 0x1), newpassword = newpassword + alphabet.substr(0xb, 0x1), newpassword = newpassword + alphabet.substr(0x2, 0x1), newpassword = newpassword + alphabet.substr(0x13,0x1), newpassword = newpassword + alphabet.substr(0x5, 0x1), newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x2, 0x1), newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x4, 0x1), newpassword = newpassword + alphabet.substr(0x1, 0x1), newpassword = newpassword + alphabet.substr(0x5, 0x1), newpassword = newpassword + alphabet.substr(0x14, 0x1), newpassword = newpassword + alphabet.substr(0x12, 0x1), newpassword = newpassword + alphabet.substr(0x2, 0x1), newpassword = newpassword + alphabet.substr(0x0, 0x1), newpassword = newpassword + alphabet.substr(0x13, 0x1), newpassword = newpassword + alphabet.substr(0x8, 0x1), newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x4, 0x1), newpassword = newpassword + alphabet.substr(0xd, 0x1), newpassword = newpassword + alphabet.substr(alphabet.newpassword-0x1, 0x1), 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 |