WaniCTF 2023 writeup 【Reversing】
Wani CTFにチームで参加していました。 Reversingを全完できたので、そのWriteupを書いておきます。
- JUST_Passw0rd(Beginner)
- Javersing(Easy)
- fermat(Easy)
- theseus(Normal)
- Web_assembly(Hard)
- Lua(Easy)
- 感想
JUST_Passw0rd(Beginner)
ELFが配布され、実行するとパスワードが求められる。 stringsをかけるとそのままflagが見つかる。
FLAG{1234_P@ssw0rd_admin_toor_qwerty}
Javersing(Easy)
jarファイルが渡されるので、7-zipを使ってclassファイルを取り出し、「JD-Eclipse」を使ってデコンパイルをすると次のコードが得られる。
フラグ文字列がif (str2.charAt(b * 7 % 30) != str1.charAt(b))
によって並びかえられているのでpythonでsolverを書くと、
encoded_password = "Fcn_yDlvaGpj_Logi}eias{iaeAm_s" decoded_password = [''] * 30 for i in range(30): index = i * 7 % 30 decoded_password[index] = encoded_password[i] decoded_password = ''.join(decoded_password) print(decoded_password)
となり、flagはFLAG{Decompiling_java_is_easy}
fermat(Easy)
elfのファイルが渡され、実行するとa, b, cの値が聞かれ、正しい値を入力時にflagが出力されるっぽい とりあえずIDAで解析。 test、jeで分岐がされているようなので、gdb-pedaを使用してブレークポイントを置いてゼロフラグを書き換えて実行するとflagが出力される。 FLAG{you_need_a_lot_of_time_and_effort_to_solve_reversing_208b47bd66c2cd8}
theseus(Normal)
elf形式のファイルで、FLAGと同じ文字列を打ち込むとCorrectと表示されるファイルが配布。 Ghidraでデコンパイルするとmainからcompare関数が呼び出されてfor文で比較が行われてるっぽい。 関数内部にはflagらしき値を発見。 頑張れば復号できそうでしたが、今回はgdb-pedaを使用。 compare関数にブレークポイントを置いて実行し、1命令づつ進めていくとflagが出力された。 FLAG{vKCsq3jl4j_Y0uMade1t}
Web_assembly(Hard)
ブラウザ上でc++が実行される。 正しいユーザ名とパスワードを入力するとflagが出力されるっぽい。
ブラウザの開発者ツールでindex.wasmを見たら、下の方にflagらしき文字列があったので、意味が通るように並び替えて提出したら通った。 Flag{Y0u_C4n_3x3cut3_Cpp_0n_Br0us3r!}
Lua(Easy)
正しいflagを入力すると、correctと表示するLuaファイルが配布。 コードにはprint文などがなく、難読化されていたためVScodeの拡張のluaデバッガで、適当にブレークポイントを設けて実行。 メモリ上に正しいflagが読み込まれていることが確認できた。 FLAG{1ua_0r_py4h0n_wh4t_d0_y0u_3ay_w4en_43ked_wh1ch_0ne_1s_be44er}
感想
あまり、Reversingをやっていなかったためパワーで解いた感があります。 Web_assemblyもwabtを使ってデコンパイルしたものをgccでコンパイルしてみたりと、いろいろしましたが結局最後はゴリ押しで提出、、、 次までにはReversingちゃんと解きたいです。 チームで参加するCTFは久々でとても楽しく解けました! 運営の皆さん、ありがとうございました。