카테고리 없음

StolenByte에 대하여

서원근양학계정 2022. 1. 4. 17:21

StolenByte란?

StolenByte란 훔친 바이트라는 뜻으로 패킹된 프로그램에서 코드의 일부를 OEP로 점프하기 이전에 숨기는 것을 의미합니다.

 

StolenByte를 적용하는 이유

패킹을 풀 때는 OEP를 찾아서 덤프를 뜨게 됩니다.

하지만 StolenByte가 적용된 프로그램은 OEP이전에 코드의 일부가 있습니다.

따라서 OEP를 찾아서 덤프를 떠도 프로그램이 정상적으로 실행되지 않습니다.

한 마디로 언패킹을 방해할 수 있습니다.

 

StolenByte의 구조

 

위에 사진에서 볼 수 있듯이 StolenByte는 OEP로 점프하기 이전에 있는 코드를 말합니다.

대표적으로 OEP로 점프하기 이전에 값을 PUSH하고 OEP로 점프한 뒤 CALL을 통해서 함수를 호출하는 방법이 있습니다.

 

함수는 PUSH를 이용해서 스택에 들어간 값을 인자 값으로 사용하게 됩니다.

그 점을 이용해서 OEP로 점프하기 이전에 PUSH를 통해서 스택에 값을 넣고 OEP로 점프해서 함수를 호출하면 함수가 정상적으로 실행되지만, OEP를 찾아서 덤프를 뜨면 OEP이전에 있는 값이 스택에 PUSH되지 않고 따라서 함수가 정상적으로 실행되지 않습니다.

 

StolenByte 복구 방법

 

위 사진은 OEP로 가는 JMP와 그 근처의 코드입니다.

JMP위에 PUSH가 보이는 것을 확인할 수 있습니다.

저 PUSH를 통해서 OEP로 점프한 이후에 호출할 함수에서 사용할 값을 스택에 넣습니다.

 

위의 사진은 언패킹 도구를 이용해서 패킹을 푼 상태의 코드입니다.

OEP의 위쪽 부분이 NOP으로 채워져 있습니다.

저 부분이 OEP이전에 있던 PUSH들이 있었던 자리입니다.

그리고 그 아래에서 MessageBoxA함수를 호출하는 것을 확인할 수 있습니다.

이 상태에서 실행시켜보겠습니다. 

 

OEP이전에 있던 PUSH가 사라지면서 함수의 인자가 스택을 통해서 정상적으로 전달되지 않아서 오류가 발생합니다. 

이제 NOP로 채워진 공간에 OEP이전에서 봤던 명령어들을 옮겨주겠습니다.

 

이 상태에서 실행시키니 정상적으로 실행되는 것을 확인할 수 있습니다.