StolenByte를 구해야 하는 문제입니다. 여기서 StolenByte 란
Packer 가 Packing 시 원본 코드의 코드 중 다른 곳으로 이동 시킨 코드로써 OEP의 몇 줄의 코드입니다.
원본 코드의 일부분이 다른 곳으로 이동되었기 때문에 일반적인 방법으로 Unpacking을 하면 비정상적인 동작을 하며,
이 StolenByte 부분을 원래대로 돌려준 후 Unpacking을 해야 제대로된 원본 프로그램을 얻을 수 있습니다.
PEid 툴을 이용해 UPX 패킹임을 확인할 수 있습니다.
아래는 그냥 언패킹을 했을 때 실행시킨 모습입니다. 비정상적으로 실행되는 것을 볼 수 있습니다.
그럼 이제 제대로 StolenByte를 구해서 복구해보겠습니다.
먼저 OEP로 점프하는 코드로 가보겠습니다.
자세히 보시면 POPAD 아래 Stack으로 PUSH를 하는 3줄의 코드가 보입니다. 그리고 PUSH한 상태 그대로 OEP로 이동하는 모습을 볼 수 있습니다. 즉, 원래 코드가 실행될 때 Stack에 올라가 같이 실행되는 저 3줄이 바로 StolenByte 입니다.
정답을 적을 때는 어셈블리어가 아닌 OPCODE를 쭉 이어 적어주시면 됩니다.(그 이어진 코드가 훔쳐진 Byte이기 때문)
정답은 찾았고 이젠 제대로 언팩하는 방법을 설명하겠습니다.
우선 3줄을 그대로 복사합니다.(그냥 Ctrl + C 누르세요)
그 다음 OEP로 이동을 하면 그 위에 NOP으로 된 여러 줄이 보이실 겁니다. 바로 이 부분이 StolenByte의 원래 위치입니다.(줄이 더 긴 이유는 OllyDbg에서 코드를 해석하면서 한 줄로 표기했기 때문입니다. 앞의 주소의 변경값을 비교해보면 확연히 차이가 난다는 것을 알 수 있습니다. Hex editor로 보시면 길이가 같아요.)
이제 맨 위의 NOP부터 차례대로 StolenByte를 입력하시면 됩니다.
입력하실 때는 Ctrl + E를 누르신 후 아래 HEX +00 부분에 입력하시면 됩니다
이렇게 수정하고 나서 Dump를 뜨실 때 주의하실 점이 있습니다.
위와 같이 Entry Point를 복구하기 전의 OEP로 잡는 것이 아니라.
아래와 같이 복구한 후의 OEP로 잡으셔야 합니다.
이렇게 Unpacking을 한 후 실행시키시면 정상적으로 작동하는 것을 볼 수 있습니다.