핵심 부분만 확인해보려고 한다.

분석할 파일은 Input으로 값을 받고, Serial까지 입력 받는 프로그램이다.

이 때, Serial은 Text 파일에 정해져 있고, 그 Serial에 맞는 Input 값을 구하라는 것이 이 문제의 내용이다.

 

그러다면 Serial은 정해져있고, Input 값은 사용자가 맞추는 것이므로 Input 값에 대한 어떤 뭐시기, 거시기가 있은 뒤에 Serial 값과 같은지 아닌지 비교를 하는 루틴이 있을 것이라 예상해볼 수 있다.

 

그렇다면 Input 값을 어떻게 조작하는지 살펴보는 것이 제일 중요한 루틴이라고 할 수 있겠다.

아래 그림을 살펴보자.

 

 

 

일단 왼쪽 옆구리를 보면 시커먼 선이 있는 것으로 봐서 루프를 돌고 있는 것이 확인된다.

그리고 CMP 명령어를 뭔지 모르지만 보면 3번 주기 혹은 반복하는 루틴일 것이다.

 

위에서 XOR 연산에 대해서 주목할 필요가 있다.

XOR EAX, EAX 와 같이 쓰이는 경우와 XOR EAX, 43 혹은 XOR EAX, key value 등의 형식으로 표현되어 자주 사용되는 XOR은 후자의 경우 특정 값에 대해 간단히 암/복호화 할 때 사용되곤 한다.

 

이때, 원파일은 Input이고, Key는 10, 20, 30 로 input 값이 1byte 씩 바뀔 때마다 바뀐다.

그렇다면 Serial 또한 똑같이 첫번째 byte는 10로, 두번째 byte는 20로, 세번째 byte는 30로 xor 해보자

 

주어진 Serail = 5B 13 49 77 13 5E 7D 13

 

XOR 5B, 10 = 4B 'K'

XOR 13, 20 = 33 '3'

XOR 49, 30 = 79 'y'

XOR 77, 10 = 67 'g'

XOR 13, 20 =  33 '3'

XOR 5E, 30 = 6E 'n'

XOR 7D, 10 = 6D 'm'

XOR 13, 20 =  33 '3'

 

결과 : K3yg3nm3

 

 

 

 

 

 

 

 

 

Reversing.kr의 Challenge의 Easy Crack 문제를 풀어보았다.

우선, 실행 화면을 살펴보면, 아래와 같이 무언가를 입력하도록 새로운 윈도우 창이 생성된다.


[그림1. exe 파일 실행화면]


무언가 제대로 된 값을 넣어야됨을 알 수가 있다.

우선 소스를 상상해보면 값을 입력하였고, 그 입력 값과 Key 값을 비교할 것이라는 흐름이 떠오를 수 있다.

그럼 비교를 위해서 할 수 있는 흐름은? 단순 string 문자열 끼리 비교할 수도 있고.. (이런 흐름이라면 때땡큐)

아니면 입력한 값과 Key 값을 1byte 씩 값 비교할 수도 있을 것이라 생각할 수 있다.


한 번 OllyDbg로 살펴보자. 

처음부터 흐름을 A -> B -> C -> D ..... 로 끌고갈 실력도 안되거니와 복잡하기 때문에 Referenced String을 확인하여 우리가 체크해야할 Routine 영역으로 바로 넘어가도록 한다.


[그림2. Reference String 확인 결과]


위 [그림2]와 같이 왠지 느낌이 확 오는 문자열들을 확인해 볼 수 있다. 여기 중에 Congratulation !!을 클릭하여 해당 위치로 한 번 가보자.


[그림3. Contratulation 문자열을 따라 해당 영역으로 이동 후, 해당 영역의 시작 지점에 Break Point Set]


위와 같이 Break Point를 걸어 놓고, F9를 통해 Running을 하면, Key 입력받는 창이 생기며, 그 Key 창에 임의의 값을 입력 하고 Enter를 누르면 우리가 Break Point 설정한 위 지점에서 멈추게 된다.


그리고 천천히 밑으로 내리다보면 (F8로) GetDlgItemTextA라는 API를 만날 수 있다. GetDlgItmeTextA를 통해 메시지 박스에서 입력한 값을 API 인자에 포함된 Buffer 주소 값에 Input 할 수 있다.


[그림4. GetDlgItemTextA API를 이용하여 MessageBox 입력 값을 받아온다.]



[그림5. GetDlgItemTextA를 통해 얻어온 값]


이후 이 값의 2번째 위치한 o와 'a' (61h)를 비교하게 된다. 이를 통해 2번째 위치한 문자열은 왠지 'a' 일 것 같은 느낌이 팍 든다. 그리고 입력 값의 2번째 위치한 문자가 'a'와 다르다면 'Incorrect Password'를 띄우는 루틴을 태우도록 JNZ 분기가 들어가 있다. (왜 첫번 째 문자열 먼저 비교하지 않을까 의심해볼 필요가 있다.) 그리고 그 밑에 5y 문자열을 집어넣고 call 401150을 호출하는데 그냥 추측컨데 왠지 a 뒤에 오는 문자열은 5y가 되어야할 것 같은 느낌이다.


[그림6. 입력 값의 2번째 문자열이 a 인지 체크 이후, JNZ 분기, a일 경우 5y 비교]


한번 step into (F7) 로 401150 함수 안을 들여다 보자.


[그림7. 401150 함수 안, a와 비교 이후 5y 문자열 비교]


이후의 문자열은 R3versing 문자열을 비교하는 루틴이다. R3versing 문자열 비교를 위해 1byte 씩 이동해가면서 1byte 비교를 하고 있으며, CMP BYTE PTR SS:[ESP+4], 45를 보면 45h는 E를 의미하며 ESP+4는 입력 값의 첫 번째 byte를 의미한다. 제일 처음에 2번째 byte를 a로 비교하면서 첫번째 바이트 비교를 왜 먼저 안했는지 의문이 든다고 했는데, 뒤에서 첫번째 byte를 비교함을 확인할 수 있다.


[그림8. 5y 문자열 비교 이후에 R3versing 비교]


이렇게 비교해본 문자열을 종합해보면 Ea5yR3versing 이라는 문자열을 확인할 수가 있다.




# REPE는 ECX 값 만큼 SCAS (EAX와 SCAS 이후 나오는 주소 값과 비교), STOS (EAX/AH/AL을 STOS 이후 

   나오는 주소 값에 저장) 할 수  있는데 같을 경우, 그 비교를 멈추고 나온다.


# REPNE는 ECX 값 만큼 비교 및 저장하고, 같지 않을 경우, 비교를 멈추고 나온다.



















악성 행위를 하는 파일을 분석하다 보면, GetTempPath() API 등을 사용하여 PC의 Temp 폴더에 *.tmp 형태의 파일을 생성하여 이용하는 경우가 종종 있다. 


이 이유는 일부 백신에서 EXE 파일과 DLL 파일을 대상으로 검사하는 알고리즘을 회피하기 위한 목적이라고 생각해볼 수 있다고 한다. (출처 : http://havu.tistory.com/30)




오늘 새로 알게 된 지식은 PDF (Portable Document Format)의 구조와 그 구조 중에서 어떻게 악성 Stream을 찾는지에 대한 내용을 알게 되었다. 해당 내용은 항상 멀리서 따라가고자 하는 최원혁 대표님의 교육 영상을 통해 습득 했으며, 이번 주말에 PDF에 대해 조금 더 알아보고자 한다.


오늘은 Part1에 대한 동영상 완강을 목표로 하였고, 그 목표를 달성하였다.

강의 내용은 아래와 같다.




PDF 구조는 큰 그림으로 보았을 때 아래와 같이 생겼다고 한다.



Header에는 뭐 PDF 버전이 뭔지 이런게 담겨져 있고, Body는 각종 Object들이 담겨져 있다고 한다.

Cross Reference Table은 Body에 담겨져 있는 간접 Object들에 대한 위치 정보와 사용 유/무에 대한 내용이 담겨져 있다고 하며, Trailer는 Body에서 사용 중인 Root Object (문서의 시작은 Root Object 로부터) 의 정보와 Cross Reference Table의 시작 위치를 담고 있다고 한다.


따라서 우선 시 봐야할 것은 Trailer라고 한다. Trailer를 통해 Root Object가 무엇인지 확인하고, Cross Reference Table을 통해 사용되는 Object의 수와 시작 위치를 확보한 뒤에 Root Object 부터 차근히 Flow를 따라 따라 내려가면 된다.


Object들 중에 Stream을 포함하고 있는 것들이 존재하는데, 아마도 이 Stream에 악성 행위를 위한 자바 스크립트가 포함되어 있지 않나 싶다. 사용자 모르게 악성 자바 스크립트가 실행되는 것이다. 


그래서 대표님은 PDF 자체에 대한 분석 자체보다 이 Stream 값이 담고 있는 자바 스크립트를 분석해내는 것이 더욱 중요하다고 말씀하신 것 같다. 자바 스크립트 또한 난독화되어 쉽게 복호화 하기는 어렵기 때문이다.


# PDF 파일의 Body : 문서의 실질적인 내용을 담고 있는 간접 오브젝트들로 구성

                             이러한 오브젝트들은 문서의 내용, 폰트나 페이지, 이미지 등과 같은 요소를 나타낸다.



두 번째 강의는 아래와 같다.



두 번째 강의에서는 Stream에 Java Script외 Flash 파일 .swf 파일을 추가적으로 감싸고 있는 상황에 대해서 설명하고 있다. Stream을 가지고 있는 Object에서 swf 파일의 내용을 가지고 있다. 하지만 실제로 해당 소스를 정확히 판별할 수 없어 디컴파일이 필요함을 느끼고, showmycode.com을 이용하여 디컴파일한 소스를 다운로드 받는다. 그 중에 HeapSpray, 즉 쉘코드를 확인하고 그 쉘코드를 분석해보면, 최초 PDF 파일의 Header 체크 등을 통해 결국엔 PDF 내 다른 Object의 지점을 실행해서 svchost.exe 악성 파일을 생성하도록 하는 것이 포인트였다.



+ Recent posts