티스토리 뷰

최종 수정: 2015-11-08

hackability@TenDollar


안녕하세요. Hackability 입니다.


이번에 포스팅 할 내용은 2015 School CTF 의 Crypto 200 문제 입니다.


이 문제에서는 아래 파이썬 코드를 하나 제공합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from base64 import b64encode as encode
from base64 import b64decode as decode
import urllib2
 
def encrypt(key,message):
    result = ""
    for i in range(0,len(message),len(key)):
        message_part = message[i:i+len(key)]
        for pair in zip(message_part,key):
            result += chr(ord(pair[0])^ord(pair[1]))
    return result
 
def decrypt(key,message):
    return encrypt(key,message)
 
secret_url = "WxUHCWVfbwQERE8bDSsdbgcYHAVBQGdJchdAUARCGmgTckRCUlcQSG8RJUpAAwQQGGwSbhsHXg0="
key = raw_input("Please enter the key to decrypt necessary data:\n")
 
try:
    response = urllib2.urlopen(decrypt(key, decode(secret_url)))
    with open('flag','w') as f:
        f.write(response.read())
except:
    print "Something goes wrong, sorry!"
cs

문제를 보면 secret_url은 어떤 키와 섞여서 base64로 인코딩 되었음을 알수 있고 이를 복호화 하면 어떤 url 이 나옴을 알 수 있습니다.

먼저 secret_url을 decode 하면 헥사 스트링으로
5b150709655f6f0404444f1b0d2b1d6e07181c05414067497217405004421a6813724442525710486f11254a40030410186c126e1b075e0d

이런 값이 나옵니다. 이렇게 나온 헥사 스트링은 추후에 h = hexstring.decode('hex') 형태로 바꿔주게 되면 이쁘게 쓸 수 있습니다.

중요한것은 decrypt 함수에서 제가 입력한 key 값을 바탕으로 decrypt 되게 되는데 그러면 제가 key 값을 유추 해야 합니다.

한 가지 힌트는 urlopen 으로 들어 가는 인자 이기 때문에 http:// 어쩌구 이거나 http://www 어쩌구, https:// 어쩌구 등등이 될 수 있습니다.

그러면 키 길이를 7 글자라고 가정 하면 우리가 처음에 나와야 하는 스트링(http://)을 알고 있기 때문에 암호화 로직의 반대 역할을 하는 로직을 짜서 계산 합니다. 위의 암호 로직은 간단히 키와 평문을 xor 시키는 것이였으므로 우리는 반대로 암호 메시지와 http:// 스트링을 xor 시키면 됩니다. 그러면 다음과 같습니다.

h = hexstring.decode('hex')
key_str = "http://"
for i in range(0, 7):
  print chr( h[i] ^ ord(key_str[i]) )

3asy_p@ 라는 글자가 나옵니다. 이 글자를 key 로 이용하여 decrypt를 시도해봅니다.

http://7e76D}k. taCu s : H0 7#i L q3$i Q +3z[`X_s bX.M

음.... 이 글자는 우리가 원하는 글자가 아닌것 같습니다. 그렇다면 우리가 구한 키 길이가 부족하다는 뜻 입니다. 1글자를 더 유추해서 찾아 봅니다. 

http://www. 라고 html 을 가정한다면 앞에 w 를 넣어서 http://w 를 복호문으로 생각해서 다시 구해봅니다.

3asy_p@s 라는 글자가 나옵니다. 이 글자를 key 로 이용하여 decrypt를 시도해봅니다.

'P;\pV3 sDc+
a Dw ~

음 -_-;;;;;;;; 아직도 키 길이가 부족합니다. 한글자 더 넣습니다. 이번엔 http://ww 까지 합니다.

3asy_p@ss 라는 글자가 나옵니다. 이 글자를 key 로 이용하여 decrypt를 시도해봅니다.


정상적인 url 이 떨어졌네요. 이 url로 들어 가면 flag 를 확인 할 수 있습니다.

"Flag is: remember_the_plaintext"


댓글