맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 09 


Author : abex

Korean : 

StolenByte를 구하시오 

Ex) 75156A0068352040 

English : 

Find the StolenByte 

Ex) 75156A0068352040 

문제를 보니 프로그램내이 StolenByte 가 존재한다는것을 알수있습니다. StolenByte에 대해 간단하게 알아보면, 아래와 같습니다.

StolenByte 는 훔친 바이트란 의미로 프로그램의 한부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 말합니다. 주로 옮겨지는 코드는 엔트리 포인트위의 몇개의 코드들이며 옮겨진 코드들은 OEP 주소로 점프하기 전에 위치에서 PUSH 됩니다.

이러한 StolenByte 는 주로 패커가 프로그램을 패킹할때 볼수있습니다. 이렇게 옮겨진 코드들은 할당된 메모리 공간에서 실행됩니다. 이때문에 패킹된 프로세스가 덤프될때 StolenByte를 복구하지 못하면 프로그램은 정상적으로 작동하지 못하게 됩니다.

그럼일단 분석을 위해 프로그램을 다운받아서 실행 해보도록하겠습니다. 

 

 

실행해보니 위와 같은 메시지를 출력하게됩니다. 프로그램의 형태를 확인했으니 이제 분석을 위한 정보를 얻어보겠습니다. 먼저 위의 파일이 어떤 방식으로 패킹되었는지 확인하기 위해 PEiD로 열어보도록 하겠습니다.

확인 결과 UPX를 통해 패킹되었다는것을 알수있습니다. upx.exe 를 통해서 언패킹을 해보았으나 StolenByte를 복구하지 않아 아래와 같은 오류가 발생되는것을 알수있습니다. 

StolenByte를 복구하기 위해서는 올리디버거를 통한 분석을해서 찾아내야 하므로 올리디버거를 통해서 열어보겠습니다. 

우리가 시작부분에서 간단하게 알아본 StolenByte 에 대한 정보중에 훔쳐진 코드는 OEP 주소로 점프하기 전에 PUSH 된다는것을 알수있습니다. 우리는 UPX로 패킹됬을때 OEP 주소로 점프하는 위치를 잘알고 있기 때문에 일단 그위치로 이동해보도록 하겠습니다.

위치로 이동해보니 위의 그림과 같이 정확히 3개가 푸쉬되고 있는것을 확인할수 있습니다. 바로 이부분이 훔친 코드들임을 확인할수 있습니다. 더정확한 확인을 하기 위해서 OEP주소로 점프해보도록 하겠습니다. 만약위의 코드가 훔친 코드가 맞다면 OEP 주소위의 3개의 값들이 비어있을것입니다. 

OEP 주소로 이동해보니 위와 같이 여러개의 NOP이 있고 PUSH 0 과 MessageBoxA 를 출력하고 있는 모습을 볼수있습니다.

 MessageBox 함수의 기본구조에서 파라미터값은 4개인것을 봤을때, 1개만 입력된 상태이고 3개가 비어있는것을 보니 훔쳐진 코드3개와 비어있는 코드3개가 일치하는것을 확인할수 있습니다. 그럼이제 이 훔쳐진 코드를 빈자리에 입력을 해보도록 하겠습니다.

Hex 부분의 훔쳐진 코드들의 Opcode 부분을 입력해서 수정하도록 하겠습니다. (ctrl + e 를 통해서 수정할수 있습니다.)

수정을 완료해주면 아래와 같은 모습을 볼수있습니다.

이제 StolenByte를 덮어쓴 프로그램을 올리덤프를 이용해서 덤프해보도록 하겠습니다. 여기서는 아래와 같이 OEP 주소를 1000으로 변경해줘야 됩니다.

확인결과 정상적으로 실행되는것을 확인할수 있습니다.

  • 코드엔진 인증값을 opcode를 입력해주면됩니다.

Posted by STIH

댓글을 달아 주세요