WaniCTF 2023 writeup 【Reversing】

Wani CTFにチームで参加していました。 Reversingを全完できたので、そのWriteupを書いておきます。

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は久々でとても楽しく解けました! 運営の皆さん、ありがとうございました。