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()

我是菜鸟,看了答案才会做,呜呜~

posted @ 2022-11-01 16:39  m0feng  阅读(23)  评论(0)    收藏  举报