Space Heroes CTF 2022

# Space Heroes CTF 2022 Writeup
## 概要
本記事は、4月1日~4月3日(UTC)で行われたSpaceHeroesCTFのWriteupです。
※主にforensicsについて書きます。
結果は、778チーム中222位でした。
チーム人数上限がなかったことに驚き(一人なので関係なし😂😂😂)

https://spaceheroes.ctfd.io/

## Forensics
順番はぐちゃぐちゃです

### Buzz's Secret Watch (Part 1)
難易度 Medium
<strong>状況</strong>
8つのLED?が、赤緑と点灯するaviファイルが渡された。

![buzz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/a427659b-02f5-6ad2-358f-71b6673b791c.png)

<strong>解決</strong>
2進数とわかるので、2進数→ASCIIに変換するとflagをゲット。
※6秒程度の動画だったため自力で解いた


### Space Captain Garfield
難易度 Easy
<strong>状況</strong>
アメコミ？みたいな画像が渡された。
![SpaceCaptainGarfield.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/3195b2bb-8da2-557b-31ac-322de3f54379.png)

<strong>解決</strong>
換字式暗号なので、元の漫画と照らし合わせればできる。画像検索をかけると出てきたのでそのまま、置き換えてflagゲット

### The Legend of the Chozo
難易度 Medium
<strong>状況</strong>
.chrファイルが渡された。問題文的にファイルを読めるように直せってことらしい

<strong>解決</strong>
VScodeでバイナリを見てみると。
```:問題バイナリ
50 47 89 0A 4E 0D 0A 1A 0D 48 44 00 52 00 00 49 | P G . . N . . HD. R .
```
```:PNGバイナリ
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 51 | . P N G . . .
```

PNGデータの形式と類似している。最初の行をPNGの形式に書き換えると開けた。flagゲット

### Star Pcap
難易度 Easy
<strong>状況</strong>
ICMPのパケットだけのpcapファイル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/3d7eff11-c1cd-89fd-872f-db8e2c2896cd.png)
<strong>解決</strong>
ICMP.codeの値が変化している、その値だけ取り出すと

```
c2hjdGZ7TDBnMWMtaSQtdGgzLWJlZ2lOTmluZy0wZi13aSRkb019
```
base64でデコードするとflagゲット

### Buzz's Secret Watch (Part 2)
難易度 Hard
<strong>状況</strong>
Part1と同じ形式だったが、動画の時間が5分に伸びている。信号の数も多く自力で解くには困難っぽい。

<strong>解決</strong>
python3で自動で読み取るsolverを書きflagをゲットする。

```python:solver.py
from types import CoroutineType
import cv2
import numpy as np
def main():
    cap = cv2.VideoCapture('buzz-bin.avi')
    frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    fps = cap.get(cv2.CAP_PROP_FPS)
    print(f'frame {frame_count}, fps: {fps}')
    while(cap.isOpened()):
        try:
            frame = cv2.cvtColor(cap.read()[1],cv2.IMREAD_COLOR)
        except:
            break
        x, y = 336, 679
        w, h = 35, 35
        cnt=0
        non = 0
        bin_2 = ''
        for i in range(1,9):       
            imgBox = frame[y:y+h, x+(cnt*w):x+w*i]
            b = imgBox.T[0].flatten().mean()
            g = imgBox.T[1].flatten().mean()
            r = imgBox.T[2].flatten().mean()
            if r > g and r > b :
                break
            elif g > r and g>b:
                bin_2 = bin_2 + '1'
            else:
                bin_2 = bin_2 + '0'
                non+=1
            cnt+=1
        if non != 8 and bin_2 != '':  
            print(chr(int(bin_2,2)), end='')
    cap.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    main()
```
```:bash
$ python3 solver.py | grep shctf
@@@@ØØÐÐ-8,SL)ýHèþÿÿHÁýtÛLòLîDçAÿßHÃH9ÝuêH[]A\A]A^A_ÃÃf.DSåtd888 PåtdË+HÿÐHCøHHøÿuðH]øÉÃfèþÿÿHÃ
shctf{Th1s-Isnt-Fly1ng-THis-Is-FAlliNg-W1th-Styl3}
8ôïÿÿÀÿàfDÃóú=AWL{UH=â.HåATSt/Ho.6GLIBC÷,H.5_ITM_deregisterTMCloneTable__gmðÿ¬$ðÿÿT]ñÿÿÄregisterTMCloneTable)uÀtÿàÃH=/Hà?è?ð?H=/è&ÿÿÿHHÝ/H
```

### netflix-and-ctf
難易度 Easy
<strong>状況</strong>
TCPとHTTPが混ざったパケット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589101/914cee5d-3282-e338-5988-fe8b9dfbd7f1.png)
<strong>解決</strong>
http.infoに\keypress\Lit_rと明らか怪しいので全部取り出してみる。
今回はscapyを使用してpcapファイルを解析する
```python:solver.py
from scapy.all import*

'''パケット表示'''
def parse_pcap(filename, show_detail):
    packets = rdpcap(filename)
    if show_detail == False:
        return
    
    target_cnt = 0
    keys = b''
    for cnt, packet in enumerate(packets, 1):
        if is_this_target_packet(packet) == True:
            if b'Lit_' in packet['Raw'].load:
                keys += ((packet['Raw'].load).split()[1]).split(b'_')[1]
            target_cnt += 1
    print(keys)
    print(target_cnt)

'''特定のパケットだけ抽出（条件)'''
def is_this_target_packet(packet):
    if packet.haslayer('Raw') and packet[TCP].sport == 51426:
        return True

if __name__ == "__main__":
    pcap_filename = 'netflix-and-ctf.pcap'
    SHOW_Detail = True
    parse_pcap(pcap_filename, SHOW_Detail)
    print("completed.")
```
```
$ python3 solver.py
b'Treasure+PlanetDuneVoltron+in+SpaceTreasure+PlanetDuneHighlanderHighlanderVoltron+in+SpaceDuneStar+Trek
shctf%7BT1m3-is-th3-ultimat3-curr3Ncy%7D
Star+Wars
shctf%7BT1m3-is-th3-ultimat3-curr3Ncy%7Dshctf%7BT1m3-is-th3-ultimat3-curr3Ncy%7DStar+
-----省略------
705
completed.
```
%7Bを{ %7Dを}としてflagゲット