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