본문 바로가기

리버스엔지니어링/크랙미 풀이

CodeEngn Advanced RCE L10 분석



후 드디어 코드엔진 Advance문제의 반을 풀었습니다. L07같은 경우는 어려워서 일단 남겨뒀네요.

그래서 반 푼 기념으로 L10문제 분석을 하겠습니다.



문제는 지금까지와 별 다를바 없이 name과 serial을 입력하는 프로그램입니다. name에 따른 serial을 만드는 알고리즘을 파악해야 겠네요.






먼저 프로그램을 실행시키면 다음과 같이 틀리면 wrong serial을 표시하면서 꺼지게 됩니다.

그럼 이제 직접 올리디버거를 통해 소스를 분석해보겠습니다.



먼저 name과 serial을 입력받는 부분입니다.

각각 CALL부분에 주석으로 달아놓은 말은 CALL로 부르는 함수가 strlen이라는 뜻입니다. strlen함수 밑에 있는 cmp구문과 함께라면 길이가 몇일때 해당되는지 알수 있겠죠.

첫번째 strlen에서는 name의 길이가 3보다 작고, 0이 아니면 "Name must be longer than 3 chars."라는 메시지를 띄우게 됩니다. 또한 name의 길이가 0일경우 "You have to write somthing!"이라는 메시지를 띄웁니다.

첫번째 strlen함수를 통과할 경우 이제 serial부분으로 넘어가게 되는데요. 시리얼을 입력받고, strlen함수를 통해 serial의 길이가 0일경우 "At least put something in for the serial?"이라는 메시지를 띄웁니다.

name과 serial을 모두 알맞게 입력했을 경우 마지막으로 맨 밑에서 strlen함수를 불러오는데, 이때는 serial의 길이가 0xC, 즉 12인지 파악을 하고 serial 문자열의 길이가 12가 아닐경우 "Wrond serial. Keep trying."이라는 메시지를 띄웁니다.

아마도 Wrond serial은 Wrong serial을 잘못쓴것 같네요.

우리는 어차피 Serial이 WWWCCCJJJRRR로 정해져있으므로 이 부분은 별로 분석할 필요가 없는것 같습니다.



그럼 이제 더 밑으로 내려가면 Wrond serial이 아니라 실제로 우리가 name과 serial을 틀렷다고 알려주는 wrong serial을 표시하는 구문이 나오게 됩니다.




아까 그림에서 serial의 길이가 12일 경우 je short 10.00401F5F를 통해 jmp하면 바로 이 구문이 나오게 됩니다.

이제 이 알고리즘을 통해서 맨 밑에서 Good job이 뜰지, Wrong serial이 뜰지를 결정짓는데 

가장 중요한 부분은 파란색으로 네모친 CALL 10.0040144C부분입니다.

직접 이 부분이 어떤 일을 하는지 알아보겠습니다.


그런데 0040144C주소에 있는 함수가 너무 복잡해서 가장 중요한 일을 하는 3부분을 따로 보겠습니다.


이부분은 먼저 저희가 입력한 name을 살펴보는 부분입니다.

004017B4부터 루프가 시작이 되며 00401853주소에 있는 [EAX]에는 저희가 입력한 name이 들어있으며, 루프를 한번 돌때마다 문자열 하나씩을 빼오게 됩니다.

이때 이 루프는 serial문자열 3개를 빼왔을때마다 루프를 돌게되며 

맨처음 입력했던 예를 통해 말하자면 

name=abcd, serial=WWWCCCJJJRRR일때 name에서 a와 serial의 WWW를 루프를 돌리고

name에서 b와 serial에서 CCC와 루프를 돌리는 식이 된다는 겁니다.



이제 이부분은 serial부분입니다.

루프는 00401872부터 시작하게 되며, 004018A3에 있는 [EAX]에 저희가 입력한 serial이 들어가있습니다.



그래서 name과 serial을 통한 여러 알고리즘을 거친 후에 맨 마지막으로 들르는 곳이 바로 이 밑에 주소입니다.

이부분은 오른쪽 주석에 써놓은 대로 EAX와 5를 비교해서 EAX가 5보다 작거나 같을경우 통과하게 되고,

EAX가 5보다 크면 [EBP-69]주소에 0을 넣게 되는데 이를통해 Good job이냐 Wrong serial이냐를 결정짓게 됩니다.


그래서 이 eax가 5보다 작거나 같게하는 name중에서 (0~9,a~z)순으로 가장 빠른 문자열을 넣으면 답이 됩니다.

'리버스엔지니어링 > 크랙미 풀이' 카테고리의 다른 글

CodeEngn Advanced RCE L03 분석  (1) 2014.12.24
CodeEngn Basic RCE 끝!  (1) 2014.12.19
Junior CTF Level2  (0) 2013.07.29
CodeEngn Basic RCE L06 문제 풀이  (0) 2013.03.16
코드게이트 2013 바이너리 100분석  (0) 2013.03.12