CpawCTFの勉強 part3

CpawCTFの勉強最終回です! 今回はLevel3の問題ということで、私には手も足も出ない問題ばかりでした… 最初のうちはわからないのは仕方ないと割り切って、少しでもたくさんの知識を吸収していきたいです。それではどうぞ!


Q23.[Reversing]またやらかした!

reversingの問題です。暗号を解くプログラムらしいが、最後に結果をprintするのを忘れていたとのこと。fileコマンドを使って調べてみたところ実行形式のファイルだったが、printfを入れ忘れているので、もちろん実行しても何も表示されません。またstringコマンドを使ってもflagを見つけられません。

そこでファイルをデコンパイルしてみます。今回はghidraを使ったのですが、「これ使った方がいいよ」とかいうのがあれば教えていただけるとありがたいです。

この際なので仮想環境も作ってみようと思い調べたのですが…


いやー長かった!!

僕の知識とググる力が足りないだけなのですが、仮想環境を作りその中でghidraを動かすまでに非常に時間がかかってしまいました。参考にさせてもらったサイト様のリンクを貼っておくので、もし同じように困っている人がいたら参考にしてみてください。

https://zenn.dev/ytjvdcm/articles/f92af0abb1c8a0

では、待ちに待ったデコンパイルをしてみます。すると、非常にc言語に近いコードが出てきます(学校で16進数を習った直後だったので「うわっナニコレ」となることはなかったです)。

undefined4 main(void) = int main(void)

uint = unsigned int(符号なし整数型)

とのこと。それを踏まえて読んでみると、何やら数字をごちゃごちゃやっているのが見えてきます。また、その値はlocal_44に入れられていっていることもわかります。

ググってみるとこれは「vernam暗号」という暗号化で、local_7cと0x19の排他的論理和を一つづつ取り続けて、その結果をlocal_44に入れているようです。「^」が排他的論理和の記号らしいですね。この場合は0x19がキーとなっているということです。

ということでc言語に直し、実行することでflagが出てきます。

いやー長かった…


Q24.[Web]Baby's SQLi - Stage 2-

ここではSQLインジェクションという攻撃方法を使うようです。

調べてみたことをまとめてみると、入力フォームにSQLのコードをうまく書き込むことで、そのコードを実行させるというもののようです。

今回は、' OR 1=1--というコードをパスワードの部分に打ち込みました。これは、例えばpassword=' 'などのカンマの間に入れられることが予想されます。このときに、一番最初のコンマでpassword=の文字列を終わらせ、OR 1=1で条件が常に成り立つようにし、--でそのあとのコードを無効にするというものです。

初めて見たときはよくこんな方法を思いつくな…とビックリしました!


Q26.[PPC]Remainder theorem

高校の整数の分野で習った合同式の登場です。意味は、modの後ろの数字で割った余りが右と左で同じというものでしたね(数学科ではないので厳密には違う、定義は違うという意見はご勘弁ください…泣)

ちなみに題名のRemainder theoremは日本語に直すと、これまた高校の数学で習った「剰余の定理」らしいですよ。

この問題でどのように剰余の定理を使うのかは残念ながらわかりませんでしたが、総当たりで当てはまる数を確かめていくというのが、僕がwrite upを確認した限りでのだいたいの皆さんの方法でした。

僕はこういう処理をパパっと書くことができないので、やはり競プロなどで練習しなければいけないのかもしれません。


Q29.[Crypto] Common World

これはRSA暗号という種類の暗号のようです。大きい数の素因数分解を利用して暗号にしているようです。

この問題におけるeとは暗号化において元の文章をe乗するということであり、Nは大きな素数2つの積です。

Nが共通かつeが互いに素である2つの公開鍵があれば、Common modulus attackという手法を用いて元の平文を求めることができるらしいです。この他にも様々な攻撃方法があるらしいので、機会があればまたまとめてみたいと思います。

今回の攻撃方法に関しては、GitHubにソースコードがあるみたいなのでそちらをお借りして値を入れればflagが出てきます。

また、この方法はヒントを用いますが、Low Public-Exponent Attackというeが小さい数の時に使うことができる方法を使えば、最初に与えられた公開鍵だけで解くことができるようです。この方法はシンプルに暗号文のe乗根をとりにいくもののようですよ。


終わりに

ということで、cpawctfの問題をすべて解き終わることができました。CTFは初めての挑戦で、解法も自分では思いつかずググったものがほとんどですが、少しづつ知識を蓄えていきたいと思います。

次はpicoctfに挑戦します。こちらも、学んだことをまとめていけたらと思うので、見ていただけるとありがたいです。また、SECCON Beginners CTF 2021にも挑戦してみたいと思っています。

最後までご視聴いただきありがとうございました!

ではまた~

この記事が気に入ったらサポートをしてみませんか?