PCTF morset writeup

Crypto & Math

2016.04.20 04:46




문제 서버에 연결을 하면 다음과 같이 첫번째 긴 모스부호가 날아오고 무언가를 입력하면 두번째 모스부호가 날아오고 연결이 끊긴다.

첫번째 모스부호를 해독해서 맞춰도 마찬가지로 끝난다.

근데 첫번째모스부호는 계속 바뀌는데 두번째 모스부호는 계속 그대로다.


처음에는 몰랐는데 해독된 문자들을 보면 숫자와 대문자 Z까지 말고는 다른 문자가 없다.

숫자 (10)+ 영문자(26) 해서  base36으로 암호화 된거로 볼 수 있다.




base36으로 decrypt하면 다음과 같은 문자열이 나온다.

SHA256을 해야하는 문자열은 매번 다르다.

따라서 저 부분을 SHA256으로 encrypt 하여 보내면 서버에서 flag가 온다.




from pwn import *

enc_table ={
"A" : ".-", "B" : "-...", "C" : "-.-.", "D" : "-..",
"E" : ".", "F" : "..-.", "G" : "--.", "H" : "....",
"I" : "..","J" : ".---","K" : "-.-","L" : ".-..",
"M" : "--","N" : "-.","O" : "---","P" : ".--.",
"Q" : "--.-","R" : ".-.","S" : "...","T" : "-",
"U" : "..-","V" : "...-","W" : ".--","X" : "-..-",
"Y" : "-.--","Z" : "--..",'0': '-----','1': '.----',
'2': '..---','3': '...--','4': '....-','5': '.....',
'6': '-....','7': '--...','8': '---..','9': '----.',
}

v = enc_table.values()
k = enc_table.keys()
dec_table = {}
for x, y in zip(v, k) :
	dec_table[x] = y

def base36encode(number) :
	ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	base36 = ''
	sign = ''
	if number < 0:
		sign = '-'
		number = -number
	if 0 <= number < len(ALPHABET):
		return sign + ALPHABET[number]
	while number != 0:
		number, i = divmod(number, len(ALPHABET))
		base36 = ALPHABET[i] + base36
	return sign + base36

def base36decode(number) :
	return int(number, 36)

def morse_decode(input_str) :
	tmp = input_str.split(' ')
	out = ''.join([dec_table[i] for i in tmp])
	return out

def morse_encode(input_str) :
	tmp = input_str
	out = ' '.join([enc_table[i] for i in tmp])
	return out

def server_encode(input_str) :
	tmp = int( sha256sumhex( input_str ).encode('hex'), 16 )
	tmp = morse_encode( base36encode(tmp) )
	return tmp

#decode : decode_morse -> decode(base36) -> toHex -> decode(hex) -> ascii
#encode : (ascii -> sha256 -> toHex ->) encode(hex) -> toDecimal -> encode(base36) -> encode_morse

s = remote('morset.pwning.xxx', 11821)
recv_msg = s.recvuntil('\n').strip()
decrypt = (hex(base36decode(morse_decode(recv_msg)))[3:]).decode('hex')
print decrypt
tmp = decrypt.split('SHA256(')[1].split(')')[0]
s.sendline(server_encode(tmp))

recv_msg = s.recvuntil('\n').strip()
print (hex(base36decode(morse_decode(recv_msg)))[2:]).decode('hex')




ㅇㅇ!