해킹 공부/리버싱

StolenByte란?

O'bin 2022. 11. 26. 00:07

 -  StolenByte란?

말 그대로 훔친 바이트라는 뜻으로,
패킹된 프로그램에서 코드의 일부를 훔치는(숨기는) 것이다.

 

 

 

 -  StolenByte를 적용하는 이유

Anti-Reverse Engineering의 일환이다.
패킹된 파일을 언패킹할때 OEP(original entry point)를 찾아서 덤프해야 하는데,
만약 StolenByte를 적용하면 OEP 이전에 일부 코드가 들어있음

      -> OEP 찾아서 언패킹해도 프로그램이 정상실행되지 않는다.
=> 언패킹 방해할 수 있음

 

 


 -  StolenByte 찾기

 

프로그램을 디버거에서 분석했을 때 위와 같이 popad 직후에 push되는 값들이 있다면 이것을 StolenByte로 추정할 수 있다.

상자 안의 값들이 StolenByte가 맞는지 확인하기 위해선 저 값들을 원래 위치에 넣어주고 프로그램이 정상 작동하는지 보면 된다. (아래 과정)

 

 

 

 -  StolenByte 적용 해제 방법(확인 방법) 

예제로 사용할 프로그램은 CodeEngn Basic RCE L9의 문제파일이다.

 

이 프로그램은 upx로 패킹되었으므로 upx.exe로 언패킹한다. 언패킹한 파일을 실행하면, StolenByte로 인해 오류가 발생한다.

 

 

 

 

언패킹한 파일을 디버거로 열어보면 MessageBox함수를 호출하기 전에 인자값이 들어가야 하는데 nop으로 채워져 있는 것을 볼 수 있다. 아마 이곳이 도난당한 바이트들이 원래 있던 자리일 것이다.

 

 

 

 

immunity debugger는 더블클릭으로 어셈블리 명령을 수정할 수 있다. 맨 위 nop을 클릭하고 앞에서부터 찾은 StolenByte를 입력하면 된다.

명령어 수정이 끝나면 어셈블리 코드 창에서 우클릭 > copy to executable > all modifications > copy all 선택,

새로운 프로그램 창이 뜨면 우클릭 > save file > 파일 이름 입력 후 저장

 

 

 

StolenByte를 넣어서 패치 한 파일을 실행하니 언패킹 직후와 다르게 정상 실행 된다. 

 

 

 

 

 

 

 

사실 StolenByte라는 개념은 학교 리버싱 수업에서도 배운 적이 없고, 검색해봐도 많은 정보가 나오지 않아 생소한 개념이었지만 어렵지 않으므로 숙지해놓으면 좋을 것이라고 생각한다.