#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

+ Recent posts