#About
Author : abex
Korean :
StolenByte를 구하시오
Ex) 75156A0068352040
English :
Find the StolenByte
Ex) 75156A0068352040
#Contents
패킹 진행 과정에서, 원본 코드 중 일부를 별도의 영역에서 실행하게하여 OEP의 위치를 다른 위치로 가장하는
기법을 통해 StolenByte를 이해 후, 올바른 언패킹을 진행하는 것이 목적이다
#Solution
[그림 1] - 패킹 확인
바이너리 분석을 위해 디버거로 열었을 때, PUSHAD 명령을 통해 레지스터 값을 모두 스택에
적재함을 확인할 수 있고 이를 통해 패킹 여부를 유추할 수 있다
[그림 2] - UPX 패킹
PEiD를 통해 UPX로 패킹되어 있음을 확인할 수 있었고 언패킹은 아래와 같이 진행을 했다
[그림 3] - UPX 언패킹
[그림 4] - 올바르지 않은 언패킹
언패킹을 진행 후 디버거로 열었을 때, 첫 번째로 실행되는 MessageBoxA 함수에 전달할 인자가 부족함을 알 수 있었고
함수를 실행했을 때, 올바르지 않은 형태의 메시지박스를 확인할 수 있었다
이를 통해 부족한 인자들이 곧 문제와 연관있음을 알 수 있었고 검색을 통해 StolenByte를 이해할 수 있었다
StolenByte
▶ 패킹된 바이너리를 언패킹할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의
영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법이다
▶ 패커가 패킹을 진행할 때, 원본 코드 중 일부를 다른 곳으로 이동 시킨 코드로써, 주로 엔트리 포인트 위의 몇 줄의 코드이다
※ 올바른 프로그램을 얻기 위해서는 패킹 과정에서 떼어진 StolenByte를 함께 복원해야 덤프가 성공적으로 이루어진다
[그림 5]
프로그램 복원을 위한 StolenByte를 찾기 위해, 위에서 주어진 StolenByte의 정보를 바탕으로, 엔트리 포인트로
점프하는 주소(00407387)를 찾아 갔더니 POPAD 이후 스택에 적재되는 세개의 값을 확인할 수 있었다
[그림 6] - MessageBoxA 함수의 인자
OEP로 점프하는 구간에 브레이크포인트를 걸고 실행시켰더니 [그림 4]의 MessageBoxA 함수 호출에 필요한
인자들이 스택에 PUSH 됨을 알 수 있고, 이를 통해 PUSH 되는 인자들이 StolenByte 임을 확인할 수 있다
[그림 7] - StolenByte 복구 위치 확인
StolenByte를 확인하고 [그림 6]의 브레이크포인트에서 F8을 통해 JMP 명령을 실행시키게 되면 No Operation을 의미하는
NOP코드를 12개 확인할 수 있으며, 해당 12개의 NOP 코드값이 원래 StolenByte가 있던 위치이다
[그림 8] - StolenByte
맨 위의 NOP 코드부터 Ctrl+E를 통해 [그림 7]에서 알 수 있었던 StolenByte의 OP코드를 넣어주었더니
위와 같이 MessageBoxA 함수 호출에 필요한 인자가 모두 스택에 적재됨을 알 수 있다
[그림 9] - Use OllyDump Plugin
제대로 된 언패킹을 위해 올리덤프를 사용해, 위 그림과 같이 OEP를 100C가아닌,
아래와 같이 NOP를 수정한 코드의 시작점인 1000으로 수정해 준 뒤, 덤프를 진행해야 한다
[그림 10] - Modify OEP
[그림 11] - Completed Unpacking
'Wargame' 카테고리의 다른 글
CodeEngn Basic 11 (0) | 2017.10.08 |
---|---|
CodeEngn Basic 10 (2) | 2017.10.02 |
CodeEngn Basic 8 (0) | 2017.09.25 |
CodeEngn Basic 7 (0) | 2017.09.24 |
CodeEngn Basic 6 (0) | 2017.09.13 |