맨위로


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

Challenges : Basic 18


Author : Xsp!d3r

Korean : 

Name이 CodeEngn일때 Serial은 무엇인가 

English : 

Find the Serial when the Name is CodeEngn.

 지금까지 진행하면서 많이 봐왔던 프로그램 형식입니다. 네임값에 따라서 시리얼이 생성되는 프로그램이죠. 이런 프로그램들을 자주보다 보니 공통적인 형태가 있다는걸 알수있습니다. 

사용자값 입력받음 -> 시리얼 생성 -> 시리얼 값과 사용자값 비교 -> 분기 -> 메시지 출력

위의 처럼 대략 비슷한 패턴으로 프로그램이 진행되는것을 알수 있을것입니다. 저런 방식일 경우에는 간단하게 시리얼 값이 저장되는 위치를 찾아내 쉽게 답을 얻을수 있습니다. (만약 저장된 공간을 찾을수 없다면 시리얼의 생성 루틴을 찾거나 다른 방법을 찾아야합니다.) 첫번째 목표로 시리얼 저장공간을 찾는것으로 하고 분석을 시작해보겠습니다.

프로그램을 위와 같이 실행시킨후 CodeEngn 과 1111이라는 임의의값을 입력하니 다음과 같은 메시지가 출력되는것을 확인할수 있습니다. 올리디버거의 문자열 검색기능을 이용해서 메시지가 있는곳으로 이동해보면 시리얼 관련 코드들에 가까워 질수 있을것입니다.  

이동을 해보니 아래와 같이 메시지의 문자열들이 보입니다. 그위를 살펴보니 0040120E (성공 메시지 출력) 부분으로 분기하는 JE문과 문자열 비교함수인 IstrcmpiA 를 확인할수 있다.

자세히 보면 사용자입력값인 1111 (String1) 과 시리얼로 보이는 06162370056B6AC0 (String2) 이라는 값을 비교하고 있다. 확인을 위해서 프로그램에 입력해보니 아래와 같이 인증에 성공하는 모습을 확인할수 있다.



Posted by STIH

댓글을 달아 주세요