[CodeEngn] Basic RCE L05 풀이 (UPX 패킹)
- 리버싱/CodeEngn
- 2020. 2. 19. 16:56
CodeEngn Basic RCE E05 문제 확인
등록키를 찾아내는 문제이다.
Register을 누르면 잘못된 시리얼이라며 다시하라는 경고창이 뜬다.
CodeEngn Basic RCE E05 분석
IDA로 열어보니 해당 바이너리는 UPX 패킹이 되었음을 알 수 있다.
UPX는 매우 간단한 패킹이기 때문에 툴을 사용하면 금방 언팩할 수 있지만, 수동으로 OEP를 찾고 덤프를 떠보려 한다. 대부분의 패킹 알고리즘은 처음에 pushad로 레지스터들의 현재 상태를 스택에 전부 백업을 시켜둔다. 아래 스택창을 보면 EDI부터 EAX까지 스택에 저장되었음을 알 수 있다.
그럼, popad를 하면 백업해둔 레지스터들이 그대로 복원된다. popad를 한다음 OEP(Original EP)로 뛰는 경우가 많기 때문에 popad 밑부분의 jmp를 하면 OEP를 찾을 수 있다(물론 upx와 같은 간단한 패킹을 경우). popad는 Find Command 기능으로 찾아주었다.
jmp를 수행하면 나오는 위치가 아래이다. 딱 봐도 프롤로그처럼 생겼다. x32Dbg 내장 플러그인인 Scylla를 사용해서 OEP를 지정해주고 덤프를 떠준다. 덤프를 떠줄 때, IAT Autosearch로 IAT를 자동으로 찾고 Get Imports로 임포트 함수들도 찾아서 맞춰주어야한다. 그리고 Dump 부분에서 처음에 Dump로 먼저 파일 덤프를 떠준다음, Fix Dump로 방금 덤프떠준 파일에 IAT를 적용시켜주어야 제대로 OEP가 적용된 덤프파일이 생성된다.
덤프로 새로 생성한 바이너리를 IDA로 열어보면 다음과 같은 문자열을 볼 수 있다. 크랙이 성공했을 때 뜨는 문자열로 추정된다.
해당 문자열이 쓰이는 곳은 한곳밖에 없다.
아래 어셈부분을 보면, "No Name entered", "No Serial entered", "Crackme Cracked successfully" 라는 문자열 후 특정 함수가 공통적으로 오는 것을 보면 sub_43D068은 MessageBox함수임을 알 수 있다. 그리고 위 두 블록에는 없는 새로운 함수(sub_403B2C) 위에 두개의 데이터가 레지스터에 mov되고 있다. 밑에 시리얼은 정말 시리얼처럼 생겼기에 register에 필요한 정답 시리얼임을 유추할 수 있다.
참고로, "Registered User"도 같이 써주어야 한다.
'리버싱 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L07 풀이 (0) | 2020.02.20 |
---|---|
[CodeEngn] Basic RCE L06 풀이 (0) | 2020.02.20 |
[CodeEngn] Basic RCE L04 풀이 (IsDbuggerPresent) (0) | 2020.02.19 |
[CodeEngn] Basic RCE L03 풀이 (0) | 2020.02.18 |
[CodeEngn] Basic RCE L02 풀이 (0) | 2020.02.18 |