#About
Author : ArturDents
Korean :
OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE
EX) 00400000EB03
English :
After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine"
The solution should be in this format : OEP + Serial
EX) 00400000EB03
#Contents
이전 문제에 나왔던 UPX와 다른 ASPACK의 이해와, Import Address Table의 이해를 목표로 한다
#Solution
[그림 1] - 실행화면
10.exe를 실행하면 위와 같은 UI를 볼 수 있으며 Name과 Serial란에 아무값도 입력이 되지 않음을 알 수 있다
[그림 2] - ASPack
OEP를 구하는 문제이기에 패킹이 되어 있을거라 예상, PEiD를 통해 ASPack로 패킹되어 있음을 알 수 있었다
앞서 나왔던 UPX며 해당 문제에서 나온 ASPack이며 패킹에 대해 더 해지는 언급으로
정확한 원리를 알아보기 위해 검색 결과 아래와 같은 원리가 적용됨을 알 수 있었다
PUSHAD 명령을 통한 스택에 레지스터값 적재 |
정상 코드 메모리에 복구 |
POPAD 명령을 통한 레지스터값 복구 |
OEP로 분기 |
[표 1] - 레지스터를 이용한 패킹의 원리
이러한 점을 이용한 언패킹 방법으로는, PUSHAD 명령 이후 ESP 값을
접근하는 지점(POPAD 명령을 통한 접근)에 BP를 걸어두면 OEP를 분기하기 전으로 이동할 수 있다
(출처 : stih.tistory.com/68)
[그림 3] - ESP 값 확인
F8(Step-Over)을 이용해 PUSHAD 명령 이후 ESP 값을 확인결과, 0018FF6C을 참조함을 알 수 있다
0018FF6C은 POPAD가 진행되기 전, 정상 코드를 메모리에 복구한 뒤, 레지스터 복구를 위해 현재 ESP가 가리키는
메모리 주소에 접근할 때 사용되며 한마디로 0018FF6C는 현재 ESP이다
[그림 4] - BreakPoint > 0018FF6C
따라서 [그림 4]와 같이 PUSHAD 이후 ESP가 가리키는 메모리 주소에 접근할 때 Break Point를 걸어두고 실행시키게 되면, 메모리 상에 복구를
마친 뒤 OEP로 분기전 상태가 되며 F9를 통해 프로그램을 실행하게 되면 아래와 같이 BreakPoint에서 멈추는 것을 확인할 수 있다
[그림 5]
BreakPoint가 걸린 부분을 살펴보면, JNZ 구문에 의해 분기가 일어나며 PUSH 명령을 통해 00445834(OEP)
주소를 스택에 저장한 이후 RETN 명령을 통해, 00445834로 점프하는 것을 알 수 있다
[그림 6] - OEP로 이동
OEP로 이동했더니 디버거가 OPCODE를 인식하지 못하는 것을 확인할 수 있어 아래와 같이 OllyDump를 통해 OEP 값을 수정해 주었다
[그림 7] - Modify OEP
위와 같이 덤프 진행 후, 파일을 열었더니 아래와 같이 함수의 프롤로그를 의미하는 PUSH EBP 구문이 보이지 않아, 무언가 잘못됨을 알 수 있었다
[그림 8]
검색 결과, IAT(Import Address Table) 정보가 정확하게 복구 되지 않아 정상실행이 되지 않는다는 결과를 얻을 수 있었고,
IAT 복구를 위해 아래의 LordPE로 Rebuild를 진행해주었다
[그림 9] - Rebuild
[그림 9]와 같이 진행한 후 올리디버거로 열어주었더니 아래와 같이 프롤로그를 의미하는 PUSH EBP 구문을 확인할 수 있었다
[그림 10] - 프롤로그
올바르게 IAT 복구과정을 거쳤으니, 문제로 넘어가 "등록성공으로 가는 분기문의 OPCODE"를 찾는 것이 목표이다
등록성공이라는 문구는 이전 문제들과 같이 아스키 값으로 저장되어 있을 거라 생각 후
텍스트 값만 뽑아 내었더니 아래와 같이 확인할 수 있었다
[그림 11] - 아스키 값 확인
[그림 12] - 분기문의 OPCODE 확인
[그림 11]에서 아스키 값 Registered ... well done!이 위치하는 곳으로 갔더니 위과 같았고,
등록성공으로 가는 분기문의 OPCODE를 확인할 수 있었다
'Wargame' 카테고리의 다른 글
CodeEngn Basic 12 (0) | 2017.10.08 |
---|---|
CodeEngn Basic 11 (0) | 2017.10.08 |
CodeEngn Basic 9 (0) | 2017.09.26 |
CodeEngn Basic 8 (0) | 2017.09.25 |
CodeEngn Basic 7 (0) | 2017.09.24 |