0xGame Bytes Oracle
先挂个题目,挂个脚本(官网脚本),解析回头补一下。
import socketserver from Crypto.Util.number import * import os import signal import string from random import * banner = r""" ____ _ ___ _ | __ ) _ _| |_ ___ / _ \ _ __ __ _ ___| | ___ | _ \| | | | __/ _ \ | | | | '__/ _` |/ __| |/ _ \ | |_) | |_| | || __/ | |_| | | | (_| | (__| | __/ |____/ \__, |\__\___| \___/|_| \__,_|\___|_|\___| |___/ """ menu = r""" MENU: 1.GetKey 2.Encrypt 3.Decrypt 4.Quit """ def GenerateRSAKey(): n, phi = 1, 1 for i in range(4): while True: p = getPrime(1000) if isPrime(p): break n *= p phi *= (p - 1) e = getPrime(randint(20, 24)) d = inverse(e, phi) return n, e, d class Task(socketserver.BaseRequestHandler): def _recvall(self): BUFF_SIZE = 9182 data = b'' while True: part = self.request.recv(BUFF_SIZE) data += part if len(part) < BUFF_SIZE: break return data.strip() def printf(self, msg, newline=True): if newline: msg += "\n" self.request.sendall(msg.encode()) def scanf(self, prompt='> '): self.printf(prompt, newline=False) return self._recvall() def handle(self): signal.alarm(1200) self.printf(banner) n, e, d = GenerateRSAKey() flag = _flag flag = bytes_to_long(os.urandom(390) + b" " + flag.encode() + b" " + os.urandom(30)) for ___ in range(1607087): self.printf(menu) try: op = int(self.scanf()) if op == 1: self.printf(f"n={n}") self.printf(f"e={e}") self.printf(f"c={pow(flag, e, n)}") elif op == 2: m = int(self.scanf("Enter your plaintext in decimal format >")) c = pow(m, e, n) msg = long_to_bytes(c).hex()[-2:] self.printf(f"The last byte of your Ciphertext is: {msg}") elif op == 3: c = int(self.scanf("Enter your ciphertext in decimal format >")) m = pow(c, d, n) msg = long_to_bytes(m).hex()[-2:] self.printf(f"The last byte of your Plaintext is: {msg}") else: break except: self.printf("Wrong Input") break self.printf("Quitting...") class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer): pass if __name__ == "__main__": HOST, PORT = '0.0.0.0', 10003 server = ForkedServer((HOST, PORT), Task) server.allow_reuse_address = True print("Server at 0.0.0.0 port " + str(PORT)) server.serve_forever()
完整脚本如下:
from pwn import* from Crypto.Util.number import* io=remote('124.223.224.73',10003) io.recvuntil(b"4.Quit\n") io.sendline(b"1") io.recvuntil(b"n=") n=int(io.recvline()) io.recvuntil(b"e=") e=int(io.recvline()) io.recvuntil(b"c=") c=int(io.recvline()) l,r=0,n t=1 n_ = n % 256 submap = {} for i in range(0, 256): submap[-n_ * i % 256] = i while l<r: if t%30==0: print(t,r-l) d=(r-l)//256 io.recvuntil(b">") io.sendline(b"3") io.recvuntil(b">") io.sendline(str(pow(256,t*e%n,n)*c%n).encode()) io.recvuntil(b": ") k = submap[int(io.recvline(),16)] l, r = l + k*d, l + (k+1)*d t = t+1 print(long_to_bytes(l)) io.interactive()
我是菜鸟,看了答案才会做,呜呜~

浙公网安备 33010602011771号