archIVe

[writeup] CpawCTF Level 3



[Reversing] またやらかした!

[ Challenge ]
またprintf()をし忘れたプログラムが見つかった。
とある暗号を解くプログラムらしい…
reversing200

radare2でファイルを読み込むと zixnbo|kwxt88d0x19 をXORをしている。

❯ python3
Python 3.8.5
[GCC 9.3.0] on linux
>>> _str = 'zixnbo|kwxt88d'
>>> ''.join([chr(ord(tmp)^0x19) for tmp in _str])
'cpaw{vernam!!}'

=> cpaw{vernam!!}

[Web] Baby’s SQLi - Stage 2 -

[ Challenge ]
うーん,ぱろっく先生深くまで逃げ込んでたか.
そこまで難しくは無いと思うんだけども…….

えっ?何の話か分からない?
さてはStage 1をクリアしてないな.

待っているから,先にStage 1をクリアしてからもう一度来てね.
Caution: sandbox.spica.bzの80,443番ポート以外への攻撃は絶対にしないようにお願いします.

“Baby’s SQLi - Stage 1 -” で入手したURLにアクセスする。

https://ctf.spica.bz/baby_sql/stage2_7b20a808e61c8573461cf92b1fe63b3f/index.php

ユーザ名は指定のもの、パスワードに ' OR 1 == 1 を指定してflagを入手。

=> cpaw{p@ll0c_1n_j@1l3:)}

[PPC] Remainder theorem

[ Challenge ]
うーん,ぱろっく先生深くまで逃げ込んでたか.
そこまで難しくは無いと思うんだけども…….

えっ?何の話か分からない?
さてはStage 1をクリアしてないな.
待っているから,先にStage 1をクリアしてからもう一度来てね.

Caution: sandbox.spica.bzの80,443番ポート以外への攻撃は絶対にしないようにお願いします.
x ≡ 32134 (mod 1584891)
x ≡ 193127 (mod 3438478)

x = ?

フラグはcpaw{xの値}です!

x % 1584891 = 32134x % 3438478 = 193127 を満たす x を求める。

if __name__ == '__main__':
    divisor_1   = 1584891
    remainder_1 = 32134

    divisor_2   = 3438478
    remainder_2 = 193127

    n = 1
    while True:
        x = divisor_1 * n + remainder_1
  
        if x % divisor_2 == remainder_2:
            print(f'x = {x}')
            exit(0)
        else:
            n += 1
❯ python3 solver.py
x = 35430270439

=> cpaw{35430270439}

[Crypto] Common World

[ Challenge ]
Cpaw君は,以下の公開鍵を用いて暗号化された暗号文Cを受け取りました.しかしCpaw君は秘密鍵を忘れてしまいました.Cpaw君のために暗号文を解読してあげましょう.

(e, N) = (11, 236934049743116267137999082243372631809789567482083918717832642810097363305512293474568071369055296264199854438630820352634325357252399203160052660683745421710174826323192475870497319105418435646820494864987787286941817224659073497212768480618387152477878449603008187097148599534206055318807657902493850180695091646575878916531742076951110529004783428260456713315007812112632429296257313525506207087475539303737022587194108436132757979273391594299137176227924904126161234005321583720836733205639052615538054399452669637400105028428545751844036229657412844469034970807562336527158965779903175305550570647732255961850364080642984562893392375273054434538280546913977098212083374336482279710348958536764229803743404325258229707314844255917497531735251105389366176228741806064378293682890877558325834873371615135474627913981994123692172918524625407966731238257519603614744577)

暗号文: 80265690974140286785447882525076768851800986505783169077080797677035805215248640465159446426193422263912423067392651719120282968933314718780685629466284745121303594495759721471318134122366715904

[これは…?](https://ctf.cpaw.site/download.php?param=8a53ea3e483e88ac5a8b45787f2df9bd)

フラグは以下のシンタックスです.
cpaw{復号した値}

※復号した値はそのままで良いですが,実は意味があります,余力がある人は考えてみてください.

問題文で指定されている(e, N)は、RSA暗号の公開鍵を表す。 平文を m 、暗号文を c 、公開鍵を (e, N) 、秘密鍵を d とおくと、RSA暗号は次の式で表される。

N = pq
c = m^e mod N
d = e^-1 mod (p - 1)(q - 1)
m = c^d mod N

e = 11e = 13 のときの c が既知のため、そこから m を計算できる。

c1 = m^11 mod N
c2 = m^13 mod N

c2/c1 = m^2 mod N
c2/c1 = 180040032052240663195289808096837316
m = √(c2/c1)
  = 424311244315114354

=> cpaw{424311244315114354}