CTF/암호학

[Cyber Security Rumble] Hashfun - 암호학 / XOR / Python

SecurityMan 2022. 12. 21. 11:00

 

Hash 인듯 Hash 아닌 문제

 

조금 헷갈렸는데 어렵지 않게 풀 수 있었다.

 

반응형

 

문제를 보면 FLAG 를 되돌릴 수 있는 방법은 없을거 같다면서

 

파일을 하나 제공한다.

 

from secret import FLAG

def hashfun(msg):
    digest = []
    for i in range(len(msg) - 4):
        digest.append(ord(msg[i]) ^ ord(msg[i + 4]))
    return digest

print(hashfun(FLAG))
# [10, 30, 31, 62, 27, 9, 4, 0, 1, 1, 4, 4, 7, 13, 8, 12, 21, 28, 12, 6, 60]

 

주어진 파일의 내용은 파이썬 코드이다.

 

secret 에서 FLAG 라는 값을 가져와서

 

hashfun(FLAG) 의 수행 결과를 print 해주는 단순한 코드이다.

 

hashfun 함수는 단순히 입력받은 값의 i 와 i+4 번째 값을 XOR 한 뒤 결과를 리턴하는 기능을 한다.

 

[10, 30, 31, 62, 27, 9, 4, 0, 1, 1, 4, 4, 7, 13, 8, 12, 21, 28, 12, 6, 60]

 

맨 아래 주석으로 적혀있는 이 배열이 

 

FLAG 를 hashfun 함수에 집어넣은 결과이다.

 

원래 값을 구하려면 단순하게 역으로 계산해주면 된다.

 

def decode():
    hashfun = [10, 30, 31, 62, 27, 9, 4, 0, 1, 1, 4, 4, 7, 13, 8, 12, 21, 28, 12, 6, 60]
    answer = ['C','S','R','{','','','','','','','','','','','','','','','','','','','','','']
    flag = ''
    
    for i in range(len(hashfun)):
        answer[i+4] = chr(ord(answer[i])^hashfun[i])

    for i in range(len(answer)):
        flag += answer[i]                   

    print(flag)

decode()

 

문제를 푸는 코드는 위와 같다.

 

우선 두개의 배열을 만들어 준다.

 

하나는 아까 문제 코드에서 결과로 나왔던 숫자들로 이루어져 있고, hashfun 이라고 칭한다.

 

하나는 hashfun 배열과 XOR 시킬 answer 배열이다.

 

answer 배열은 hashfun 배열보다 4 만큼 더 긴데

 

암호화를 할때 len(msg) - 4 만큼 연산을 해서 입력보다 출력이 4 만큼 작아지는것을 

 

역으로 계산한 것이다.

 

플래그 포맷이 기본적으로 CSR{ ... } 이라는건 사전 정보로 알고 있기 때문에

 

answer 배열을 맨 앞의 4자리는 C, S, R, { 로 채워준다.

 

그런다음 answer 배열의 맨 앞부터 한글자씩 가져와 ord 함수로 ASCII 코드 값으로 바꿔준 뒤

 

hashfun 배열에 있는 숫자와 XOR 시키고,

 

그 결과값을 answer[4] 부터 차곡차곡 넣어주는 것이다.

 

 

코드를 실행시키면 플래그를 찾을 수 있다.

반응형