[Revesing] - encryption_with_matrices
Python 형태로 나오는 리버싱 문제는 처음 접해 기록을 남기려고 한다. 해당 문제를 열었는데 아래와 같은 python 코드가 주어진다.
flag = 'REDACTED'
rand = '瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆瀆'
def str_to_matrix(string):
for i in range(2):
letter = ord(string)
flag_mat = [letter,letter]
return flag_mat
final_flag_matrix = []
for i in flag:
final_flag_matrix.append(str_to_matrix(i))
leet_matrix = []
for i in rand:
leet_matrix.append(str_to_matrix(i))
enc_flag_matrix = []
for i in final_flag_matrix:
x = int(i[0]) * int(i[1])
enc_flag_matrix.append(x)
enc_leet_matrix = []
for i in leet_matrix:
y = int(i[0]) * int(i[1])
enc_leet_matrix.append(y)
print(f'leet={enc_leet_matrix}')
print('='*80)
final_ct = []
for i in range(len(enc_leet_matrix)):
final_ct.append(enc_leet_matrix[i]*enc_flag_matrix[i])
print(f'ct={final_ct}')
#ct=[21629584900, 4118558976, 4118558976, 17167812676, 26606176996, 27044131401, 5407396225, 19334346304, 4291953169, 23640600025, 16132810225, 23640600025, 17519963769, 19334346304, 4649466969, 21238107289, 4649466969, 16132810225, 24053528464, 4118558976, 4118558976, 20465877481, 16132810225, 21238107289, 4649466969, 16132810225, 21238107289, 4118558976, 23231246724, 4649466969, 16132810225, 24053528464, 19334346304, 4833586576, 21629584900, 16132810225, 18597867876, 4291953169, 24890110756, 4649466969, 16132810225, 19334346304, 4118558976, 24470032041, 23231246724, 23640600025, 16132810225, 24053528464, 4118558976, 16132810225, 21238107289, 4833586576, 20465877481, 4649466969, 16132810225, 4833586576, 21629584900, 17875690000, 16132810225, 5021281321, 16132810225, 21238107289, 4291953169, 21629584900, 24470032041, 24053528464, 4649466969, 23640600025, 16132810225, 24053528464, 4118558976, 16132810225, 23640600025, 4118558976, 20850204816, 24890110756, 4649466969, 16132810225, 25740993600, 8265719056, 8265719056, 27930765625]
위에 코드를 해석해보면 아래와 같은 흐름이 나온다.
- flag, rand 의 값을 제곱
- flag 제곱 값과 rand의 제곱 값을 곱하여 출력
rand에 입력된 값을 보면 특수문자가 반복되어 입력이 된 것을 확인할 수 있다. 여기서 추측 할 수 있는건 특수문자가 모두 동일하고, final_ct에 출력한 값의 최대 공약수를 구하면 특수문자의 값을 구할 수 있을 것으로 추측 했다. 최대 공약수를 계산해보면 1337^2이라는 것을 확인할 수 있었고, 아래와 같은 코드를 만들어 flag를 구할 수 있었다.
ct = [21629584900, 4118558976, 4118558976, 17167812676, 26606176996, 27044131401, 5407396225, 19334346304, 4291953169, 23640600025, 16132810225, 23640600025, 17519963769, 19334346304, 4649466969, 21238107289, 4649466969, 16132810225, 24053528464, 4118558976, 4118558976, 20465877481, 16132810225, 21238107289, 4649466969, 16132810225, 21238107289, 4118558976, 23231246724, 4649466969, 16132810225, 24053528464, 19334346304, 4833586576, 21629584900, 16132810225, 18597867876, 4291953169, 24890110756, 4649466969, 16132810225, 19334346304, 4118558976, 24470032041, 23231246724, 23640600025, 16132810225, 24053528464, 4118558976, 16132810225, 21238107289, 4833586576, 20465877481, 4649466969, 16132810225, 4833586576, 21629584900, 17875690000, 16132810225, 5021281321, 16132810225, 21238107289, 4291953169, 21629584900, 24470032041, 24053528464, 4649466969, 23640600025, 16132810225, 24053528464, 4118558976, 16132810225, 23640600025, 4118558976, 20850204816, 24890110756, 4649466969, 16132810225, 25740993600, 8265719056, 8265719056, 27930765625]
tmp =''
for i in ct:
tmp+=(chr(int((i/1787569)**(1/2)))) # 제곱근을 구하면된다! 1787569는 제곱근을 추측해서 구했다.
print(tmp)