はじめに
SECCON Beginners CTF 2024に参加したため、write upを書きます。
ご覧の通り、大した順位では無いので復習の意味が大きいです。
自分の知識の整理のために、順を追って書いていきます。
解けたもの
misc getRank
- リンクがあるので飛んでみる
- 0~9の中にランダムで正解が設定されている
- 正解を踏んだ回数で順位がつく
- フロント(html, js)のコードを見る
- 正解するとscore++
- Get Rankを押すとAPIに今のスコアをAPIで投げて、順位を得ている - バックエンド(ts)のコードを見る
- 入ってきた値が次の配列のどの値より大きいかを判別
- [10 ** 255, 1000, 100, 10, 1, 0]
- →デバッグツールでscoreにクソデカ値を入れてやればいいのでは?
- 入ってきた値が次の配列のどの値より大きいかを判別
- デバッグツールで色々入れてみる
- 10**300 → 6位 (score=1e300)
- 100.....00(0を256ぐらい) → 6位 (score=1e256)
- おかしいのでもっとちゃんとバックエンドを読む
- 長さ300以上だと-1位
- 10**255以上だと/10される # なーにが「ハンデがいりますね」じゃ!!!
- にしても1e256で6位はおかしい
- parseIntが1e256をパースできていないっぽい
- perseIntって文字列をintに変換するものだった気がする。文字列で投げたら100.....00(0を256)を投げたら2位になる
- APIを直接叩いたらなにか変わるか?
- curlで叩いたが、結局バックエンドでparseの処理が入っているので関係無いっぽい
- parseIntを掻い潜らなきゃいけなさそう
- parseIntは"0x"から始めると16進数でパースされるらしい
- じゃあ16進数で1e256にしたら?→hex(10**256)→あっ通りそう。通った
pwnable simpleoverflow
- nc が見えたのでとりあえずLinuxから叩いてみる
- ユーザ名を入力するエリアだけある
- コードを読む
- adminになるとフラッグが取れる
- "Cでは、0がFalse、それ以外がTrueとして扱われます。"とあるので、is_adminに0を入れてみる
- 1つではだめ。とりあえず桁数増やしてみる→通った。なぜ?
- 流石に偶然過ぎたので調べてみる
- スタックバッファオーバーフローとかいうらしい
- メモリ空間がスタックで確保されているので、バッファを超えた入力(今だと11byte以上)をいれると、bufの次の変数(is_admin)に値が入る
- is_admin = "0"(0x30)となって、0でなくなるのでFlagが表示される
解こうとしたもの
crypto Safe Prime
- まずそもそもRSAの処理がわかっていない
- 変数
- m: 原文
- p: 素数 (秘密鍵, 今ソフィー・ジェルマン素数)
- q: 素数 (秘密鍵, 今q=2*p+1 安全素数)
- n: p*q (公開鍵, 今ある)
- φ(n)(l): (p-1)*(q-1)
- e: p, qと互いに素な素数。65537が一般的そう
- d: e^-1 mod φ(n) (pow(e, -1, φ(n)) (秘密鍵)
- 暗号化
- c: 暗号文(今ある)。m^e mod n (pow(m, e, n))
- 復号化
- m=c^d mod n (pow(c, d, n))
- 変数
- RSAのよろしくない設定を元にcを解読しよう?
- よくあるパターンを調べる
- RSA暗号運用でやってはいけない n のこと #ssmjp | PPT 参照
- どれも当てはまらなそう
- dほしい → φ(n)ほしい → p, qほしい
- n = p(2p+1)なのでpわかる? → 有効数字が厳しくて出ない……
- と思ったらこれが正解っぽい
- 解く方法何がある?
- にぶたん
- 普通に解く
- **0.5じゃなくてmath.isqrtを使うべきだった→解けた……
-
p = (-1 + (math.isqrt(8*n+1)))//4 q = 2 * p + 1 d = pow(e, -1, (p-1)*(q-1)) ans = pow(c, d, n) ans2 = ans.to_bytes(1024, "big") print(ans2.decode())
- SymPy
web wooorker
- ログインページとReportページがある
- 何かしらでログインするとトークンが発行
- このトークンに、脆弱性報告ページのクローラでadmin権限を付与するんだろうなぁ……
- 認証何もわからん
reversing assemble / cha-ll-enge
- アセンブラなんもわからん
おわりに
write up書くのしんどい……
なぜかgetRankだけ異様に文章量多い……
私の書いた文章読みにくすぎ……
safe Prime解けなかったのあまりに数弱なのでupsolveしてきます……