#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 |