fglg.py, server.py가 주어진다.

nibelung.zip
2.6 kB

flag 한 바이트씩 나누어 padding을 거쳐 matrixNxN F 에 넣어준다. 그리곤 random인 matrixNxN 인 U를 생성한다.

image

과정으로 encrypted 되고,

image

과정으로 decrypted 된다.

512bit인 p를 랜덤하게 생성하여 mod 값으로 계산된다.

사실 eF를 그대로 decrypt하면 좋지만, 우리는 matrix element에 0부터 255의 값만 넣을 수 있다.

따라서, eF를 그대로 넣지 않고, 한 원소씩 분리하여 생각하여 decrypt하면 풀 수 있다.

image

Nij 는 i행 j열의 element만 1이고, 나머지는 다 0인 행렬이다. 이 행렬은 element 값이 1 또는 0 이므로 decrypt한 값을 구할 수 있다.

image

Exploit Code

from pwn import *
from fglg import FiniteGeneralLinearGroup
from Crypto.Util.number import *
import base64

def make_list():
    s.recvuntil('[')
    l = []
    for i in range(6):
        a = s.recvline().replace('[', '').replace(']', '').replace(' ', '').replace('\n', '')
        a = a.split(',')
        for j in range(6):
            l.append(int(a[j]))

    return l

def change2fglg(NN):
    X = FiniteGeneralLinearGroup(n, p)
    for i in range(6):
        for j in range(6):
            X.set_at((j, i), NN[6*i+j])
    return X

def Dec(data):
    s.sendlineafter('> ', '2')
    s.sendlineafter('Data: ', base64.b64encode(data))

s=remote('18.179.178.246', 3002)
#s=process(['python3', 'server.py'])

n = 6
eF = make_list()

s.recvuntil('p = ')
p = int(s.recvline()[:-1])
FLAG = FiniteGeneralLinearGroup(n, p)
eF = change2fglg(eF)

for i in range(6):
    for j in range(6):
        print i, j
        a = b'\x00'*(6*i+j)+'\x01'+'\x00'*(36-6*i-j-1)
        Dec(a)
        NN = make_list()
        N = change2fglg(NN)
        FLAG = FLAG + N * eF.get_at((j,i))

flag = ''
for i in range(6):
    for j in range(6):
        flag += chr(FLAG.A[i][j])

print flag
s.interactive()

Capture the Flag

image

+ Recent posts