HITCON Quals 2015 - puzzleng
08 Nov 2015Next Generation of Puzzle!
puzzleng은 파일을 암호화해주는 프로그램인 encrypt
와 암호화된 파일인 flag.puzzle
두 파일로 구성된 forensic 문제이다.
1. encrypt 분석
encrypt는 간단한 프로그램이다. 암호화 과정은 다음과 같다.
- 주어진 비밀번호를 SHA1 해시하여 얻은 20바이트를 암호화 키로 사용한다.
- 대상 파일을 같은 크기의 20조각으로 나누어 각 조각을 암호화 키의 한 바이트로 xor한다.
2. 파일 헤더 복구
암호화 키에 대한 정보가 하나도 없으므로 직접 모든 경우를 대입해 봐야 한다. 그러나 20바이트를 전부 시도할 수는 없어서 파일 헤더가 있을 것으로 예상되는 첫 번째 블록만 xor해보았다.
from hexdump import hexdump
f = open("flag.puzzle")
raw = f.read()
f.close()
raw = map(ord, list(raw))
L = len(raw)
B = (L + 19) // 20
k = [0]*20
def decrypt():
for i in range(20):
start = i * B
end = min((i+1) * B, L)
for j in range(start, end):
raw[j] ^= k[i]
def dump_block(i):
start = i * B
end = min((i+1) * B, L)
block = raw[start:end]
block = ''.join(map(chr, block))
hexdump(block)
n = 0
for i in range(256):
print "="*40, i
k[n] = i
decrypt()
dump_block(n)
decrypt()
그 결과 키의 첫 번째 바이트가 101일 때 PNG 헤더가 나오는 것을 확인했다.
======================================== 101
00000000: 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 .PNG........IHDR
00000010: 00 00 03 90 00 00 03 90 01 03 00 00 00 75 82 0c .............u..
00000020: 67 00 00 00 06 50 4c 54 45 8f 77 b5 8f 77 b4 6d g....PLTE.w..w.m
00000030: c4 59 ac 00 00 00 02 74 52 .Y.....tR