워게임/HackTheBox

[HackTheBox] BabyEncryption - 암호학 / Python

SecurityMan 2023. 1. 29. 11:00

 

HackTheBox 에서 제공하는 암호학 문제

 

난이도는 그렇게 어렵지 않긴 한데.. 그렇다고 마냥 쉽지많은 않다.

 

HackTheBox 는 난이도 역치가 높은것 같다.

 

반응형

 

 

문제에서 제공되는 것은 chall.py 와 msg.enc 파일이다.

 

 

먼저 chall.py 의 내용을 보면 

 

암호화 하는 알고리즘을 보여준다.

 

encryption 함수에서 msg 를 인수로 받아

 

각 글자 * 123 + 18 한 값을 256 으로 나눈 나머지를 ct 배열에 저장하고 있다.

 

모든 값을 암호화하면 msg.enc 파일을 생성해 거기에 저장하고 끝이 난다.

 

6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921

 

msg.enc 파일의 내용은 위와 같다.

 

암호화된 msg.enc 파일의 내용을 가지고

 

복호화해서 뭔래 평문이 무엇이었는지 알아내는 문제이다.

 

import string

def encryption(msg):
    ct = []
    for char in msg:
        ct.append((123 * char + 18) % 256)
    return ct

num = []
for i in range(256):
    num.append(i)

ct = encryption(num)

enc = '6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921'
new = []

for i in range(int(len(enc)/2)):
    new.append(int(enc[i*2:(i*2)+2],16))

flag = []

for i in range(len(new)):
    for j in range(len(ct)):
        if new[i] == ct[j]:
            flag.append(chr(num[j]))
            
print(''.join(flag))

 

조금 단순하게 생각하고 코드를 짰다.

 

먼제 num 이라는 배열을 하나 만들어서

 

여기에 1부터 255까지 숫자를 집어넣는다.

 

255 까지 집어넣는 이유는 encryption 함수에서 % 256 을 계산하기 때문이다.

 

그다음 num 배열을 encryption 함수를 사용해 암호화한 뒤, 

 

그 값을 ct 변수에 넣어준다.

 

new 배열을 하나 더 만들어서

 

거기엔 enc 에 들어있는 암호문을 두글자씩 잘라서 넣어준다.

 

마지막으로 이중 for문을 이용해 new 배열의 값과 ct 배열의 값을 비교하면서

 

같은 값이 있을 경우 num 배열에서 그 값을 가져와 chr 형으로 변환시켜 준다.

 

모든 경우의 수를 다 시도해보고, 일치하는 케이스가 식별되면 하나씩 저장하는 방식이다.

 

 

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

반응형