강사는 본 과정을 따라오지 못한다면, 초급과정으로 내려가는 것이 좋다고 권유함
1. UPX
"TEST"를 출력하는 MsgBox를 출력하는 프로그램을 upx패킹해보도록 하자.
1-1. UPX자동 패킹/언패킹
upx.exe를 통해 upx로 패킹할 수 있다.
위와 같이 UPX로 패킹되어 있다는 안내 문구를 프로그램에서 확인해볼 수 있다.
PE VIEW로 열어보면 다양한 메모리 할당을 위한 함수를 사용하고 있는 모습 또한 볼 수 있었다.
언패킹 또한 upx.exe로도 가능하다. 위와 같은 명령어를 사용하면 언패킹된다.
패킹되었다는 안내문구가 사라지고, 패킹되지 않은 프로그램임을 알 수 있다.
패킹되기 전 파일을 한번 집어넣어 본 것인데, 함수 호출을 위한 테이블이 그대로 살아있는 모습도 확인할 수 있으며, PE헤더부와 데이터부 또한 다르다는 사실을 알 수 있다.
한가지 신기한 점은 패킹후 언패킹한 파일에서는 IMPORT Name Table을 정상적으로 불러오지 않는다. 이 점은 궁금한 대목이다. 패킹을 하는 동안 날아가버리는 것 같다고 생각했다.
1-2. UPX 수동 언패킹
생각보다 쉽다. 혼자 공부할때 실행이 안돼서 하다가 던진 기억이 나는데, 생각보다 쉬웠다.
UPX를 언패킹하기 위해 올리디버거로 열면 아래와 같은 코드가 나온다.
PUSHAD를 통해 가지고있는 레지스터를 스택에 백업하고 로직을 흘러가게 되는데, 그렇다면 실제 코드로 이동할때 POPAD를 통해 레지스토리 정보를 복원후 이동할 것이다.
올리디버거에서 ctrl+s키를 사용하면 사용되는 명령어를 찾을 수 있는데, POPAD를 찾아보자.
올리디버거에서 ctrl+l키를 누르면 다음 찾기 기능이 실행된다. POPAD를 쭉 찾다 보면 아래와 같은 로직이 나온다.
맨 아랫쪽 00407AAB에서 00401340으로 jmp하는 것을 알 수 있는데, 이 00401340이 OEP이다.
실제로, 패킹되지 않은 프로그램을 열어도 시작하는 주소가 00401340임을 알 수 있다.
이제, 언패킹을 시작해 보자.
00401340에서 커서가 놓인 상태에서 [Plugins -> OllyDump -> Dump debugged process]를 통해 아래와 같은 덤프 화면을 볼 수 있다.
이상태에서 DUMP를 누르면 DUMP를 뜰 수 있고, 떠진 덤프를 실행하면 실행이 되지 않는다. 이는 프로그램에서 import한 라이브러리 정보가 들어가 있지 않아서 그렇다. ImportREC프로그램을 통해 이를 해결할 수 있다.
맨 위에 현재 실행중인 프로그램 중, 우리가 패치해야되는 msgbox프로그램을 선택하고, OEP를 유효값인 1340으로 맞추고 IAT AutoSearch를 누르고 Get Imports를 누르면 임포트할 수 있는 것들이 나온다.
Fix Dump버튼을 누른 뒤, 올리디버거에서 덤프를 떴던 파일을 선택하면, 라이브러리를 임포트 하고, 실행 가능한 파일이 생성된다.
이렇게 생성된 파일은 정식 upx패커로 깐 것과는 조금 많이 다르다. 아래 사진과 같이 데이터섹션에 UPX영역도 남아있고, 약간은 난잡해 보인다. 코드 압축만 풀어 놨기 때문에, 약간 다르다. 그러나 함수 정보들은 제대로 불러오는 것을 확인할 수 있다.
이것으로 수동으로 upx를 언패킹할 수 있게 되었다.
'저세상 해킹 > 악성코드분석 - 중급' 카테고리의 다른 글
1. 실습환경 정리 (0) | 2021.03.04 |
---|