메-모해봅시다.

CodeEngn - RCE L05 본문

리버싱/리버싱 문제 풀어보기

CodeEngn - RCE L05

RollingPumpkin 2020. 9. 23. 16:19

가장 쉽게 떠오를 만한 리버싱의 예시를 생각해 보면 개인적으로는 가장 먼저 등록키(시리얼 키)를 크랙하는 행위가 떠오릅니다.

그런 의미에서 코드엔진 CodeEngn - RCE L05 문제는 가장 내 흥미를 끌었던 문제입니다.

예전에 종종 보였던 스타 시디키 크랙이 떠오르는...

 

개인적으로 재미있었거나 인상깊었던 문제를 앞으로도 계속 포스팅해 본인의 복습을 위한 기록을 하고자 합니다.


우선, 문제를 풀기 위해 주어진 프로그램을 분석하는게 먼저라고 생각하니 어떤 작동을 하는지 부터 알아보도록 하겠습니다.

실행시 보이는 창
'Register now!' 를 클릭할 시 시리얼이 틀리다고 한다
'Quit the CrackMe' 를 누르면 창을 띄운 후 확인을 누르면 종료된다


기본적인 동작은 알아내었고 프로그램의 대한 정보를 알아내어 보자

PEiD로 exe의 파일 정보를 알내낼 수 있다.

위 그림의 하단부의 UPX 0.89.6 ~~~ 라고 써져 있는 것을 볼 수 있는데 이것은 해당 프로그램이 UPX로 패킹이 되어 있다는 것입니다.

이제 언패킹 툴로 언패킹을 한 후 다시 한 번 정보를 확인해보면

아까와는 달리 Borland Delphi 라고 써져 있는데 이것은 또 패킹이 되어 있다는 뜻이 아니라 Delphi 프로그래밍 언어로 만들어진 프로그램이라는 뜻입니다.

이제 프로그램 분석으로 넘어가보면...


분석에 앞서 메인함수를 더 쉽게 찾기 위한 방법으로 BinText 를 사용하기로 했다.

'serial' 문자열 검색

프로그램을 켰을 때 시리얼 번호를 입력받는 것을 기준으로 메인 함수를 찾고자 검색을 했으나

정답으로 보이는 키까지 나와 버렸습니다...

확실히 프로그램의 정보를 분석하는 게 중요하긴 하네요;;

그래도 공부를 위한 것이므로 디버거에서 찾아서 쓰기로 했습니다.

x96 디버거를 이용해 문자열 찾기를 한 모습

디버거의 문자열 찾기를 이용해 시리얼 키가 있는 곳은 쉽게 찾을 수 있었습니다.

알아낸 시리얼 키를 입력했으나 여전히 틀리다고 나오는 모습입니다.

여기서부터 디버거가 활약할 부분입니다.

디버거를 통해 확인해 보면 시리얼 키 뿐만이 아니라 'Registered User' 인지도 확인을 하고 둘 중 하나라도 틀리면 가차없이 jmp로 틀리다고 넘어가 버리는 것을 알 수 있습니다.

올바른 정답 입력 후, 크랙에 성공했다는 메세지 창이 나왔습니다.


문제를 풀어 보고 나니 저의 어린 시절에 게임들의 크랙버전을 만들던 사람들은 저작권적으론 좋지 않은 사람들이지만

적어도 리버싱 공부는 잘했나 봅니다 허허;;

이 문제만 해도 엄청 붙잡고 있었는데 실제 게임을 크랙하는 건 얼마나 어려울 까요...

앞으로도 열심히 공부해서 제 복습용도이긴 하지만 리버싱을 시작하려는 분들에게도 도움 될 수 있는 좋은 글 써보겠습니다.