CTF toolkit: lib (net, crypto_utils), templates per category, scaffold, cheatsheet, ps_and_qs example

This commit is contained in:
asepharyana
2026-08-16 21:55:22 +07:00
commit dd45833322
25 changed files with 736 additions and 0 deletions
BIN
View File
Binary file not shown.
+43
View File
@@ -0,0 +1,43 @@
"""
EXAMPLE: SECCON 2017 Quals — "Ps and Qs" (Crypto, 200p)
https://github.com/p4-team/ctf/tree/master/2017-12-09-seccon-quals/crypto_ps_and_qs
VULN: Two RSA public keys (pub1.pub, pub2.pub) share a prime (common factor).
FACT: gcd(n1, n2) = p -> recover q1 = n1/p, q2 = n2/p -> private keys -> decrypt.
Run:
cd /home/code/ctfkit
python3 examples/ps_and_qs.py
Expected flag: SECCON{1234567890ABCDEF}
"""
import sys
from Crypto.PublicKey import RSA
from Crypto.Util.number import long_to_bytes
sys.path.insert(0, "/home/code/ctfkit")
from lib.crypto_utils import gcd, modinv
HERE = __file__.rsplit("/", 1)[0]
def main():
pub1 = RSA.importKey(open(f"{HERE}/pub1.pub").read())
pub2 = RSA.importKey(open(f"{HERE}/pub2.pub").read())
p = gcd(pub1.n, pub2.n)
q1 = pub1.n // p
q2 = pub2.n // p
assert p * q1 == pub1.n and p * q2 == pub2.n, "common-factor failed"
msg = int.from_bytes(open(f"{HERE}/cipher", "rb").read(), "big")
d1 = modinv(pub1.e, (p - 1) * (q1 - 1))
pt = long_to_bytes(pow(msg, d1, pub1.n)).decode(errors="replace")
import re
m = re.search(r"SECCON\{[^}]+\}", pt)
flag = m.group(0) if m else pt
print("shared prime p =", p)
print("FLAG =", flag)
return flag
if __name__ == "__main__":
main()
+14
View File
@@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz8+77qffFDqKwgixqh0v
hlRaxMtYjJSj+xwUrZGk8Lk2FXxaS4acGKi4ZPRya/j83AIMtBBCuslnhKt9A/k3
SUfvsLw9Zlgxl0NAFZ/8PbfI50tjkP2m7sMLgcb/Yk6NP1sXv7elx//Y7PTmUYs5
Or793Q+uukMIdGumP4EGtZ1+BYlDoAExp9TlOMRksnBXdkftvEeMwc6Vhe/odzBb
OnwufETbVHXt2tw0WiyQqUZ3HKwKRUzby0YfKEDnYTyD6c7MlAN/oJu52qPxgFYs
Ad8L5sUfDAbo8OLW4aXlDQoow4gRQHcKn0WTQUa381m5Oc4j8PpQem9ORUVxQwlS
ADwg8dl6ZxQLbl/L+zs3bk4klprrHUic/HKvTxWkeIoaqXyJdW0dTZSqR+fNOoGu
y5JEjMksd9LvV2qg28E1CGKszdrdvOgDV/DNW4VN0PjEYn/ktxiyTs/hHtJMO+Iv
AGQ7vtTuXjRa8Xblt20jovgODsbzTlcYxipw/lVwwouAe0TyLq3r2bX/kG9qhb6I
wMj25fiApR8X+E2xwu7+qK80BAREztGjffDk9fcsw/ULfkJ8jC2LYYbq12LwxESz
yjoBA+0SqTvOnK50eaIp67wKZI6qb5flBRpm6wnr1zSOkvdfEl69w2fip9Had1nU
H64uJjW/S3p/kb7Ks6x9Bb0CAwEAAQ==
-----END PUBLIC KEY-----
+14
View File
@@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuzPMf8yOyvO/ntlcWDeS
4exrgO6HXsIGTbzwdZXINEkjv1NlJNTgp1V0x3mMc7GX3SsbQgVLHknLRfvwTm8R
TPijZcPfNkVST3eCaAOKP6JoAunR7b+7Xt+1oMN1Nw1/EPV9q71Pdx2tNjLwG5vO
EEiZZu6ILasXozt4aqX3MWWlQFEwCx35KAOSo+3p0/ycTYpqBjUfbvNZjo3is507
Ga9koXFs0Vgmw/JMsT3rciw6A+8dK+LQpabiEP9dAYNnvjv5nqJroAblFkpN1Vqr
zUSd5c4YZIJdwWDlDVCesOb+cj7xgmge3blAhLg+yeLpQ+h8uHUJqw/Zscoiwc6v
85/Kz2cp/A4FeGcNh9fw+cy+Ccs+Es64lVcqmXnRC/2/r6JgVo2NsYS+ErPjGT4H
cpzjwdnNgoPtaYOgY4gDagpwKU8jOSlEd4KA596fYBY6gVDjD/Sk6gJ5LL6DBbqi
6Zr+UeF9r8Vr4NOEFHvNOOnRKTTscSYiIXdzpLOFGpsMbHw+AfYRGh4aVX9OKuSi
R86bdczMsYGYJfMFSqHAVb0+I0AJOuLvHQ+loXaCXv33lQcCf1EECAAJFC8NQ+Lx
DPrSIIE7u5AU1PQyXtrFOPtegrdT4q07JGB9c4CqZPy5i1nqi1pza4CTgySM7OCx
clXqVZ6QEn93ivbX6KZtrZECAwEAAQ==
-----END PUBLIC KEY-----