fglg.py, server.py가 주어진다.
flag 한 바이트씩 나누어 padding을 거쳐 matrixNxN F 에 넣어준다. 그리곤 random인 matrixNxN 인 U를 생성한다.
과정으로 encrypted 되고,
과정으로 decrypted 된다.
512bit인 p를 랜덤하게 생성하여 mod 값으로 계산된다.
사실 eF를 그대로 decrypt하면 좋지만, 우리는 matrix element에 0부터 255의 값만 넣을 수 있다.
따라서, eF를 그대로 넣지 않고, 한 원소씩 분리하여 생각하여 decrypt하면 풀 수 있다.
Nij 는 i행 j열의 element만 1이고, 나머지는 다 0인 행렬이다. 이 행렬은 element 값이 1 또는 0 이므로 decrypt한 값을 구할 수 있다.
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
'Writeup [crypto] > CTF 대회 기출' 카테고리의 다른 글
[zer0pts CTF 2020] dirty laundry (0) | 2020.03.17 |
---|---|
[zer0pts CTF 2020] diysig (0) | 2020.03.10 |
[zer0pts CTF 2020] ROR (0) | 2020.03.10 |
[TUCTF 2018] XORientYourself (0) | 2020.03.08 |
[TokyoWesterns CTF 4th 2018] Revolutional Secure Angou (0) | 2020.03.08 |