소프트웨어를 패킹할 때 주목적은 protection과 compressor입니다. protection을 목적으로 하는 패킹의 경우 Armadillo, Thermida 등이 있으며 compressor를 목적으로 하는 패킹의 경우 UPX 등이 있습니다.

그러면 여기서 잠깐...
왜 분석가는 패커를 알아야 할까요??
그 이유는, 악성코드가 패킹이 되어있으면 원본코드가 압축이 되어있어서 리버싱하는 데 방해가 됩니다. 따라서 분석을 하기 위해서는 언패킹 작업이 선행되어야합니다.

이번 글에서는 악성코드에서 자주 사용되는 UPX로 패킹된 파일을 언패킹하여 발가벗겨 보는 방법에 대해서 알아보겠습니다.

우선, OEP를 찾아야 합니다. 패킹된 파일이 메모리에 로드되면 언패킹루프를 거친 후 OEP로 분기하게 됩니다.

아래 그림은 설명과 함께 사용될 UPX로 패킹된 예제파일입니다. 아래 첫 번째 그림을 보시면 올리디버거에 예제 파일을 로드하게 되면 compress 코드라는 경고문이 팝업됩니다. 확인을 누르시고 언패킹루프를 거친 후 OEP로 분기를 하게 되면 두 번째 그림과 같습니다.




OEP는 위에서 보신 것과 같이 01012475h입니다. 이제 메모리 덤프를 뜨겠습니다. 여기서 수정할 부분은 빨간색 박스로 표시한 두 부분입니다. 우선, Entry point를 구해야 합니다. 방법은 아래와 같습니다.

Virtual Address - Imagebase = Entry point
01012475h - 01000000h = 12475h


그럼, 12475h값을 입력해 줍니다.
그 다음 Rebuild Import 부분의 체크를 해제합니다. 이것의 기능은 OllyDump가 자동으로 IAT 를 복원해 주는 기능이지만 자동으로 찾아주는 경우가 드물기 때문에 다음 글에서 수동으로 IAT를 복원하도록 하겠습니다.


이번 글의 마지막으로 다뤄볼 내용은 다음 글에서 이어지는 내용이니 기억해 두시면 좋을 것 같습니다. 기억해두신 분은 다음 글을 읽을 때 중간에 "아~" 하고 읽을 것이고 기억해두지 않은 분은 "이게 갑자기 먼 소리고?" 하고 읽을 것입니다.



임포트 테이블은 총 7개이지만 로드되는 dll은 6개 입니다. 왜냐하면 마지막 엔트리는 임포트 테이블의 끝을 나타내기 위해 NULL로 채워져있기 때문입니다. 위 그림에서 빨간색 박스 안을 보시면 NULL로 채워진 것을 확인할 수 있습니다. 다음 글에서 실제로 IAT를 복원할 때 dll이 6개인지 확인해 보도록 하겠습니다.

이상 글을 마치겠습니다.

To be contined...


신고
Creative Commons License
Creative Commons License
Posted by 비회원