はじめに
こんにちは。セキュリティ知識の向上を目的にCpawCTFに挑戦しています。Level 3のWriteUPをまとめました。
Level 1のWriteUPはこちら
Level 2のWriteUPはこちら
1. [Reversing] Q23. またやらかした!
メモリ内容から出力結果を再現するとflagが出てくる。
- WSL、gdb:
WSLのfileコマンドでファイル形式がELFであることを確認。
gdbでプログラム全体を表示させると、怪しい部分(movl)が並んでいる部分がある。
(gdb) disas main
movlの下のほうにはxorとcmplが書かれているので、xor処理をループしているらしいと推測する。
処理をpythonで再現する。
- python:
movlが示す16進数を次々にXORした値を計算し、chrで文字に変換して並べるとflagとなる。
2. [Web] Q24. Baby's SQLi - Stage 2
SQLを打ち込むためのサイトURLが中々見つけられなくて右往左往していたら、stage1のflagが入っている表に書かれていました。
stage2用のURLにアクセスすると、ユーザー名とパスワードを入力するフォームがある。
ユーザ名は "porisuteru" と書かれている。
パスワードが分からないので、無効化するコードをパスワード欄に入力する。
' OR '1'='1
実行するとログインできて、flagが表示される。
3. [PPC] Q26. Remainder theorem
Aで割った余りがB かつ Cで割った余りがD になる数がflag。
pythonでループ処理を書いて解く。
初期値32134に154891をi回足し、3438487で割った余りが193127になれば、その時の32134+154891*iが答え。
m1 = 32134
m2 = 193127
for i in range(100000):
m1 += 1584891
if m1 % 3438478 == 193127:
print(m1)
break
4. [Crypto] Q29. Common World
RSAの問題。
公開鍵は $e=11$ と極端に小さい。
もし平文のe乗がNより小さければ、平文のe乗が暗号となる。
つまり、暗号文のe乗根が平文であるということ。
暗号文の11乗根を以下のようにpythonで計算すると、浮動小数点の精度が足りず不正確な値になってしまう。
c = 80265690974140286785447882525076768851800986505783169077080797677035805215248640465159446426193422263912423067392651719120282968933314718780685629466284745121303594495759721471318134122366715904
print(c ** (1 / 11))
#4243112443151148
精度高い計算を行うにはdecimalを使う。
decimal.Decimalで処理した値をint関数で整数値にする。
得られた数字がflagとなる。
import decimal
decimal.getcontext().prec = 1000
c = 80265690974140286785447882525076768851800986505783169077080797677035805215248640465159446426193422263912423067392651719120282968933314718780685629466284745121303594495759721471318134122366715904
print(int(round(decimal.Decimal(c) ** (decimal.Decimal(1) / decimal.Decimal(11)))))
#424311244315114354
得られた数値は一見ただの数字だが、2文字ずつ区切ってポリビオス暗号でデコードすると意味のあるメッセージになる。
簡単ではない問題。
振り返り
CpawCTF、とっても楽しかったです。
問題を解くたびに新しい知識が得られるので、人気があるのもわかります。
pythonで解いた問題もあって、競技プログラミングやっててよかったとも思えた瞬間。
AtCoderと並行しつつ、これからも楽しいCTFライフを送っていきたいです。