2
3

SECCON Beginners CTF 2024 write up

Posted at

はじめに

SECCON Beginners CTF 2024に参加したため、write upを書きます。
ご覧の通り、大した順位では無いので復習の意味が大きいです。
image.png
自分の知識の整理のために、順を追って書いていきます。

解けたもの

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を解読しよう?
  • よくあるパターンを調べる
  • 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してきます……

参照

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3