맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 17 


Author : WarRock

Korean : 

Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가 

힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고.. 

정답인증은 Name의 MD5 해쉬값(대문자) 

English : 

What is Name when the Key is BEDA-2F56-BC4F4368-8A71-870B 

Hint : The name is 1 letter and it could be either alphabetic or numeric. 

Verify your solution with the MD5 value of the Name. 

 이번 문제는 이전에 풀어왔던 문제들과는 방식이 약간다르다. 전에 문제들은 정해진 Name값에 대한 Serial 을 구하는 방식이라서 적절한 위치에 BP를 설정하면됬지만, 이번 문제는 Serial 값이 정해져있고 그에 따른 Name 값을 찾는 문제이다. 

 이런 경우에는 시리얼 관련 분기점에 BP를 설정하는 방법으로는 Name 값을 알아낼수없다. 해결하는 방법에는 여러가지 방법(무작위 대입 - 브루트 포스 )이 있겠지만 가장 확실한 방법은 시리얼 생성 알고리즘을 알아내는 것입니다. 물론, 상황에 따라서 방법을 선택해야 합니다. 위와 같은 경우에도 시리얼 생성 알고리즘을 알아내는 것보다 무작위 대입을 이용하는 것이 빠르겠지만  공부를 위해서 시리얼 생성 알고리즘을 찾아보도록 하겠습니다.

 일단 분석하기전에 프로그램의 형태를 확인해보도록 하겠습니다. 별다른 특징은 없는것을 확인할수 있습니다.

 한가지 이상한 점은 네임값에 한글자 많을 입력하니 더입력하라는 메시지를 출력합니다. 일단 이점은 우리가 정답을 찾기위해서 수정해야 할 부분일것 같습니다. 

 프로그램을 확인했으니 이제 올리디버거를 통해 열어보도록 하겠습니다. 일단 우리가 찾는 네임값은 한글자이므로 한글자를 입력했을때에도 키생성 관련 알고리즘으로 진행되도록 해야될것입니다. 그러기 위해서는 먼저 글자수를 제한하는 부분으로 이동해야합니다. 이동을 위해 출력하는 메시지인 "Please Enter More Chars..." 를 이용해서 이동하겠습니다.

 확인 결과 위와 같이 Name 값으이 글자수를 체크하는 부분을 볼수있습니다. 한글자를 입력해도 분기되도록 하려면 간단하게 CMP EAX,3 구문을 CMP EAX,1 로 바꿔주면 될것입니다. 구문을 수정후에 실행시켜보면 "Please Enter More Chars..." 메시지는 더이상 출력하지 않는것을 확인할수 있습니다. 이말은 이제 한글자만을 입력해도 시리얼 생성을 한다는 것입니다. 이제 우리는 시리얼 알고리즘이 있는곳을 찾아가면 답을 알수 있을것입니다.

 시리얼 관련 알고리즘을 찾기위해서 코드를 조금 내려보면 아래와 같이 성공메시지와 그위에 시리얼 관련 코드들이 있는것을 알수있습니다.

 그중에서도 0045B850 함수가 시리얼 생성관련 함수인것을 알수있습니다. 한줄씩 코드를 실행시켜 보면 확인할수 있습니다. 0045B850 함수로 들어가보면 아래와 같은 루틴이 반복되며 키 생성하는 것을 알수있습니다. 이렇게 생성된 값들은 ESI 값에 저장됩니다.  

 일단 위의 그림은 한번 반복했을때의 ESI 값을 확인한것입니다. 이 값을 반복을 마친후 생성된 시리얼(아래 그림의 EDX 값)과 비교해보면 ESI 값의 4자리값을 사용하는것을 알수있습니다.

 4자리 값이 사용된다는것을 알았으니 이제 위의 연산을 한번 진행해서 BEDAXXXX 값이 나오는 문자를 찾으면 name 값을 알수있을것입니다. 먼저 반복 연산들을 분석해보면 아래와 같습니다.

 MOV EBX,DWORD PTR SS:[EBP-4]

 

 MOVZX ESI,BYTE PTR DS:[EBX+ECX-1]

 ESI 값에 입력값 대입 ESI = 61 (a)

 ADD ESI,EDX

 ESI = ESI + EDX (0)             //ESI = 61

 IMUL ESI,ESI,772

 ESI = ESI * 772                  //ESI = 2D232

 MOV EDX,ESI

 EDX = ESI                          //EDX = 2D232

 IMUL EDX,ESI

 EDX = EDX * ESI               //EDX = 7F55E11C4

 ADD ESI,EDX

 ESI = ESI + EDX               //ESI = 7F560E3F6

 OR ESI,ESI

 

 IMUL ESI,ESI,474

ESI = ESI * 474             // ESI = 2370B3772378

 ADD ESI,ESI

ESI = ESI + ESI             // ESI = 46E166EE46F0

 MOV EDX,ESI

EDX = ESI                    // EDX = 46E166EE46F0

 INC ECX


 DEC EAX


이제 위의 코드생성 연산을 이용해 코드를 만든후 BEDA 와 비교하는 프로그램을 제작해서 값을 찾아내면 된다. 

출처 : http://warmwrite.tistory.com/27

프로그램을 통해서 얻은 값을 다시 입력해보면 아래와 같이 인증에 성공하는것을 볼수있습니다.

이제 이값의 MD5 해쉬값을 구해서 인증해주면 됩니다.


Posted by STIH

댓글을 달아 주세요