Information

Real name : 장재영

Nickname : BORAMAE

Place : 24th

Points : 1394

Division : Junior (Sunrin internet high school)


easy_reversing

첨부된 파일에서 압축 해제시 2개의 파일이 나오게 됩니다. main.pycalc.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}


ai_warmup

해당 문제의 첫 과제는 load_balancing 통과 입니다.