Network Forensics Puzzle Contest는 매년 열리는 데프콘에서 이벤트성으로 열리는 챌린지이다. 자세한 대회 소개는 다음 글을 읽어보기 바란다. 

주소  http://maj3sty.tistory.com/1083



[Round 1]

Password : izDEFCONf33ling22?#tSwift


 - 문제 지문

EFCON 2013 Network Forensics Puzzle Contest: From Pyongyang with Love


Thank you for accepting the case. Our Russian comrade has indicated that said documents released by Snowden may contain information about a bribery involving the 2015 Chess Boxing World Title. We've been monitoring Snowden's traffic, and need to know who all is involved. We suspect that there is a list of usernames, and we would like you to tell us who is the second name on the list. 

Use the Round 1 packet capture in this folder to learn more about the case and answer the following question: 


What is the second name on the list of usernames? 


문제 지문을 보면, 스노덴의 트래픽을 감시하여 유저명의 목록을 획득하려고 하는데, 가장 중요하게 얻으려 하는 유저명은 목록 중 두 번째의 유저명이다. 유저명은 텍스트 또는 파일로 스노덴이 다른 사람에게 전송할 가능성이 많으므로, 먼저 전송되는 파일들을 살펴본다.


[그림 1 - SMB 프로토콜로 전송되는 파일 목록]


SMB 프로토콜로 전송되는 파일 오브젝트들을 보면 Documents.zip 파일이 존재한다. 해당 파일을 해제하면 다음과 같이 여러 폴더와 파일들이 나오는데, 파일들의 내용은 모두 base64 인코딩 방식으로 인코딩되어 있어 인코딩을 해제해야만 문서의 내용을 획득할 수 있다.


[그림 2 - 인코딩되어 있는 docx 내용]


그 중 track6.docx 파일의 내용을 디코딩하면 다음과 같은 목록을 획득 할 수 있다.


The Mystery of Chess Boxing:

(usernames)


Mr. Method

Kim Ill-Song

Mr. Razor

Mr. Genius

Mr. G. Killah

Matt Cassel

Mr. I. Deck

Mr. M Killa

Mr. O.D.B.

Mr. Raekwon

Mr. U-God

Mr. Cappadonna (possibly)

John Woo?

Mr. Nas


두 번째 유저명이므로 답은 "Kim Ill-song" 이다.

Answer : Kim Ill-song


[Round 2]

Password : #pshth@twaSteh3@$y1#


 - 문제 지문

We see that North Korea is in the running for hosting next year's title fight. Kim Ill-song might be exactly who we are looking for. We've taken a capture of Mr. Kim Ill-song's network traffic, and we see that he's been communicating with many people from different countries. We suspect that he is among those making bribes, but we need proof. Cash is relatively easy to move, but we've got word that one of the bribes was something else. Voting for the hosting city begins soon. 

Use the Round 2 packet capture in this folder to learn more about the case and answer the following question: 


What city's official is accepting a non-cash bribe?


이번에는 김일성이 제공한 뇌물을 받은 도시의 관계를 찾는 것이다. 패킷의 대부분은 IRC 패킷으로 이루어져 있어 TCP 스트림을 살펴보면 IRC 메시지를 모두 살펴 볼 수 있다.

IRC 메시지 중 PRIVMSG로 'Killah'란 닉네임을 가진 사용자에게 인코딩된 메시지를 전송하는 것이 여럿 보인다. 해당 메시지는 처음에는 base64로 인코딩되어 있으며, 그 다음에는 base32로 인코딩되어 있다. 인코딩을 모두 풀고나면 다음과 같이 md5 hash 값이 보인다.


[그림 3 - base32 디코딩 모습]


획득한 md5 hash 값을 크랙하면 다음과 같은 값이 나온다.

[그림 4 - md5 cracker]


Answer : Caracas


[Round 3]

Password : Ib3tuth0ughtQat@r&&


 - 문제 지문

Thank you for getting that information to us. We can clearly see that the briber, Ill-song, is communicating with the official from Caracas to set up a non-cash bribe. We need more than that, however. We need an idea of what Ill-song is using to bribe the official. Look through this capture and see if you can find out what the non-cash bribe is. Please hurry, the voting is about to begin! 

Use the Round 3 packet capture in this folder to learn more about the case and answer the following question: 


What is the non-cash bribe? 


이번에는 김일성이 제공한 뇌물을 특정하는 문제이다. 패킷 파일을 열어보면 수많은 패킷들이 있어, 프로토콜로 일단 분석 포인트를 찾아보았다. 


[그림 5 - 프로토콜 정렬]


프로토콜을 기준으로 해당 패킷 파일에는 총 3개의 프로토콜이 존재한다. http, https, FTP가 그것인데, FTP의 내용을 보면 zip 파일을 전송하는 것을 볼 수 있다.


[그림 6 - FTP 내용]


zip 파일은 간단히 시그니처 카빙을 통해 추출하면 다음과 같은 파일들을 획득 할 수 있다.



[그림 7 - 카빙한 zip 파일 내용]


'sandofwhich.zip' 파일 말고도 여러 압축 파일들이 존재한다. 해당 파일들을 모두 카빙하면 동일하게 '.jpg' 확장자 파일들이 나오는데, 해당 파일들의 제목을 이어 붙이면 다음과 같은 문장이 만들어진다.


"I can’t in good conscience allow the U.S. government to destroy privacy, internet freedom and basic liberties for people around the world with this massive surveillance machine they’re secretly building."


그림 파일들을 보면 몇개의 파일들은 깨져보이며, 대부분의 파일들이 정상적으로 이미지를 보여주지 않는다. 위 문장의 처음인 "I"와 "building" 문자열의 파일을 보면 그림 파일의 헤더 시그니처와 푸터 시그니처를 가지고 있는 것을 볼 수 있다. 그러므로 각 단어들 제목의 파일 바이너리 데이터를 하나의 파일로 합쳐 보면 다음과 같은 이미지를 만들 수 있다.


[그림 8 - 조립된 이미지]


Answer : Chess Set


[Round 4]

Password : h0wd1dug3tth@t1?%


 - 문제 지문

Unfortunately, you were not quick enough and Pyongyang has been chosen for the Chess Boxing World Title. Furthermore, the chess set you uncovered was one of a very limited set and is incredibly expensive. To be frank, we're not sure how Kim Ill-song has the resources to obtain it. We've begun looking into Ill-song, but we can't seem to find anything on the guy. Rumor has it that he's trying to communicate with a particular individual, but we need to find out who and why. This capture shows him talking with someone else, but we're not sure how or what's being said. We need information on Ill-song before we can move on to his partner. Can you get us the device name of Ill-song's computer? 

Use the Round 4 packet capture in this folder to learn more about the case and answer the following question: 


What is the device name of Ill-song's computer?


김일성 컴퓨터의 이름을 파악하는 문제이다. 패킷 파일을 보면 기본적으로 http, https가 있는 반면에 STUN 프로토콜 패킷이 존재한다. STUN 프로토콜 패킷은 NAT 환경에서의 External IP/PORT를 P2P 단말이 알아볼 수 있도록 해주는 프로토콜이다. P2P 통신에 필요한 프로토콜이므로 컴퓨터에 대한 정보도 얻을 수 있지 않을까하여 해당 프로토콜에 분석 초점을 두고 분석을 시작 해 보았다. 또 문제 지문을 보면 개인적인 통신을 한다고 하니 STUN 프로토콜의 내용이 더욱더 의심이 간다.


문제 지문을 잘 읽어보면 해당 패킷 캡쳐를 통해 김일성이 누군가와 대화를 하고 있다고 한다. 그러므로 김일성의 통신 내용을 캡쳐했다고 볼 수 있다. STUN 프로토콜의 내용을 보면 다음과 같은 문자열이 전송되는 것을 볼 수 있다.


[그림 9 - 전송되는 컴퓨터 이름]


주소가 루프백이므로 주소 앞에 있는 값이 김일성 컴퓨터의 이름이다.


Answer : drpoppins-735


[Round 5]

Password : ur0nar0lln0w!@


 - 문제 지문

One of your colleagues was able to intercept messages between Ill-song and Ann Dercover, a professional chess boxer. The Chess Boxing World Title will be held in Pyongyang next year, and we know that this is only because of a bribe from a "Kim Ill-song". We now believe that this is an alias. Whoever it is has relations with Ann Dercover, and we believe that that Ill-song is using the Title to get her into North Korea. Since "Ill-song" is so determined to contact Ann, we've begun investigating her. So far we've just been tapping her phone and home network traffic. Based on their conversation, we believe that Mr. Ill-song (or whoever he is) will try to contact her in the near future and set up a time to meet. Look through this capture and let us know if you find out a meeting time. Remember, we need the date AND time. 

Use the Round 5 packet capture in this folder to learn more about the case and answer the following question: 


What is the month, date, and time of their meeting? 


어떤 여자와의 만나는 일자를 알아내는 것이 이번 문제의 목표이다. http 패킷의 대부분 내용이 SMS 메시지이다. 하지만, 메시지 대부분은 내용이 없는데, 몇 개의 메시지는 내용이 들어 있어 http 패킷 여러개를 보면 다음과 같은 패킷을 볼 수 있다.


[그림 10 - SMS 메시지]


"still we should be careful. Pay attention. I want to meet in September at 5PM" 이라는 메시지를 보면 September 5PM이란 대략적인 날짜와 시간을 알 수 있다. 하지만 정확한 기간은 다른 메시지들을 본 후 파악이 가능하다. 해당 메시지는 다음과 같다.


[그림 11 - 위치 표시 값]


[그림 11]을 보면 위도/경도 값이 보인다. 위 패킷 다음으로 계속해서 위도/경도 값이 나오는데, 해당 값들을 모두 조회하여 보면 다음과 같은 형태가 된다.


[그림 12 - 위도/경도 조회 결과]


Answer : September 17th at 5 PM


[Round 6]

Password : gud$luk^^0nth1s1


 - 문제 지문

Since the meeting time between Ann and Ill-song isn't for another month, we've continued monitoring their traffic and communications. This information led investigators to a hotel in Pyonyang. After a failed attempt to apprehend Ill-song in his hotel room, a detective found a thumb drive he left behind. One of your colleagues has discovered what appears to be encrypted data on the thumb drive. We don't know if there will be anything useful on it yet, but we think the data might be from an Apple device. If so, there may be network credentials from his personal network on the device. We'd like you to get the SSID from the network he was using. You can do that, right? 

Use the Round 6 zip file in this folder to learn more about the case and answer the following question:


What is the Wifi SSID from the device?


이번 문제는 Wifi SSID를 찾는 문제이다. 이번 문제는 처음에 패킷파일이 바로 주어지지 않는다. 조각난 것처럼 보이는 파일들이 압축되어 있는 압축파일 하나가 주어진다. 하지만 주어진 문제를 풀기전에 이전 문제 파일들로부터 얻어야 할 정보들이 있다.


먼저, Round 1에서 획득 했던 Documents.zip의 압축 파일들 중 "More Document" 디렉터리에 파일들에서 "NorthKorea.jpeg" 파일에 끝에 붙어 있는 "untitled.zip" 파일을 획득한다.


[그림 13 - 압축파일 획득]


압축 파일에는 "broken.py" 파일이 존재한다. 파이썬 스크립트 파일까지 획득 했다면, 이제는 Round 3 문제에서 획득 했던 이미지를 대상으로 스테가노그래피 기법을 이용 해 숨겨진 메시지를 획득해야 한다. 여러번 시도한 결과 "Slient eye" 도구를 이용 해 획득 할 수 있었다.


[그림  14 - 스테가노그래피 해제]


"i2454 2497d2496n2502 2470 2500 2507o2436s2452 2500s2503n2502l2487e2456 2497 2500h2485l2487 2470b2490e2491a2501m2466 2483a2501a2501e2505 2497 2500a2486"


"broken.py" 스크립트는 현재 스크립트로 정상 동작하기 위한 조건을 가지고 있지 않아 조금의 수정이 필요하다. 다음은 수정 전의 스크립트 코드이다.


--------------------------------------------------------------------------------------------------------------

def fileToString(pathToFile):

f = open(pathToFile, "r")

strs = ""

#adds each line of the file to the strs string

for line in f.readlines():

strs+=line

return strs

def ASCII():

#number of ASCII characters

NumOfASCII == 0

#returns list of all ASCII characters

return "".join([chr(i) for i in range(NumOfASCII)])

def sumName(name):

sums=0

#sums the indices in ASCII of all the characters in name

for x in name:

sums+=ord(x

return sums

def indexInFile(password):

indices = []

ASCIIArray = ASCII()

#populates an array of indices to be used by the encoder

for chrs in password:

indices.append(ASCIIArray.index(chrs)+sumName(name)*2

return indices

def indexInASCII(name):

indices = []

ASCIIArray = ASCII()

#split on all non-numeric characters

#remove first index because it is blank

indexList = re.split("[^\d]",encoded)[1:]

#converts encoded characters to ASCII

for index in indexList:

indices.append(ASCIIArray[int(index) - (sumName(name)*2)])

#returns decoded message

return "".join(indices)

def encode(name):

#returns a list of indices to be used for encoding

indices = indexInFile(password,name)

#convert file associated with name to a string

bill = fileToString("./%s.txt"%name)

encoded = ""

#add letter in file plus index of the letter in the file to the encoded string

for index in indices:

encoded+=bill[index]+str(index)


return encoded

--------------------------------------------------------------------------------------------------------------


다음은 수정 후의 스크립트 코드이다.


--------------------------------------------------------------------------------------------------------------

import re


def fileToString(pathToFile):

f = open(pathToFile, "r")

strs = ""

#adds each line of the file to the strs string

for line in f.readlines():

strs+=line

return strs


def ASCII():

#number of ASCII characters

NumOfASCII = 128

#returns list of all ASCII characters

return "".join([chr(i) for i in range(NumOfASCII)])


def sumName(name):

sums=0

#sums the indices in ASCII of all the characters in name

for x in name:

sums+=ord(x)

return sums


def indexInFile(password, name):

indices = []

ASCIIArray = ASCII()

#populates an array of indices to be used by the encoder

for chrs in password:

indices.append(ASCIIArray.index(chrs)+sumName(name)*2)

return indices

                       

def indexInASCII(password, name):

indices = []

ASCIIArray = ASCII()

#split on all non-numeric characters

#remove first index because it is blank

indexList = re.split("[^\d]",password)[1:]

#converts encoded characters to ASCII

for index in indexList:

indices.append(ASCIIArray[int(index) - (sumName(name)*2)])

#returns decoded message

return "".join(indices)


def encode(name):

#returns a list of indices to be used for encoding

indices = indexInFile(password,name)

#convert file associated with name to a string

bill = fileToString("./%s.txt"%name)

encoded = ""

#add letter in file plus index of the letter in the file to the encoded string

for index in indices:

encoded+=bill[index]+str(index)


return encoded


def decode(password, name):

    return indexInASCII(password, name)

--------------------------------------------------------------------------------------------------------------


획득한 문자열을 위 스크립트 코드에 넣고 디코딩하면 다음과 같이 패스워드가 출력된다. 인코딩 키는 "BillOfRights"이다.


[그림 15 - 패스워드 복호화]


복호화 문자열 : DontTry2BruteForceThisPassword


이제부터 이번 라운드 문제를 살펴보도록 하겠다. 이번 문제의 파일들은 모두 조각 형태로 이루어져 있다. 해당 파일들은 iPod touch의 iOS backup 파일들이 암호화되어 있는 파일들이다. 암호화를 풀기위한 도구들의 설치 과정 설명은 생략하도록 하겠다.


iphone-dataprotection 도구를 이용 해 복호화를 시도하면 다음과 같은 화면이 나오는데, 패스워드는 위에서 복호화한 문자열을 사용하면 된다. 


[그림 16 - 복호화]


복호화를 진행하면 다음과 같이 복호화된 파일들이 생성된다.


[그림 17 - 복호화되어 생성된 파일들]


이번에는 복호화된 백업 파일들을 대상으로 키체인을 찾아야 한다. 키체인 역시 iphone-dataprotection 도구의 키체인 스크립트를 사용하면 된다.


[그림 18 - 복호화 완료]


Answer : LeakingSecrets


[Round 7]

Password : !LA$$t0n3!!


 - 문제 지문

The International Chess Boxing Association is reviewing the decision to let Pyongyang host the Title, but we're still not sure of the true indentity of Mr. Ill-song. We did, however, manage to get ahold of a FireTV left behind back in the hotel in Pyongyang. We want you to look for any videos he might have been watching, and see if there isn't a more personal one with intimate information on it. Hopefully something with a meeting location in it. Our sources tell us that this location is probably in the US. We don't need to know the exact location, but we need the state that's mentioned in the video. This is the final task and it is very important, so please don't just try guessing the states starting with Alabama. 

Use the Round 7 file in this folder to learn more about the case and answer the following question: 


What is the name of the state mentioned in the video? 


이번 문제는 동영상 파일에서 언급하는 주 이름을 찾는 문제이다. 문제 파일은 압축파일로, 압축파일을 해제하면 iOS 계열 폴더들과 파일들이 나오는데 "/usr/share/networkFiles/" 디렉터리 아래에 "amazon.pcap" 파일과 "trekking.pcap" 파일이 존재한다. 일단 두 파일을 분석하는데에 초점으로 맞추고 분석을 진행한다.

"trekking.pcap" 파일을 보면 다음과 같이 "jumbled.mp3.zip" 파일을 하나 추출할 수 있다.


[그림 19 - 압축파일 전송 스트림]


압축 파일에는 mp3 파일이 압축되어 있고, 해당 mp3 파일을 들어보면 어떤 여성의 목소리가 들린다. 이외에는 해당 패킷 파일에서 획득할 정보가 없어 다음 패킷 파일 분석으로 넘어간다.


"amazon.pcap" 파일은 무선 네트워크 패킷을 캡쳐한 파일이다. 그러므로 우선적으로 802.11 프로토콜 패킷을 복호화 해야만 한다. 해당 프로토콜의 복호화는 와이어샤크에서 기본으로 제공해주는 기능을 이용해 복호화할 수 있다. 이전 문제에서 획득한 SSID의 비밀번호인 "UncrackableNetwork75"를 이용하여 복호화를 시도한다.


암호화는 WPA-PWD 방식으로 되어 있어, 다음과 같이 키를 추가한 후 복호화를 시도하면 복호화가 완료된다.


[그림 20 - 키 추가]


복호화를 하면 "synergy" 프로토콜이 많이 보인다. "synergy" 프로토콜은 키보드와 마우스를 공유해주는 소프트웨어에서 사용하는 프로토콜로, 패킷을 보면 키보드에서 전송된 문자가 무엇인지 파악 할 수 있다.


techno viking

nyam cat ncat nick cage

cats and bears and stuff

carve 0x250c6

carve 0xa250c5

defcon 22

stewie madT

stuart


대략 위와 같은 문자가 전송된 것을 파악할 수 있는데, 오프셋 카빙을 지시하는 말 같은것이 전송된 것을 볼 수 있다. mp3 파일을 대상으로 오프셋을 이용 해 카빙하면 바이트 분포도가 일정한 파일이 나오는데 이것으로 보아 해당 파일은 Truecrypt 컨테이너 파일로 의심할 수 있었고, 비밀번호는 앞서 획득한 mp3 파일의 음성을 들어보면 획득할 수 있다. 여성이 말하는 단어들은 모두 NATO의 Phonetic code로 해독하면 "True HOOHA."라는 문자열을 획득 할 수 있다. 이를 이용하여 컨테이너 파일을 복호화하면 다음과 같이 비디오를 획득 할 수 있다.


[그림 21 - 비디오 획득]


Answer : New Jersey


이번 챌린지의 주요 문제는 Round 7이 끝이다. 보너스 문제로 Round 8이 존재하며 문제 파일은 Round 4의 문제파일로 진행된다. 해당 문제는 아직까지 챌린지가 진행되고 있어 풀이를 공개하지 못하는 점 이해하기 바란다.



이번 챌린지 문제는 다양한 난이도와 다양한 컨텐츠로 인해 재미있었다는 것이 지금 느끼는 가장 큰 소감이다. 하지만, 힌트 없이는 조금 풀기 어려울 수도 있다는게 개인적인 생각이며, 오프라인으로 챌린지를 진행하게 되면 많이 당황했을 수도 있겠다는 생각이 든다.

이 글을 보는 사람들도 한번쯤은 문제 풀이를 실습할 겸 풀어보는 것도 좋을 것 같다.


  1. 2017.12.17 21:06

    비밀댓글입니다

듣도보도 못한 GitS CTF(이번년도에 열렸다고 함)에서 출제 된 문제라고 한다. 사실 이 문제는 외국에 있는 어떤 해커에게 멘붕을 겪어보라며 받은 문제인데 정말 이틀간은 멘붕을 경험하였다.


해당 문제는 패스워드를 찾는 문제이며 힌트로는 TeL aViv+이 나왔다고 한다.(힌트를 이용해 풀이하지는 못하였다.) 


그럼 문제풀이를 시작해보자.


일단 파일을 받아보면 bin 확장자 파일인데 이를 시그니처 식별이나 file 명령어로 확인하여 보면 금방 패킷 덤프 파일이란 것을 알 수 있다. 


그 후 Whireshark로 열어보면 정말 몇 안되는 패킷이 보이고 결국 이 패킷은 단 하나의 프레임만을 보여주고 있다.


[그림 1 - 전송되는 프레임 하나의 패킷들]


첫번째 단은 접속시 환영한다는 메시지처럼 보이며 두번째 단은 무언가 알 수 없는 문자들이 있으며 마지막 단에는 로그인 성공 메시지로 보이는 문자열들이 존재한다.


이렇게 봤을 때 당연히 패스워드는 가운데 단인 것을 추측할 수 있다. 하지만 패스워드라고 하기에는 조금 무리가 있는 듯 싶다. 패스워드는 일반적으로 평문 문자열들인데 위 값들은 hex 값들이기 때문이다.


여기서부터 멘붕이 시작되었다. 처음에는 bruteforce 공격을 시도해 봤지만 무한 경우의수만 생산 할 뿐 딱히 이렇다 할 패스워드는 나오지 않았다.


hex 값들을 계속해서 정독하던 중 마지막 hex 값인 04 2f 04 0b 01이 눈에 들어왔다. 04가 마치 다음 이어지는 hex 값들의 개수를 나타내고 있는 것 같았다. 조금 더 앞으로 이동해 확인하여 보니 그 추측은 정확하였다.


[그림 2 - 정확한 규칙의 패킷 hex 값들]


일일이 수작업으로 하기 힘들어 간단히 python의 힘을 빌렸다. 처음에는 python의 파일 핸들 함수들로 하였으나 f.read()가 0x20을 만나는 순간 읽기를 그만두어 모든 패킷 hex 값들을 읽어들일 수가 없었다. 그래서 scapy 모듈의 힘을 빌리기로 하였다.

(scapy 모듈은 backtrack5에 기본적으로 존재함)


[그림 3]과 같은 소스로 규칙에 맞게 출력해 보았다.(소스는 최종 풀이소스이다.)


[그림 3 - 풀이 소스]


일단 출력 된 결과를 보면 다음과 같다.


packet Block Count : 37


0x8 0x2b 0x2e 0x1 0x17 0x10 0x1 0x5 0x1

0x7 0x57 0x21 0x57 0x1 0x1 0x12 0x1

0x6 0x4d 0x5d 0x1d 0x8 0xd 0x2

0x5 0x1b 0xa 0x18 0x2 0x1

0x4 0x5a 0x4 0x46 0x10

0x5 0x84 0x27 0x16 0x12 0x3

0x5 0x9d 0x22 0x5 0x1 0x1

0x4 0xb8 0x9 0x4 0x1

0x5 0x33 0x5d 0x38 0x5 0x1

0x4 0x5e 0xd 0x68 0x1f

0x7 0x50 0x2d 0x1a 0x20 0x2 0x9 0x2

0x6 0x90 0xc 0x20 0x10 0xf 0x1

0x4 0x3a 0x4 0x1 0x1

0x8 0x17 0x3b 0x34 0x18 0x37 0xf 0x1 0x1

0x4 0x21 0x78 0x25 0x8

0x5 0x1d 0x4b 0x8 0x3 0x1

0x4 0x1a 0x21 0x2 0x3

0x5 0x19 0x25 0x4 0x1 0x1

0x5 0x5c 0x17 0x12 0x2 0x1

0x8 0x5d 0x49 0x33 0x4 0x3 0x2 0x1 0x1

0x4 0x96 0x1a 0x29 0x5

0x3 0x3a 0x5 0x1

0x6 0x39 0x4 0x53 0xa 0x1 0x1

0x7 0x79 0x2 0x7 0x1b 0x1 0x37 0x1

0x4 0x3 0xe 0x18 0x17

0x5 0x6e 0x11 0x9 0x3 0x1

0x9 0xb4 0x6 0x1 0x3 0x4 0x3 0x1e 0x2 0x1

0x7 0x2 0xa7 0x10 0x10 0x12 0x13 0x2

0x7 0x4c 0x9 0x43 0x7 0xd 0x4 0x2a

0x4 0xd 0x78 0x5f 0x2

0x4 0x2b 0x7 0xd 0x1

0x5 0x74 0xd 0xe 0x9 0x2

0x6 0x2d 0xa6 0xd 0xb 0x1 0x6

0x4 0x9d 0x39 0x5 0x1

0x2 0xd5 0x9

0x6 0x38 0x6 0x2 0x2 0x1 0x1

0x4 0x2f 0x5 0xb 0x1


맨 앞에는 hex의 개수를 나타내고 그 뒤부터가 그에 맞는 hex 값들이다. 여기에서 또 한번의 멘붕이 찾아왔다. 이 값들로 무엇을 어떻게 해야 할지 감이 오질 않는 것이다. 그러던 와중 힌트로 제공 된 TeL aViv+에서 +가 보였다. 각 자리를 합치라는 힌트 같았다. 모두 다 합쳐보니 다음과 같은 값들이 얻어졌다.


88 e4 de 40 b4 d6 c6 c6 ce f2 c4 dc 40 e6 c6 74 40 44 88 e4 de 40 9c d6 40 8c e6 f0 da e6 40 9a f2 dc de 44 40


각 hex 값을 10진수로 변환하여 보니 다음과 같았다.


136 228 222 64 180 214 198 198 206 242 196 220 64 230 198 116 64 68 136 228 222 64 156 214 64 140 230 240 218 230 64 154 242 220 222 68 64


아스키코드를 안다면 이 값들은 아스키 코드에 해당하지 않는 값들 이란 것을 알아 볼 수 있을 것이다. 하지만 큰 값들이 200대로 2로 나누면 아스키코드 값에 포함되는 값들인 것을 금방 알 수 있었다.


[그림 4 - 2로 나눈 모습]


이를 기반으로 모든 값을 더하고 2로 나누어 아스키코드 값으로 변환하는 소스를 작성해 풀어보면 다음과 같다.


packet Block sum and char: 68 ==> D

packet Block sum and char: 114 ==> r

packet Block sum and char: 111 ==> o

packet Block sum and char: 32 ==>  

packet Block sum and char: 90 ==> Z

packet Block sum and char: 107 ==> k

packet Block sum and char: 99 ==> c

packet Block sum and char: 99 ==> c

packet Block sum and char: 103 ==> g

packet Block sum and char: 121 ==> y

packet Block sum and char: 98 ==> b

packet Block sum and char: 110 ==> n

packet Block sum and char: 32 ==>  

packet Block sum and char: 115 ==> s

packet Block sum and char: 99 ==> c

packet Block sum and char: 58 ==> :

packet Block sum and char: 32 ==>  

packet Block sum and char: 34 ==> "

packet Block sum and char: 68 ==> D

packet Block sum and char: 114 ==> r

packet Block sum and char: 111 ==> o

packet Block sum and char: 32 ==>  

packet Block sum and char: 78 ==> N

packet Block sum and char: 107 ==> k

packet Block sum and char: 32 ==>  

packet Block sum and char: 70 ==> F

packet Block sum and char: 115 ==> s

packet Block sum and char: 120 ==> x

packet Block sum and char: 109 ==> m

packet Block sum and char: 115 ==> s

packet Block sum and char: 32 ==>  

packet Block sum and char: 77 ==> M

packet Block sum and char: 121 ==> y

packet Block sum and char: 110 ==> n

packet Block sum and char: 111 ==> o

packet Block sum and char: 34 ==> "

packet Block sum and char: 32 ==>  


===============================================================

Dro Zkccgybn sc: "Dro Nk Fsxms Myno" 

==============================================================


무언가 나왔지만 아직 평범한 문자열로 보이지 않는다. 하지만 깨진 문자열이 없어 일반적인 치환암호로 생각 할 수 있어 ROT 암호 알고리즘을 적용해 보았다.


[그림 5 - ROT16]


많은 ROT 알고리즘 결과 중에서 정상적인 문자열을 출력한 알고리즘은 ROT16 알고리즘이었고 결국 패스워드는 The Da Vinci Code이다.






잡담 : 이 문제에서 사용 된 알고리즘이 다빈치 코드 알고리즘?! 그리고 저 힌트는 뭐지... ㅜㅜ;;

  1. TriumphD 2012.05.17 11:33

    오오.. 뭔가 흥미로운 내용이군요...

    뜬금 없으실지도 모르겠습니다만;;

    이런걸 공부하거나 배우려면 뭘 어떻게 해야 할까요 ^^;;

    책이라도 읽어야 할까요 ㅜㅜ;;

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.17 15:41 신고

      IT 분야에 기초적인 프로그래밍을 일단 배우셔야겠죠? ㅎ

    • TriumphD 2012.05.31 00:19

      아참.. 한가지 궁금한 점이 있는데 ^^;;

      ROT 알고리즘 결과를 출력해주는 프로그램이나 소스 같은게 혹시 따로 있을까요..?

      해킹대회나 그런 대회를 많이 나가려고 하는데 하나쯤 있으면 많이 유용할 것 같아서요 ^^;;

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.31 12:38 신고

      직접 만들어 보시는것도 좋은 방법중 하나 입니다 ^^

      제가 만들어 놓은 스크립트도 있고(http://maj3sty.tistory.com/794)

      웹으로 제공 되는 디코더도 있구요(http://theblob.org/rot.cgi)

    • TriumphD 2012.06.01 04:00

      오오..정보 정말 감사합니다 ^^

      열심히 공부해서 나중에라도 마제스티?(맞나요? 하하^^;;)님 반만이라도 따라갈 수만 있다면 좋겠네요 ㅎㅎ;;

      항상 포스팅해주시는 내용 정말 도움이 많이 되고 감사합니다 ^^

+ Recent posts