痔録

おしりいたい

SECCON Beginners in Shinagawaに参加した

タイトルの通りSECCON Beginners in Shinagawaに参加しました。初参加です。あとWrite upではなく感想です。
まず感想を大雑把にまとめると、pwn 難しすぎて禿げました。アセンブリワカラン それでも大雑把には理解したり、また外のイベントに参加する事でモチベの向上などしたので、とても有意義だったと感じています。そんなことより楽しみにしすぎて3時間も寝れなかったのでつらい

午前の部 crypto

暗号理論の大雑把な説明から入り、RSAの解説がメインでした。 定義の確認は過去に何度もしていたり(実はksnctfのRSA実装するだけ解いてたり)するのですが、 やはり数学的な知識が足りていないなどが原因で、中途半端な理解で止まっています。

  1. 何故
  2. 扱う記号多すぎて脳のレジスタに収まらない。処理速度が人生の速度に追いつけない。たすけて

まあそれは冗談として、有限体の逆元について知れたのがとても大きかったです。 フェルマーの小定理/オイラーの定理だけ知ってても実際に活用できないと大幅に価値が減るなと感じました(xgcdまだわからん)

ちなみに演習でRSAの計算をする時間もあったのですが、何をとち狂ったのか、N = \varphi(pq)を計算していました。 おバカですね。睡眠は大事。

暗号は結構興味があったり数学と密接に絡んでたりでかなりモチベは高いので、今後も頑張っていきたいですね(主に数学を)。

午後の部 pwn

pwnとは何か?という解説から入り、アセンブラgdbの解説、またそれらを用いて実際にバッファオーバーフローを 起こしてみよう!という事をやりました。
概念だけは前々から知っていたものの, 実際に起こそうとすると意味が分からんという感じでした。 レジスタのripとかrdpがかなり重要なことは理解したのですが、これまでにまともにアセンブラを勉強したことが無かったので、 3文字の単語がひたすら頭の中でぐるぐるしていました。

今回はget_shellという未使用の関数が用意されていてその関数のアドレスをスタックに積んでシェルを起動する、 という手法でしたが、実際にはそんな関数が都合よく用意されてるわけもなく自力で/bin/shを呼ぶという事で、 ここらへんも時間のある時にやってみたいですね。

(正直初心者に対して1時間半の講義でできる内容じゃない、なくない?)

CTF Challenges

pwn3問、crypto4問、Misc4問。

解けた/解説聞いて理解したのは書き残しておきます。

Misc

Welcome

フラグのフォーマット確認。入れるだけ。

Tekeisan4b in shinagawa

webページに四則演算の式があるのでそれを回答 * 100回。 postで正答数ぶち込むのかなぁと思ったのですが、んにゃぴよくわかんなかったです。 しょうがないので実際に手計算でやってたら70問あたりでEnter押すときにバックスラッシュも一緒に押して涙出た。

Decremented

配布されたバイナリを実行するとflagをなんらかの処理がされた文字列が出てくる。 何らかの処理が「フラグの文字列strに対してstr[i]-=iしたもの」だったので、逆にstr[i]+=iすれば良かった。 最初の方が"csd..."となっていたので、それが"ctf"から0, 1, 2だけずらした文字と気づければ解けた。

Crypto

Factoring

大きい整数の因数分解。やるだけ。 Pythonで実装したらセグフォで死んだんですが、競技終了後にC++でfor(int i=3;;i+=2)でやったら10秒かかりませんでした。涙出た。

Go Fast

2^{4805} mod 97を計算。 剰余の計算テクニック使って実装するだけ。高速指数演算を使わなくても間に合う。

SimpleRSA

文字通りRSA実装するだけ。 以前にksnctf解いてる時に実装したコード流用したのは内緒だ

Find primes

10個くらいの整数の組が与えられた。
RSAの講義の時に、RSAでの脆弱な鍵についての話が合ったのですが、その中でのN = pq素数の組 p, qを 別の鍵の生成に使いまわしていると、それらの鍵2つに対してユークリッドの互除法を使用することで 最大公約数を求めること(=素因数分解)ができてしまう。
この問題ではあるp, qを使いまわしており、1つだけ使いまわしていないものがあったのでそれを探せ、 という事らしいです。多分。

Pwn

BOF for Beginner

バイナリが与えられるので、その中のget_flag関数を呼ぶ。
gdbを使う、objdumpで逆アセンブルする等してソースを読むと、readを読んだ後にmemcmp, jneが呼ばれている事が わかる。もしそのjneの条件を満たしているとget_flagに入れないので、それを満たさないようにBOFを利用 してごにょごにょする(わかってない)。するとget_flag関数が呼ばれてフラグが標準出力される。多分。
f:id:leno3s:20181007214103p:plain できそうでできなかったので一番悔しかったですね。

Shell we dance?

なんかジャンプ条件を満たすように逆算してcanaryの値?をごにょごにょするらしい(わかってない)

結果

f:id:leno3s:20181007214111p:plainf:id:leno3s:20181007214107p:plain

400ptで21位/121人でした。Factoringはマジで怠惰で(pwnに意識が飛んでたとも言う)やらなかったり、 Polybiusも意味がわからなっかたらタイトルでググる、って行為ができてなかったりで慣れてないなぁという 感じです。 しかしLinux触り始めて1年ちょっとですが、本当に触って知識得てるだけで活用が全然できてないなぁ と思いました。やらなきゃ(使命感)。

常設CTF頑張るぞー。