初めに
どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は CyberDefenders (以下リンク参考)の「RE101」にチャレンジした際のWriteupになります。
※本チャレンジについては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
コマンドで確認。
あ、Base64ぽいエンコード文字列がある。
base64 -d
でデコードしたら答えがでてきました。
Ans: 0ops_i_used_1337_b64_encryption
File: Just some JS - Check out what I can do!
ファイルが複数あるうちの「just_some_js」のファイルについて問題を出されている。
とりあえず中身を確認してみる。
ああ、これJSのobfuscationで見たことあるわ。以下のサイトでdeobfuscationできます。
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」のファイルについて問題を出されている。
とりあえず中身を確認してみる。
これもみたことあるわ。Brainf*ckだわ。以下のサイトでdeobfuscationできます。
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やってる人からしたら暗記事項かな)
というわけでしっかりheader構造を追わないといけないみたいだ。ここら辺は以下のサイトが役に立つかもしれない。
調べてみるとlocal file header
とcentral directory header
の項目のfile name length
に差分があるのがわかる。58 58
と08 00
で違う。
flag.txt
については8バイトなのでcentral directory header
のほうが正しい(リトルエンディアン)。こちらに合わせる。
保存後、再度解凍すればフラグのテキストファイルが見える。
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で確認してみる。
....Stack Stringかなぁ、それくらいしかないほどシンプルなバイナリ。
radare2
で実際にデバックしてみる。
r2 -A -d malware101
コマンドでデバック開始。iz
で一応stringsも確認したがいいものない。何もない。やっぱりStack Stringか?
afl
でSymbolを確認しつつ、pdf @ main
でディスアセンブル!
printf
が見えるのでその直前にBreakPointをdb
で仕込んでdc
で実行してみる。
V!
のビジュアルモードで確認すると、Stackにフラグが積まれているのが見える。
というわけで、q
でモード抜けた後はpxw @ rsp
でStackの中身を出力し、フラグゲット!!!
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」のファイルについて問題を出されている。
とりあえず回してみる。
何やらフラグが暗号化して出力されているみたいだ。暗号化前の文字列と暗号化後の文字列の比較も出力されている。
とりあえずGhidraで中身を確認してみる。
FUN_004005b0
は出力関数で実際の暗号化はFUN_00400620
で行ってそう。
この関数の中身を確認する。
デコンパイルの結果、ビットシフトしたりXORしたりしているのがわかる。
なんか面倒なのでChatGPTさんに聞いてみた。
PythonのTool作ってくれたので、このToolを回します。
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)
Ans: malwar3-3ncryp710n-15-Sh17
最後に
クリプト問やバイナリ解析の入門にちょうどいいチャレンジだとおもいました。
最後に手を抜いてChatGPTさんに聞いてしまい申し訳ありませんでした。
今回もセキュリティエンジニアの皆さんの助けになればなと思います。