#About


Author : abex


Korean :

OEP를 찾으시오. Ex) 00401000 / Stolenbyte를 찾으시오. Ex) FF35CA204000E84D000000

정답인증은 OEP + Stolenbyte

Ex ) 00401000FF35CA204000E84D000000


English :

Find the OEP, Ex) 00401000 / Find the Stolenbyte. Ex) FF35CA204000E84D000000

The solution should be in this format : OEP + Serial

Ex ) 00401000FF35CA204000E84D000000




#Contents


Basic 9번과 같은 문제이며, 패킹을 진행할 때 사용되는 StolenByte의 개념이해를 목적으로 한다




#Solutions


[그림 1] - 실행화면


11.exe를 실행하게 되면, keyfile을 체크하기 위한 OK버튼을 누르라고 한다


[그림 1-2] - 실행화면


확인버튼을 누르고 나면 파일을 찾지 못했다는 에러메시지를 확인할 수 있다


OEP를 찾으라는 문제에서 패킹이 되어 있음을 생각할 수 있고 PEiD를 통해 아래와 같이 UPX로 패킹되어 있음을 확인할 수 있다


[그림 2] - UPX 패킹


UPX의 특성상 디버거에 올렸을 때, 맨 아래의 코드에 OEP로 JMP 하는 구문을 통해 이동 후, 덤프를 통해 언패킹을 진행할 수 있지만,

편하게 아래와 같이 upx의 언패킹을 진행할 수 있는 프로그램을 통해 언패킹을 진행하였다


[그림 3] - UPX 언패킹


언패킹을 진행 후 올리디버거에 올리고 실행을 해주었더니 아래와 같은 메세지를 확인할 수 있다


[그림 4] - 깨진 메시지창


깨진 메시지창을 확인 후, 순간 StolenByte를 잊고 있었음을 깨달았고, [그림 4]에서 실행하기 전 화면인,

아래의 화면에서 MessageBoxA 함수 호출에 필요한 인자(StolenByte)가 부족함을 알 수 있었다


[그림 5] - 인자 부족


[그림 4]의 깨진 메시지창이 뜨기 전 상태로 돌아가 확인해 보았더니 12줄의 NOP 명령과, MessageBoxA에 필요한 인자가 부족함을 확인할 수 있었다


부족한 인자를 채워주기 위해 NOP 부분을 활용하기로 했고, 그 인자는 아래와 같이 

언패킹 진행 전 프로그램의 POPAD 명령이후 PUSH 되는 값에서 얻어 올 수 있었다


[그림 6] - Find StolenByte


위 그림에서 StolenByte로 추정되는 값을 확인할 수 있었고, 해당 OPCODE를 단축키 Ctrl+E를 통해

아래와 같이 넣어 주었더니 MessageBoxA 함수에 부족한 인자가 채워짐을 확인할 수 있다


[그림 7] - 인자 완성


부족한 인자를 완성 시키고 실행시켰더니 아래와 같이 정상적으로 실행됨을 확인할 수 있다


[그림 8]




※ OEP는 0040100C가 아니라, 추가해준 OPCODE의 시작점인 00401000임



'Wargame' 카테고리의 다른 글

CodeEngn Basic 13  (0) 2017.10.11
CodeEngn Basic 12  (0) 2017.10.08
CodeEngn Basic 10  (2) 2017.10.02
CodeEngn Basic 9  (0) 2017.09.26
CodeEngn Basic 8  (0) 2017.09.25

+ Recent posts