36 lines
986 B
Python
36 lines
986 B
Python
|
#!/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()
|