StolenByte를 구하라고 문제가 나와있다.
StolenByte가 무엇일까?
StolenByte 는 훔친 바이트란 의미로 프로그램의 한부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 말한다. 주로 옮겨지는 코드는 엔트리 포인트위의 몇개의 코드들이며 옮겨진 코드들은 OEP 주소로 점프하기 전에 위치에서 PUSH 된다. 이러한 StolenByte 는 주로 패커가 프로그램을 패킹할때 볼수있다. 이렇게 옮겨진 코드들은 할당된 메모리 공간에서 실행된다. 이때문에 패킹된 프로세스가 덤프될때 StolenByte를 복구하지 못하면 프로그램은 정상적으로 작동하지 못하게 됩니다. |
실행시켜 보자.
keyfile을 check한다는 박스가 뜨고 '확인' 버튼을 누르면 파일을 찾을 수 없다는 메시지 박스가 출력된다.
upx 실행 압축 되어 있으므로 해제하고 실행하여 보자.
실행 압축을 해제하였더니 StolenByte를 복구하지 않아 생기는 현상이다.
우리는 StolenByte가 OEP코드 전에 PUSH 된다는 것을 알고 있다.
UPX압축된 파일에서 OEP코드로 JUMP하기 직전에 코드들을 살펴보자.
OEP 주소는 0040100C로 확인되어진다.
그리고 OEP코드를 실행 하기 전에 3개의 인자가 PUSH되는 것을 확인 할 수 있다.
바로 이부분이 StolenByte가 되는 것이다. 그렇다면 OEP코드 부분으로 점프를 하고 코드를 살펴보자.
MessageBoxA 함수를 호출하는데 인자 값을 1개만 넣어주고 호출한다.
MessageBoxA 함수는 기본적으로 인자를 4개 입력받아야 한다.
이제 upx로 언팩킹 한 파일을 열어 StolenByte 코드 부분을 수정하여 준다.
패치 이후 파일로 저장하여 준다.
정상적으로 실행되는 것을 볼 수 있다.
StolenByte를 찾는게 이문제 답이므로 위에 네모 박스 부분이 정답이 됩니다.