안녕하세요, 새 섹션에 오신 것을 환영합니다.
이 새로운 섹션에서는 VMProtect라는 상용 패커로 보호되는 트로이 목마의 압축을 푸는
방법을 살펴보겠습니다.
이 트로이 목마 VM 빈을 다운로드하여 압축을 풀고 바탕 화면의 VMProtect 트로이 목마라는 폴더에 넣으세요.
먼저 DIE로 스캔하겠습니다. Flare를 열고 유틸리티 폴더로 이동하여 Detect It Easy DIE를
실행하세요.
그런 다음 쉽게 감지하기를 사용합니다.
여기에 있는 점 3개를 클릭하면 트로이 목마가 열립니다.
휴지통에 전화합니다.
열기를 클릭합니다.
보고서에 따르면 보호자가 보호되고 있음을 확인할 수 있습니다.
그리고 이것은 델파이로 작성되었습니다. 이제 우리는 이 트로이 목마가 델파이 트로이 목마이며 VMProtect라는 상용 패커에
의해 보호된다는 것을 알았습니다.
이제 디텍트 잇 이지 기능을 닫고 포장을 풀어보겠습니다.
32비트 트로이 목마이므로 x32dbg, x32dbg를 실행하세요. 옵션, 환경설정에서 시스템 중단점 및 콜백을
선택 취소하고 예외 탭으로 이동하여 범위 무시를 클릭하고 모든 0, 8개의 0, 8개의
F를 정리할 수도 있습니다.
즉, 예외가 발생했을 때 디버거가 중단되는 것을 원하지 않습니다.
이제 트로이 목마를 열고 폴더로 이동한 다음 드롭다운을 클릭하고 모든 파일을 선택한 다음 트로이 목마를
선택하여 엽니다.
이제 진입 지점에 도달했으며 세 개의 중단점을 설정하겠습니다.
첫 번째 중단점은 VirtualAlloc입니다.
Enter 키를 누릅니다. 두 번째 중단점은 VirtualProtect입니다.
Enter를 누르면 세 번째 중단점이 GetProcAddress입니다.
프로세스 주소 가져오기를 나타내는 GetProcAddress입니다.
프로세스 주소
가져오기는 트로이 목마가 특정 라이브러리가 있는 주소를 식별하려고 시도하는 곳입니다.
그리고 이것은 트로이 목마가 외부 함수를 호출하려고 할 때 매우 일반적으로 사용됩니다.
그러니 Enter 키를 누르세요.
이제 중단점 탭으로 이동하여 중단점 세 개가 모두 설정되었는지 확인합니다.
이제 첫 번째 중단점으로 이동합니다.
그리고 그것은 우리의 VirtualAlloc을 강타했습니다.
이제 F8 키를 누르거나 이 버튼을 클릭하여 VirtualProtect로 이동합니다.
VirtualProtect로 이동합니다.
이제 5개의 파라미터를 스택에 푸시하고 VirtualProtect를 호출하려고 합니다.
이제 스택으로 이동하여 두 번째 매개 변수를 살펴봅니다.
따라서 메모리에서 권한을 변경하려는 위치는 0x01 다음에 4000입니다.
메모리 맵으로 이동하여 위치를 확인할 수 있습니다.
0x401 뒤에 오는 4개의 0은 실행 섹션인 점 텍스트 섹션입니다.
따라서 현재로서는 실행 및 읽기만 가능합니다.
쓰기 불가능합니다.
W가 없습니다.
그러니 이쪽과 이쪽으로 돌아와 주세요.
이제 넘어갈 수 있습니다.
하지만 이를 따라하고 싶으시다면 가능합니다.
하지만 그럴 필요는 없다고 생각합니다.
따라서 내부의 포장을 풀고 자체 코드를 덮어쓸 가능성은 없으므로 넘어가겠습니다.
이제 메모리 맵으로 돌아가서 W가 있는 것을 확인하겠습니다.
이제 쓰기 가능으로 변경되었음을 의미합니다.
이제 우리는 끝까지 달려갑니다. F9를 누르거나 이 버튼을 클릭하면 VirtualProtect가 두 번째로
실행되고 계속해서 그 위를 지나갑니다.
VirtualProtect로 이동한 다음 다시 이동하여 5개의 매개변수를 스택에 밀어 넣습니다.
이제 VirtualProtect를 호출하려고 합니다.
이번에는 이 주소로 오세요.
따라서 이 메모리 영역에 대한 권한을 변경할 것입니다. 따라서 두 번째 덤프에서 이를 따를 수 있습니다.
그래서 두 번째 덤프를 선택합니다.
그런 다음 이 주소를 마우스 오른쪽 버튼으로 클릭하고 DWORD를 팔로우합니다.
현재 덤프에서 두 번째 덤프인 DWORD를 따릅니다.
이제 비어 있습니다.
아직 여기에 아무것도 풀지 않았습니다.
따라서 주소 지역이 일반 지역과 다르다는 것을 알 수 있습니다.
일반적인 지역 주소는 0x004로 시작하고 그 뒤에 0이 다섯 번 나옵니다.
하지만 이 영역은 0x012입니다.
따라서 이 지역에서 포장을 풀 가능성이 높습니다.
그래서 우리는 계속 실행하면서 어떤 일이 일어나는지 지켜보고 있습니다.
현재 이 영역은 0x01287에 이어 0이 세 개 있습니다.
메모리 맵을 보면 여기입니다.
현재 실행 및 읽기 전용입니다.
쓰기 불가능합니다.
이제 이 부분을 넘어 다시 돌아와서 메모리 맵을 살펴보면 보시다시피
이제 쓰기 가능합니다.
W. 즉, 여기에 무언가를 쓸 것입니다.
여기서 몇 가지 코드를 풀어보겠습니다.
그럼 계속 달려보겠습니다.
그리고 세 번째로 VirtualProtect를
다시 공격합니다. 이제 넘어가서 VirtualProtect로 이동하고 다시 건너뛰고 넘어갑니다. 5개의 매개변수를 스택에 푸시합니다.
이제 이 메모리 주소 0x012F와 그 뒤에 0이 세 개 있는 VirtualProtect를 호출합니다.
따라서 0x012F도 0x012 범위의
동일한 메모리 영역입니다. 0x012F는 여기입니다.
이 부분은 현재 읽기만 가능합니다.
아직 쓸 수 없습니다.
따라서 지금 넘어갔다가 다시 돌아오면 이제 쓰기
가능한 상태가 되는 것을 볼 수 있습니다.
그래서 우리는...
이전에 이 작업을 수행한 적이 있고 여기 VirtualProtect에 대한 이전 값이 덤프할
값이 아니라는 것을 알고 있으므로 이 값을 따를 필요는 없습니다.
하지만 어쨌든 원한다면 할 수 있습니다. 덤프 3을 입력한 다음 여기에 마우스 오른쪽 버튼을 클릭하고 DWORD를 따라 덤프를
호출합니다.
이전에 해본 적이 있고 여기에서 코드를
풀 수 있다는 것을 알고 있기 때문에 우리가 관심을 갖는 것은 이것입니다.
여기에서도 메인 코드가 아닌 포장을 풀려고 합니다.
바로 이거예요.
이제 다음 중단점으로 넘어가 보겠습니다.
그리고 다시 누르세요.
뒤로 물러서세요.
VirtualProtect로 이동합니다.
다시 점프하여 5개의 매개변수를 스택으로 밀어 넣습니다.
이제 0x0126000에 대한 권한 비트를 변경합니다.
0x0126000.
그럼 여기서 따라갈 수 있습니다.
마우스 오른쪽 버튼을 클릭하고 덤프에서 DWORD를 팔로우합니다.
0x0126000으로 메모리 맵을 살펴봅니다. 0x0126000이 여기 있습니다.
현재로서는 읽을 수 있지만 한 걸음 더 나아가서 어떤 일이 발생하는지 살펴봅시다.
이제 여기를 보시면 쓰기 가능 상태가 됩니다.
그럼 계속 달려보겠습니다.
이제 실행 중이며 마침내 덤프에 무언가를 채웠습니다.
따라서 이 부분도 여기에서 볼 수 있듯이 지금 채워지고 있습니다.
이 메모리 주소와 여기에서도 마찬가지입니다.
여기에서 엠바카데로 문자열을 볼 수 있습니다.
즉, 실행할 델파이 세션이라는 뜻입니다. 0x0126000도 0x0128과 같은 영역에 있으며
주소에서 조금 더 아래에 있습니다.
알겠습니다.
이제 우리는 계속 달릴 수 있습니다.
자, 이제 GetProcAddress를 호출합니다.
이 중단점에 도달했습니다.
그리고 다른 대안은 여기 아래를 보는 대신 여기 오른쪽에서 매개변수를 찾는 것입니다.
따라서 GetProcAddress에 대해 자세히 알고 싶으시면 MSDN에서 찾아보실 수 있습니다.
두 번째 매개변수는 찾고자 하는 API의 이름이며, 이 API가 있는 주소를 반환합니다.
원하시면 여기에서 읽어보실 수 있습니다.
따라서 이 경우 반환되는 주소는 -입니다.
하지만 저희는 멀웨어가 덤핑하는 위치를 찾는 데만 관심이 있기 때문에 이 멀웨어가 어떤 API를 찾으려고 하는지
추적하는 데는 관심이 없습니다.
하지만 GetProcAddress에 중단점을 설정한 이유는 덤프할 정확한 시점이 언제인지 알고 싶기 때문입니다.
따라서 올바른 덤프 시점은 GetProcAddress가 덤핑이 완료되었음을 나타내는 문자열을
찾고 있을 때입니다.
그래서 GetProcAddress에 중단점을 설정했습니다.
따라서 현재 두 번째 매개변수인 ProcAddress를 살펴보면 이 API가 주소를 가져오려고 하는
것은 바로 이 API입니다. 계속 실행하여 GetProcAddress를 실행합니다.
이번에는 SetValue라는 다른 API를 찾고 있습니다. 다시 실행합니다.
다시 누르세요. 이번에는 3단계를 찾고 있습니다.
다시 실행하면 이제 GetProcAddress에 도달합니다.
이번에는 인코드포인터입니다.
다시 실행합니다.
GetProcAddress, 인코딩 포인터.
다시 실행합니다.
GetProcAddress, 인코딩 포인터.
다시 실행합니다.
주소, 인코딩 포인터.
따라서 F9 또는 이 버튼을 계속 클릭하면 이 함수에 대한 API 주소를 가져오기 위해 GetProcAddress를 계속
호출하는 것을 볼 수 있습니다.
아마도 이것이 VMProtect가 작동하는 방식일 것입니다.
주소를 얻기 위해 포인터로 무언가를 시도하고 있습니다.
F9를 계속 누릅니다.
F9를 다시 입력합니다.
이번에는 디코드포인터입니다. 디코드포인터의 GetProcAddress. F9를 다시 클릭하고 여전히 동일한 GetProcAddress, DecodePointer를
클릭합니다.
따라서 멀웨어를 실행하기 위한 모든 API, 함수 이름, 함수 주소를 디코딩하고 메모리에
압축을 풀려고 합니다.
그러니 F9 또는 이 버튼을 누르세요. 이제 인코딩 포인터를 다시 실행합니다.
이렇게 해서 VMProtect가 다시 작동하는 것 같습니다.
자, 이제 VirtualProtect로 돌아왔습니다.
이제 다음 동영상에서 분석을 계속 이어가겠습니다.
시청해 주셔서 감사합니다.