🍚

SECCON CTF 13 packed - writeup

2024/11/30に公開

チーム「full_weak_engineer | Please subscribe! -> https://asusn.online」で参加しました。参加のきっかけはアスースン・オンラインさんによるリアルトリリオンゲーム企画になります。

今回が初CTF、初アセンブリだったのでこの1問で本当に時間がかかりました(12時間ぐらい)

https://score.quals.seccon.jp/

packed

$ ./a.out
FLAG:foo
Wrong.

そもそもa.outファイルが何かすら知らなかったのでそこから調べました。
「CTF a.out reversing」で検索すると以下の記事を見つけたので、それに習ってgdbを使って解析を始めました。
https://qiita.com/sasana/items/e6d1285e501356f7b945

最初はdisplay/10i $pcで常に命令を見つつ、各レジスタにもdisplay/x $rax display/x $rbx ... display/s $rsi ...とかを入れて、 siで進めました。

途中からx/500i $pcで先の命令を見て、syscallがあるアドレスにbreakを入れていき、入力が求められる命令が入るアドレスを探すというアプローチを取ることにしました。

無事入力が求められるアドレスを見つけ、入力文字サイズが最初の条件になっている事が分かりました。

入力文字サイズが違うとWrong.となります。

この段階では$rsiに入力文字とXORされる値が入っています。

SECCONとXORした値と同じ値がが入っているレジスタを探そうと思います。

siしていったら$rsiに同じ値が入ってきたのでXORします。

解答が出ました。

SECCON{UPX_s7ub_1s_a_g0od_pl4c3_f0r_h1din6_c0d3}

かんそう

普段はWebサイトとかを作っているという事もあり、Webの問題をやろうかと思ったのですが、解けそうな問題が残って無かったので解答チームが多い問題を選びました。実際packedを終えたあとself-ssrfに挑戦しましたダメでしたね⋯⋯
上記解法にたどり着くまで本当に紆余曲折やってたのですが1問でも解けて良かったです。

Discussion