sra
This commit is contained in:
25
sra/chal.py
Executable file
25
sra/chal.py
Executable file
@@ -0,0 +1,25 @@
|
||||
from Crypto.Util.number import getPrime, inverse, bytes_to_long
|
||||
from string import ascii_letters, digits
|
||||
from random import choice
|
||||
|
||||
pride = "".join(choice(ascii_letters + digits) for _ in range(16))
|
||||
gluttony = getPrime(128)
|
||||
greed = getPrime(128)
|
||||
lust = gluttony * greed
|
||||
sloth = 65537
|
||||
envy = inverse(sloth, (gluttony - 1) * (greed - 1))
|
||||
|
||||
anger = pow(bytes_to_long(pride.encode()), sloth, lust)
|
||||
|
||||
print(f"{anger = }")
|
||||
print(f"{envy = }")
|
||||
|
||||
print("vainglory?")
|
||||
vainglory = input("> ").strip()
|
||||
|
||||
if vainglory == pride:
|
||||
print("Conquered!")
|
||||
with open("/challenge/flag.txt") as f:
|
||||
print(f.read())
|
||||
else:
|
||||
print("Hubris!")
|
||||
75
sra/sol.py
Executable file
75
sra/sol.py
Executable file
@@ -0,0 +1,75 @@
|
||||
#!python3
|
||||
from sage.all import *
|
||||
from sympy.utilities.iterables import multiset_partitions
|
||||
from pwn import *
|
||||
|
||||
port = 62870
|
||||
conn = remote("saturn.picoctf.net", port)
|
||||
|
||||
conn.recvuntil(b"anger = ")
|
||||
c = Integer(int(conn.recvline()))
|
||||
log.info("received c: {}".format(c))
|
||||
conn.recvuntil(b"envy = ")
|
||||
d = Integer(int(conn.recvline()))
|
||||
log.info("received d: {}".format(d))
|
||||
e = Integer(65537)
|
||||
log.info("preknown e: {}".format(e))
|
||||
|
||||
kN = e*d - 1
|
||||
log.info("kN: {}".format(kN))
|
||||
kN_factors = factor(kN)
|
||||
log.info("factorized kN: {}".format(kN_factors))
|
||||
|
||||
kN_multiset = []
|
||||
for a, b in kN_factors:
|
||||
for i in range(b):
|
||||
kN_multiset.append(a)
|
||||
log.info("generated multiset: {}".format(kN_multiset))
|
||||
|
||||
candidates = []
|
||||
kN_multiparts = multiset_partitions(kN_multiset, 3)
|
||||
iLogger = log.progress("checking multiset partitions")
|
||||
for kN_multipart in kN_multiparts:
|
||||
_x = kN_multipart[0]
|
||||
_y = kN_multipart[1]
|
||||
_z = kN_multipart[2]
|
||||
S = [prod(_x), prod(_y), prod(_z)]
|
||||
S.sort(reverse=True)
|
||||
x, y, z = S
|
||||
if y.nbits() == 128:
|
||||
if x.nbits() == 128:
|
||||
candidates.append((x, y, z))
|
||||
elif z.nbits() == 128:
|
||||
candidates.append((y, z, x))
|
||||
iLogger.success("found {} candidates".format(len(candidates)))
|
||||
solutions = []
|
||||
|
||||
for _p, _q, _k in candidates:
|
||||
if (_p+1).is_prime() and (_q+1).is_prime():
|
||||
p = _p+1
|
||||
q = _q+1
|
||||
N = p*q
|
||||
k = _k
|
||||
solutions.append((p, q, N, k))
|
||||
log.info("found {} solutions".format(len(solutions)))
|
||||
if len(solutions) != 1:
|
||||
log.critical("Too many/little solutions")
|
||||
exit(1)
|
||||
|
||||
p, q, N, k = solutions[0]
|
||||
log.success("p: {}".format(p))
|
||||
log.success("q: {}".format(q))
|
||||
log.success("N: {}".format(N))
|
||||
log.success("k: {}".format(k))
|
||||
m = pow(c, d, N)
|
||||
log.info("decoded message: {}".format(m))
|
||||
m_string = pack(int(m), "all", "big", False)
|
||||
log.info("literal message: {}".format(m_string))
|
||||
|
||||
conn.recvuntil(b"> ")
|
||||
conn.sendline(m_string)
|
||||
|
||||
conn.recvuntil(b"Conquered!")
|
||||
flag = conn.recvuntil(b'}').strip().decode()
|
||||
log.success("flag: {}".format(flag))
|
||||
|
||||
Reference in New Issue
Block a user