DamCTF 2023 Writeup

この大会は2023/4/8 9:00(JST)~2023/4/9 9:00(JST)に開催されました。
今回もチームで参戦。結果は384点で451チーム中171位でした。
自分で解けた問題をWriteupとして書いておきます。

rules (misc)

ルールにフラグのサンプルが記載されている。

dam{s4niTy_ch3ck_1n_rul35}

crack-the-key (crypto)

PKCS1v15でRSAの暗号化がされている。公開鍵を見てみる。

$ openssl rsa -pubin -text < pub.pem
Public-Key: (512 bit)
Modulus:
    00:df:18:a0:33:a1:e0:d6:be:cf:8e:34:fc:ee:44:
    66:f7:2b:0e:77:06:d1:1e:d1:6e:f6:f7:bd:39:fc:
    97:5d:e3:b3:70:84:7c:03:1d:76:44:e9:4e:ce:71:
    1f:a2:30:8b:d5:c5:c9:09:e8:8c:b2:3f:7d:2d:4f:
    c3:40:90:32:7f
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN8YoDOh4Na+z440/O5EZvcrDncG0R7R
bvb3vTn8l13js3CEfAMddkTpTs5xH6Iwi9XFyQnojLI/fS1Pw0CQMn8CAwEAAQ==
-----END PUBLIC KEY-----

nは以下の値になっている。

n = 0x00df18a033a1e0d6becf8e34fcee4466f72b0e7706d11ed16ef6f7bd39fc975de3b370847c031d7644e94ece711fa2308bd5c5c909e88cb23f7d2d4fc34090327f
  = 11684495802889072585203310515250083572285658052270998153007378254694580706620837521287604089276341404868210594675627429508088431073125103913482926295102079

nをfactordbで素因数分解する。

n = 106824314365456746562761668584927045312727977773444260463553547734415788806571
  * 109380489566403719014973591337211389488057388775161611283670009403393352513149

この情報を使って、秘密鍵を生成する。

$ rsatool.py -f PEM -o priv.pem -p 106824314365456746562761668584927045312727977773444260463553547734415788806571 -q 109380489566403719014973591337211389488057388775161611283670009403393352513149 -e 65537
Using (p, q) to calculate RSA paramaters

n =
df18a033a1e0d6becf8e34fcee4466f72b0e7706d11ed16ef6f7bd39fc975de3b370847c031d7644
e94ece711fa2308bd5c5c909e88cb23f7d2d4fc34090327f

e = 65537 (0x10001)

d =
b56fbea21f2dcf18018ee2d32d27de217817dc7f63c54f88923beadde4ea6984c7e48017f5a249ff
06eae30dfd593ced0f8538ff9bd07361391960dfdb32af89

p =
ec2c6b56df8944bced37f8840650041b515e3be90fb29930e743db65f2bd11ab

q =
f1d329c6a628cb16de15aedbc0c524d5b4e3edfe3a2fb29956fe4b983e0db67d

Saving PEM as priv.pem

あとはこの秘密鍵を使って、復号する。

#!/usr/bin/env python3
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from base64 import b64decode

with open('flag.enc', 'rb') as f:
    flag_enc = f.read()

with open('priv.pem', 'rb') as f:
    priv_pem = f.read()

privkey = serialization.load_pem_private_key(priv_pem, password=None, backend=default_backend())
flag = privkey.decrypt(b64decode(flag_enc), padding.PKCS1v15()).decode()
print(flag)
dam{4lw4y5_u53_l4r63_r54_k3y5}

survey (misc)

アンケートに答えたら、フラグが表示された。

dam{y0u_h3cked_7he_pl4n3t}