Real name : 장재영
Nickname : BORAMAE
Place : 24th
Points : 1394
Division : Junior (Sunrin internet high school)
첨부된 파일에서 압축 해제시 2개의 파일이 나오게 됩니다. main.py
와 calc.pyc
입니다.
우선 calc.pyc
를 디컴파일 해보겠습니다. 파이썬 버전은 3.10 입
MOD = 256
def KSA(key):
key_length = len(key)
S = list(range(MOD))
j = 0
for i in range(MOD):
j = (j + S[i] + key[i % key_length]) % MOD
S[i] = S[j]
S[j] = S[i]
return S
def PRGA(S):
pass
# WARNING: Decompyle incomplete
def get_keystream(key):
S = KSA(key)
return PRGA(S)
def cipher(text):
key = 'neMphDuJDhr19Bb'
key = (lambda .0: [ ord(c) ^ 48 for c in .0 ])(key)
keystream = get_keystream(key)
text = text[-2:] + text[:-2]
res = []
for c in text:
val = c ^ next(keystream)
res.append(val)
return bytes(res)
코드를 추정한 결과 rc4 암호임을 알 수 있었습니다.
https://github.com/manojpandey/rc4/blob/master/rc4-3.py
해당 레포지토리 일부 인용해서 PRGA 함수를 추측하고, 복호화 알고리즘을 짜보겠습니다.
MOD = 256
def KSA(key):
key_length = len(key)
S = list(range(MOD))
j = 0
for i in range(MOD):
j = (j + S[i] + key[i % key_length]) % MOD
S[i], S[j] = S[j], S[i] # 두 항목의 위치를 서로 바꿉니다 (원래 코드는 잘못 구현되었었습니다).
return S
def PRGA(S):
i = 0
j = 0
while True:
i = (i + 1) % MOD
j = (j + S[i]) % MOD
S[i], S[j] = S[j], S[i]
K = S[(S[i] + S[j]) % MOD]
yield K
def decipher(ciphertext):
key = 'neMphDuJDhr19Bb'
key = [ord(c) ^ 48 for c in key]
S = KSA(key)
keystream = PRGA(S)
res = []
for c in ciphertext:
val = c ^ next(keystream)
res.append(val)
res = res[2:] + res[:2]
return bytes(res)
if __name__ == '__main__':
ciphertext = b"A\\xd3\\x87nb\\xb3\\x13\\xcdT\\x07\\xb0X\\x98\\xf1\\xdd{\\rG\\x029\\x146\\x1ah\\xd4\\xcc\\xd0\\xc4\\x14\\xc99'~\\xe8y\\x84\\x0cx-\\xbf\\\\\\xce\\xa8\\xbdh\\xb7\\x89\\x91\\x81i\\xc5Yj\\xeb\\xed\\xd1\\x0b\\xb4\\x8bZ%1.\\xa0w\\xb2\\x0e\\xb5\\x9d\\x16\\t\\xd0m\\xc0\\xf8\\x06\\xde\\xcd"
plaintext = decipher(ciphertext)
print(plaintext)
#codegate2024{da5d6bd71ff39f66b8b7200a92b0116b4f8e5e27d25d6119e63d3266bd4c8508}
codegate2024{da5d6bd71ff39f66b8b7200a92b0116b4f8e5e27d25d6119e63d3266bd4c8508}
해당 문제의 첫 과제는 load_balancing 통과 입니다.