#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

+ Recent posts