SECCON Beginners CTF 2020 Writeup (Noisy equations)
자신이 해결한 Noisy equations의 해법을 공유합니다. 수학적인 곳이 매우 흥미롭고, 해결되고 재미있었습니다!
Noisy equations
문제
이하의 서버측의 코드가 주어지고 있어, 그 서버에 접속하면 coeffs
(와)과 answers
(이)가 돌아온다고 하는 것입니다.
난수가 사용되므로 매번 다른 결과가 반환됩니다.
server.pyfrom os import getenv
from time import time
from random import getrandbits, seed
FLAG = getenv("FLAG").encode()
SEED = getenv("SEED").encode()
L = 256
N = len(FLAG)
def dot(A, B):
assert len(A) == len(B)
return sum([a * b for a, b in zip(A, B)])
coeffs = [[getrandbits(L) for _ in range(N)] for _ in range(N)]
seed(SEED)
answers = [dot(coeff, FLAG) + getrandbits(L) for coeff in coeffs]
print(coeffs)
print(answers)
해법
코드를 읽으면 다음과 같은 것을 알 수 있습니다.
A_ix + b = y_i
A는 coeffs
, x는 FLAG
, b는 seedで固定されたgetrandbits(L)
, y는 answers
입니다. A에 관해서는 난수가 고정되어 있지 않기 때문에 실행할 때마다 값이 바뀝니다.
이것을 두 번 얻으면 x를 구할 수 있습니다.
A_1x + b = y_1\\
A_2x + b = y_2\\
\Rightarrow (A_1-A_2)x = y_1-y_2\\
\Rightarrow x = (A_1-A_2)^{-1}y_1-y_2\\
다음 코드로 FLAG를 얻을 수 있습니다.
solver.pyimport numpy as np
from sympy import Matrix
A1 = Matrix([[123123..., ...], ...])
y1 = Matrix([123123..., ...])
A2 = Matrix([[123123..., ...], ...])
y2 = Matrix([123123..., ...])
A = (A1-A2)
y = (y1-y2)
soln = A.LUsolve(y)
print(''.join([chr(s) for s in soln]))
\Rightarrow ctf4b\{r4nd0m\_533d\_15\_n3c3554ry\_f0r\_53cur17y\}
팀 멤버·운영의 여러분 수고하셨습니다.
Reference
이 문제에 관하여(SECCON Beginners CTF 2020 Writeup (Noisy equations)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/souring001/items/a23d7543d74ca4ae0e69
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from os import getenv
from time import time
from random import getrandbits, seed
FLAG = getenv("FLAG").encode()
SEED = getenv("SEED").encode()
L = 256
N = len(FLAG)
def dot(A, B):
assert len(A) == len(B)
return sum([a * b for a, b in zip(A, B)])
coeffs = [[getrandbits(L) for _ in range(N)] for _ in range(N)]
seed(SEED)
answers = [dot(coeff, FLAG) + getrandbits(L) for coeff in coeffs]
print(coeffs)
print(answers)
A_ix + b = y_i
A_1x + b = y_1\\
A_2x + b = y_2\\
\Rightarrow (A_1-A_2)x = y_1-y_2\\
\Rightarrow x = (A_1-A_2)^{-1}y_1-y_2\\
import numpy as np
from sympy import Matrix
A1 = Matrix([[123123..., ...], ...])
y1 = Matrix([123123..., ...])
A2 = Matrix([[123123..., ...], ...])
y2 = Matrix([123123..., ...])
A = (A1-A2)
y = (y1-y2)
soln = A.LUsolve(y)
print(''.join([chr(s) for s in soln]))
\Rightarrow ctf4b\{r4nd0m\_533d\_15\_n3c3554ry\_f0r\_53cur17y\}
Reference
이 문제에 관하여(SECCON Beginners CTF 2020 Writeup (Noisy equations)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/souring001/items/a23d7543d74ca4ae0e69텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)