def main():
    n, e, d = genkeys()

    while True:
        menu()
        option = input('> ')
        if option == '1':
            c = pow(flag, e, n)
            print(f'c = {c}')
            print(f'n = {n}')
        elif option == '2':
            c = int(input('c = '))
            m = pow(c, d, n)
            print(f'm = {m % 3}')
        else:
            return

rsa 문제이다.

c의 원하는 값을 넣어서 나오는 m(mod 3)을 알 수 있다. rsa의 준동형사상 성질을 이용하자.

c 대신 c*(1/3)^e를 넣는다면 (1/3)m이 나오는 것을 통해 m을 삼진수로 표현하였을 때 한 비트씩 알아낼 수 있다.

Exploit Code

from pwn import *
from Crypto.Util.number import *

p = remote('bamboofox.cs.nctu.edu.tw', 25001)
p.sendlineafter('> ', '1')
p.recvuntil('c = ')
c = int(p.recvline())
p.recvuntil('n = ')
n = int(p.recvline())

e = 65537

i = 0
b = 0
m = 0
while True:
    value = c * pow(inverse(3, n), i*e, n) % n
    p.sendlineafter('> ', '2')
    p.sendlineafter('c = ', str(value))
    p.recvuntil('m = ')
    a = (int(p.recvline()[:-1]) - b) % 3
    b = (b+a)*inverse(3,n) % n
    m = m+pow(3, i)*a
    print long_to_bytes(m)
    i += 1

Capture the Flag

image


'Writeup [crypto] > CTF 대회 기출' 카테고리의 다른 글

[PlaidCTF 2019] R u SAd?  (0) 2020.03.08
[OverTheWire Advent 2019] Santa's Signature  (0) 2020.03.08
[HITCON 2019] Lost Modulus Again  (0) 2020.03.08
[CSAW Quals 2017] BabyCrypt  (0) 2020.03.08
[Codegate CTF 2018] rsababy  (0) 2020.03.08

+ Recent posts