Reversing/crackme

CodeEngn Basic RCE 06 문제 풀이

string_ 2022. 5. 7. 23:33

디버거 : CheatEngine

분석환경 : Window 10

 

문제 내용
키젠 프로그램

프로그램을 실행해봤더니 이번에도 시리얼을 획득하는 프로그램이다.

우선 pe툴로 열어 패킹여부를 확인해보자

패킹 여부 확인

UPX(3.03)으로 패킹되어 있고 EP는 004298F0 이라고 출력해주고 있다.

 

EP 주소로 이동

EP 주소부분으로 이동해봤지만 기존 함수 프롤로그 코드(스택 프레임)가 보이지않고

웬 PUSHAD 로 시작하는 코드가 있다.

실행압축 패킹은 이렇게 처음 시작될때 PUSHAD 명령어로 기존 레지스터 데이터를 모두 스택에 넣었다

압축을 풀고 다시 POPAD 명령어로 넣었던 데이터를 스택에서 꺼내와서 원본 코드(OEP)로 이동한다.

 

언패킹을 하는 방법은 여러가지가 있지만 수동적으로 하는 대표적인 방법으론

PUSHAD를 하고 스택에 있는 데이터에 Access BreakPoint(해당 데이터에 access 되는 주소에 중단점이 걸림)

를 걸고 실행하면 압축을 풀고 원본코드로 이동하기 전 명령어인 POPAD 명령어에서 중단점이 걸리게된다.

거기 주소에서 trace를 하다보면 원본코드로 이동할수 있다.

 

가장 편한 방법은 UPX 전용툴로 언패킹을 하는 방법.

단 최신 UPX버전은 해당 작업으론 되지않으니 다른 방법을 사용하여야 함

 

upx -d 명령어를 사용하여 언패킹 작업을 해줌

upx 경로 -d (언패킹)
언패킹 작업이 완료된 모습

언패킹이 완료되고 EntryPoint 또한 바뀐것을 확인할 수 있다.

 

이렇게 원본 코드의 EP를 OEP(Original EntryPoint) 라고 부른다.

OEP 주소 06.exe+1360로 이동해보면

 

OEP

 OEP 주소로 이동하는데 성공했다.

후에 똑같이 문자열을 추적하여 해당 메세지박스를 띄우는 부분을 찾아준다.

메세지박스 띄우는 부분
내가 입력한 시리얼과 특정 문자열을 비교하는 코드가 보인다.

위로 스크롤을 올려보니 내가 입력한 Serial (1234)가 06.exe+235D4 주소에 들어가 있는것을 확인 할수 있다.

1234 와 AD46DFS547 라는 문자열이 같이 매개변수로 들어가고 후에 함수를 호출한 뒤

반환값이 0 인지 확인 후에 성공/실패 분기가 진행된다.

 

결론적으로 AD46DFS547 문자열이 해당 프로그램 시리얼일 확률이 매우 높으므로 입력해봅니다.

 

성공 메세지 출력

OEP : 00401360

Serial : AD46DFS547