picoctf/crypto/no_padding_no_problem/solve.py

36 lines
986 B
Python
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3 python3Packages.pwntools python3Packages.pycryptodome
from pwn import *
from Crypto.Util.number import long_to_bytes
def decipher(r: tube, ciphertext: bytes) -> str:
r.recvuntil(b'Give me ciphertext to decrypt: ')
r.sendline(ciphertext)
r.recvuntil(b'Here you go: ')
return r.recvline().strip()
def main():
addr, port, *_ = "mercury.picoctf.net 33780".split(" ")
r = remote(addr, int(port))
r.recvuntil(b'Good Luck!\n\n\n')
n = int(r.recvline().split(b' ')[1].strip())
e = int(r.recvline().split(b' ')[1].strip())
enc = int(r.recvline().split(b' ')[1].strip())
print(f"{n=}")
print(f"{e=}")
print(f"{enc=}")
padding = 2
encrypted_padding = pow(padding, e, n)
payload = (enc * encrypted_padding)
output = decipher(r, str(payload).encode())
flag = long_to_bytes(int(output) // padding).decode()
print(flag)
if __name__ == "__main__":
main()