이메일을 적으시면 보안관련 소식을 받을수 있습니다.
이메일:











작성자: JohnG
편집자: 엔시스





JohnG입니다.

얼마전 크랙미 문제를 풀다가 갑자기 어렵게 느껴졌던 문제가 있어 리버스관련 포스팅을 하게 되었습니다
무난하게 13번 문제까지 풀다 14번 문제에서 난이도가 갑자기 오른다는 느낌이드는군요.
기존문제는 특정 사람이름 입력시 나오는 시리얼값을 찾는 문제들이였는데 이번 문제는 특정 시리얼이 나오도록 이름을 찾는 문제 입니다.(왠지 스크롤이 길어 질듯한 느낌이네요)

문제 파일은 심플스에서 Challenge1의 Crackme에서 얻으실 수 있습니다.
(물론 이전 13번 문제까지 푸셔야 합니다)

심플스 : http://simples.kr

---------------------------------------------------------------------------------------------------------
사용 도구 : Ollydbg, 계산기, Visual Studio 2005

질문 : Key 값이 154C-6505-D2ADD0F3-A223-2870 일때 Name은 무엇인가
힌트 : Name은 두자리인데.. 알파벳일수도 있고 숫자일수도 있고..


먼저 문제 파일을 실행을 하면 사용자 이름 입력 부분과 시리얼 키값 입력부분 으로 두 텍스트 박스가 있습니다.
그리고 확인을 위한 "Check it!" , "About" , "Exit" 가 있습니다.

Name에 사용자 이름을, Key에 시리얼 키값을 입력한 후, "Check it!"를 클릭하면 인증과정을 거치도록 되어 있음을 추측할 수 있습니다. "About" 과 "Exit"는 평범하게 프로그램에 대한 간단한 정보 확인과 프로그램 종료에 대한 박스 입니다.

Ollydbg를 이용하여 파일을 분석합니다.



프로그램에 저장되어 있는 텍스트 문자들을 확인 하기 위해 마우스 오른 클릭으로 빨간 박스의 "All referenced text strings"를 선택합니다.




"All referenced text strings"를 누른 후 살펴 보면 위의 그림처럼 "Good Boy!" , "Well done!" 이라는 문자열을 볼 수 있습니다. 이는 "Check it!" 단추를 클릭한 후 사용자가 정상적으로 인증이 통과된 이후에 나오는 메시지에 사용될 문자열이라는것을 추측할 수 있습니다. 또한 사용자 입력과 프로그램 내부 시리얼키 생성 그리고 키값 비교가 모두 끝난 이후에 나타날 문자열이기 때문에 이곳부터 분석하기로 했습니다.(그 위의 please Enter Mor chars... 에서 부터 분석하도라도 문제가 없습니다. 분석은 분석가의 개인 선택이니..) 


"Good Boy!!!"라인을 더블 클릭하여 해당 소스 코드로 이동합니다.



위 그림을 보시면 위에는 "Please Enter Not more Than 30 Chars..." 라는 문자열이 있고 아래는 "Good Boy!!!" 라는 문자열이 있습니다. 좀더 위로 올라가서 분석해 보면 "Please Enter More Chars..." 라는 문자열을 볼 수 있습니다.


여기서 정리하자면 "Please Enter Not more Than 30 Chars..." 문자열 부터 "Good Boy!!!"문자열 사이의 코드에서 시리얼 키값을 생성할것 이라고 추측할 수 있습니다.
(그림에 나와 있는 "[MAKE] serial key"는 제가 분석하면서 적은 메모입니다.)



주소 0x0045BB68부터 분석을 하다 보면 그림에서 표시된 CALL부분에서 시리얼 키값을 만들어 낸다는 것을 알 수 있습니다. 시리얼 키값이 어떻게 만들어 내는지 확인하기 위해 내부 코드를 분석 해봅니다.




코드 내부에 들어가면 위 그림과 같은 소스코드를 볼 수 있습니다. 이 부분에서 처음 시리얼값 4자리를 만드는 알고리즘 이라는것을 분석을 통해 알 수 있습니다.


이 알고리즘은 사용자가 입력한 name의 길이와 각각의 문자들의 아스키코드값을 이용해 계산을 합니다.
먼저 힌트에서 사용자 이름은 2자리이며 숫자나 알파벳이 될 수 있다고 나와 있습니다. 길이는 2자리 이므로 이 알고리즘의 계산은 두번을 거치도록 되어 있음을 알 수 있습니다. 또한 숫자와 알파벳이므로 숫자 0에서 9까지 그리고 소문자 a에서 z까지와 대문자 A에서 Z까지의 문자나 숫자가 2개 선택될 수 있음을 확인 할 수 있습니다.


아래 "더 보기는" 분석한 알고리즘의 소스 입니다.



알고리즘을 이해하고 코드화 하기 이전에 어셈블리어 코드를 이해할 수 있어야 합니다. 그리고 코드 실행 방식을 분석한 후 알고리즘을 이해 할 수가 있습니다.


리버스를 어느정도 공부하다보면 이런 알고리즘을 이해하고 분석할 수 있는 능력이 요구될 수도 있습니다.
이번 제가 그런경우였던것 같네요.
그동안 소홀했던 프로그래밍에 시간투자를 해야겠습니다.



****************************************************************************************************

본 포스팅의 저작권은 보안인닷컴과 작성자에 있으며 상업적 이용을 배제하며 콘텐츠 이용시에는 반드시 출처와 링크를 이용해 주시기 바랍니다. 무단도용은 저작권법에 저촉을 받습니다..

****************************************************************************************************

Posted by John_G
,