【CyberDefenders】RE101【Writeup】

# 初めに
どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は ___CyberDefenders___ （以下リンク参考）の「___RE101___」にチャレンジした際のWriteupになります。

https://cyberdefenders.org/blueteam-ctf-challenges/36

※本チャレンジについてはRed側のペネトレというよりはBlue側の分析力を問われるものになります。

# File: MALWARE000 - I've used this new encryption I heard about online for my warez; I bet you can't extract the flag!
ファイルが複数あるうちの「malware000」のファイルについて問題を出されている。
とりあえず表層解析してみる。`strings`コマンドで確認。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/c62992f2-fac5-c75f-08d5-752b6493e541.png)
あ、Base64ぽいエンコード文字列がある。
`base64 -d`でデコードしたら答えがでてきました。
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/67795dd2-3bb5-78ab-d5ec-3ecfe28c3336.png)

___Ans: 0ops_i_used_1337_b64_encryption___

# File: Just some JS - Check out what I can do!
ファイルが複数あるうちの「just_some_js」のファイルについて問題を出されている。
とりあえず中身を確認してみる。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/fcdf4681-38c3-e1ef-04b8-1c32979838c6.png)
ああ、これJSのobfuscationで見たことあるわ。以下のサイトでdeobfuscationできます。

https://www.dcode.fr/javascript-unobfuscator

![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/66353d43-e300-1df6-a55d-15f1bb415952.png)
フラグゲット！

___Ans: what_a_cheeky_language!1!___

# File: This is not JS - I'm tired of Javascript. Luckily, I found the grand-daddy of that lame last language!
ファイルが複数あるうちの「this_is_not_js」のファイルについて問題を出されている。
とりあえず中身を確認してみる。
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/fa657e45-3a1b-7371-673e-c0e915ada427.png)
これもみたことあるわ。Brainf*ckだわ。以下のサイトでdeobfuscationできます。

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

![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e7885574-949b-3c13-a814-7cbbca0f434b.png)
フラグゲット！

___Ans: Now_THIS_is_programming___

# File: Unzip Me - I zipped flag.txt and encrypted it with the password "password", but I think the header got messed up... You can have the flag if you fix the file
ファイルが複数あるうちの「file.zip_broken」のファイルについて問題を出されている。
`unzip`コマンドで試しに解凍してみると`warning: file too long`といわれる。
バイナリを確認してみるとパット見ではheader構造におかしな点は見えない（`50 4B 03 04`で始まってるし。ここら辺CTFやってる人からしたら暗記事項かな）
![4-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2999e258-06e1-28fe-5d3a-45efa4be8d6d.png)
というわけでしっかりheader構造を追わないといけないみたいだ。ここら辺は以下のサイトが役に立つかもしれない。

https://bombrary.github.io/blog/posts/zip-format-report/

調べてみると`local file header`と`central directory header`の項目の`file name length`に差分があるのがわかる。`58 58`と`08 00`で違う。
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/96797f76-44b7-f7cb-b3ef-5d733c30cde7.png)
`flag.txt`については8バイトなので`central directory header`のほうが正しい（リトルエンディアン）。こちらに合わせる。
![4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/680b0a90-16dc-96ac-d81e-efabe41ad54a.png)
保存後、再度解凍すればフラグのテキストファイルが見える。
![4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f9c4cc3b-537c-a697-b374-3c80cb8f7f15.png)

___Ans: R3ad_th3_spec___

# File: MALWARE101 - Apparently, my encryption isn't so secure. I've got a new way of hiding my flags!
ファイルが複数あるうちの「malware101」のファイルについて問題を出されている。
とりあえずGhidraで確認してみる。
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9195974a-77cc-ccca-b87d-03a07fb27164.png)
....Stack Stringかなぁ、それくらいしかないほどシンプルなバイナリ。
`radare2`で実際にデバックしてみる。
`r2 -A -d malware101`コマンドでデバック開始。`iz`で一応stringsも確認したがいいものない。何もない。やっぱりStack Stringか？
![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/206cf13d-9ded-c1b9-6370-8cc3a4f129fa.png)
`afl`でSymbolを確認しつつ、`pdf @ main`でディスアセンブル！
![5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1ec9a9b1-ee6c-05c0-5cd9-2f4aaf1fb694.png)
`printf`が見えるのでその直前にBreakPointを`db`で仕込んで`dc`で実行してみる。
`V!`のビジュアルモードで確認すると、Stackにフラグが積まれているのが見える。
![5-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/63fb1012-b276-8700-10d6-10e6493358b5.png)
というわけで、`q`でモード抜けた後は`pxw @ rsp`でStackの中身を出力し、フラグゲット！！！
![5-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/62332c74-7646-c6da-3b03-4bb043a64a6f.png)

___Ans: sTaCk_strings_LMAO___

# File: MALWARE201 - Ugh... I guess I'll just roll my own encryption. I'm not too good at math, but it looks good to me!
ファイルが複数あるうちの「malware201」のファイルについて問題を出されている。
とりあえず回してみる。
![6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1bd00640-c3b1-777f-5aa3-8f597f62645d.png)
何やらフラグが暗号化して出力されているみたいだ。暗号化前の文字列と暗号化後の文字列の比較も出力されている。
とりあえずGhidraで中身を確認してみる。
![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6875ccc5-c081-5e74-d362-7522f914dfd5.png)
`FUN_004005b0`は出力関数で実際の暗号化は`FUN_00400620`で行ってそう。
この関数の中身を確認する。
![6-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9096db87-7fea-58d5-0c2e-ab862de26664.png)
デコンパイルの結果、ビットシフトしたりXORしたりしているのがわかる。
なんか面倒なのでChatGPTさんに聞いてみた。
![6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4bda0c05-d777-64fd-67b1-44d6e0a2fa46.png)
PythonのTool作ってくれたので、このToolを回します。
```python
def decrypt_string(encrypted_str):
    decrypted_str = ""
    key = 0xA0
    for byte in encrypted_str:
        decrypted_byte = ((byte ^ key) - 1) >> 1
        decrypted_str += chr(decrypted_byte)
        key = (key + 1) & 0xFF
    return decrypted_str

# 暗号化された文字列と文字数を指定して解密を行う例
encrypted_str = b'\x7b\x52\xe3\x78\x6f\x42\x41\x64\x67\x62'
num_chars = len(encrypted_str)
decrypted_str = decrypt_string(encrypted_str)
print(decrypted_str)
```
![6-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/164c31fd-e442-55f6-ed4e-15d7844b92d6.png)
フラグゲット！！！

___Ans: malwar3-3ncryp710n-15-Sh17___

# 最後に
クリプト問やバイナリ解析の入門にちょうどいいチャレンジだとおもいました。
最後に手を抜いてChatGPTさんに聞いてしまい申し訳ありませんでした。

今回もセキュリティエンジニアの皆さんの助けになればなと思います。