UgraCTF Quals 2023 - Writeup

2023. 1. 15. 14:36CTF

728x90

UgraCTF 2023에서 제가 풀었던 문제의 Writeup 입니다.

<Stegano>

문제를 보면 엑셀 파일을 하나 주는데, 이 파일을 열어보면 웬 이상한 모눈종이(?)가 보인다.

각 셀들을 잘 살펴보면 그냥 숫자만 입력되어 있는 셀이 있고, 수식이 입력되어 있는 셀들이 있다.

일단 시험삼아 수식이 들어있는 셀에 색을 입혀봤더니....

플래그 포맷이 나오는 것을 볼 수 있었다.. 그럼 플래그를 얻기 위해서는 수식이 들어있는 모든 셀을 색칠해보면 알 수 있지만 하나하나 색을 입히기에는 너무 오래 걸릴 것이다.

이걸 해결할 수 있는 방법이 엑셀에 수식 찾기 기능이다. 이 기능을 활용해 색을 입히면 플래그를 얻을 수 있다.

<Reverse>

문제를 보면 checker.py 파일을 주는 데, 파일의 소스 코드를 먼저 살펴보자.

import base64
import hashlib
import sys


def abort():
    print("Wrong flag!")
    sys.exit(1)


flag = input()

if len(flag) != 29:
    abort()
if flag[17] != 'u':
    abort()
if flag[:5] != 'ugra_':
    abort()
if flag[9:3:-2] != 'nta':
    abort()
if flag[-2:-15:-3].encode().hex() != '6138656a67':
    abort()
if int.from_bytes(flag[6:18:2].encode(), "little") != 104927802781555:
    abort()
if sum(ord(x) * 1000 ** i for i, x in enumerate(flag[19:-4])) != 56099111101106056:
    abort()
if base64.b64encode(flag[-4:].encode()) != b'amRhag==':
    abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'c0046a207f060a3ca5dcb4a65073a84ca1456b40a2992964396590fd725d3e1f':
    abort()

print("OK!")

플래그를 입력받으면 여러 가지 검증 절차를 통해 플래그인지 검사를 하는 코드인 것 같다. 우리는 이 검증 절차를 역으로 따라가면서 플래그를 복구해야 한다.

우선, shs-256 해시값을 검사하는 부분을 제외한 나머지 검증 부분을 통해 복구한 플래그는 다음과 같다.

ugra_astoni+h-ng_uj8jeoc8jdaj

+, - 는 아직 복구하지 못한 부분이다. 이 2글자는 Brute Force를 통해 복구를 해야 할 것 같다.

다음 코드는 내가 짠 Brute Force 코드다.

import base64
import hashlib

def abort():
    print("[-] Wrong flag!")

flag = 'ugra_astoni+h-ng_uj8jeoc8jdaj'
words = 'abcdefghijklmnopqrstuvwxyz1234567890_'
find_flag = False

for i in words:
    for j in words:
        flags = flag.replace('+', i)
        flags = flags.replace('-', j)
        if len(flags) != 29:
            abort()
            continue
        if flags[17] != 'u':
            abort()
            continue
        if flags[:5] != 'ugra_':
            abort()
            continue
        if flags[9:3:-2] != 'nta':
            abort()
            continue
        if flags[-2:-15:-3].encode().hex() != '6138656a67':
            abort()
            continue
        if int.from_bytes(flags[6:18:2].encode(), "little") != 104927802781555:
            abort()
            continue
        if sum(ord(x) * 1000 ** i for i, x in enumerate(flags[19:-4])) != 56099111101106056:
            abort()
            continue
        if base64.b64encode(flags[-4:].encode()) != b'amRhag==':
            abort()
            continue
        if hashlib.sha256(flags.encode()).hexdigest() != 'c0046a207f060a3ca5dcb4a65073a84ca1456b40a2992964396590fd725d3e1f':
            abort()
            continue

        print("OK!")
        print('[+] find flag! ==> ' + flags)
        find_flag = True
        break
    if find_flag:
        break

* 결과

[-] Wrong flag!
...
[-] Wrong flag!
OK!
[+] find flag! ==> ugra_astonishing_uj8jeoc8jdaj

<Forensic>

문제에서 주어진 pcap 파일을 열어보면 HTTP 통신으로 hacker.jpg라는 이미지 파일을 전송한 흔적이 있는 것을 알 수 있다.

hacker.jpg가 어떤 이미지인지 알아보기 위해 hacker.jpg를 export 해서 직접 살펴보겠다.

우선, ASCII로 되어 있는 내용을 export하기 전, Raw로 변경해준다.

그런 다음, Save as...로 hacker.jpg를 다운로드해주면 이미지 파일을 얻을 수 있다. ( 참고로 HxD 같은 Hex Editor로 HTTP Request 내용은 지워줘야 한다. )

export한 hacker.jpg의 모습이다.

<Crypto>

이 문제는 좀 간단한 문제였다...

그냥 ROT13으로 디코딩하면 플래그를 얻을 수 있다.

플래그 획득

 

728x90

'CTF' 카테고리의 다른 글

2022 ChristmasCTF Writeup - Programming  (0) 2023.01.01
2022 ChristmasCTF Writeup - Web  (0) 2022.12.31
squareCTF writeup  (0) 2022.12.01