SECCON CTF 13 packed - writeup
チーム「full_weak_engineer | Please subscribe! -> https://asusn.online」で参加しました。参加のきっかけはアスースン・オンラインさんによるリアルトリリオンゲーム企画になります。
今回が初CTF、初アセンブリだったのでこの1問で本当に時間がかかりました(12時間ぐらい)
packed
$ ./a.out
FLAG:foo
Wrong.
そもそもa.out
ファイルが何かすら知らなかったのでそこから調べました。
「CTF a.out reversing」で検索すると以下の記事を見つけたので、それに習ってgdbを使って解析を始めました。
最初は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