Tags: prng 

Rating:

#!/usr/bin/env python3

from pwn import *

if args.REMOTE:
    p = remote('0.cloud.chals.io', 11444)
else:
    p = process('./chal.py', stdin=PTY)

# Generate Gray Codes
# Taken from https://stackoverflow.com/questions/38738835/generating-gray-codes


def gen_codes():
    n = 10
    gray_codes = []
    for i in range(0, 1 << n):
        gray = i ^ (i >> 1)
        if gray < 1000:
            gray_codes.append(gray)
    info("Generated Gray Codes")
    return gray_codes


def login():
    user = b'mgrey'
    passwd = b'1515'
    p.recvuntil(b'Username:')
    p.sendline(user)
    p.recvuntil(b'Password:')
    p.sendline(passwd)
    info('Sent username and password')


def send_code(code):
    p.recvuntil(b'Enter Code')
    c = str(code).zfill(3).encode()
    p.sendline(c)
    p.recvline()
    r = p.recvline()
    if b"Correct" in r:
        info(f"CORRECT CODE FOUND: {c}")
        return True
    else:
        return False


def main():
    gray_codes = gen_codes()
    login()
    codes_cracked = 0
    while codes_cracked < 15:
        for i in gray_codes:
            if send_code(i):
                codes_cracked += 1
                break
    p.interactive()


if __name__ == "__main__":
    main()```
Original writeup (https://github.com/tj-oconnor/cyber-open-2022/blob/main/crypto/greys/solver.py).