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 형으로 변환시켜 준다.
모든 경우의 수를 다 시도해보고, 일치하는 케이스가 식별되면 하나씩 저장하는 방식이다.
코드를 실행시키면 플래그를 찾을 수 있다.
'워게임 > HackTheBox' 카테고리의 다른 글
[HackTheBox] Eternal Loop - MISC / Shell script / John the Ripper (46) | 2023.03.15 |
---|---|
[HackTheBox] Blackhole - 포렌식 / Steghide (56) | 2023.03.12 |
[HackTheBox] Weather App - 웹해킹 / SSRF / SQL Injection (70) | 2023.01.05 |
[HackTheBox] Easy Phish - OSINT / nslookup / dig (74) | 2022.12.28 |
[HackTheBox] Canvas - MISC / Javascript Deofuscator (74) | 2022.12.20 |