WEBVTT

00:00.620 --> 00:03.320
안녕하세요, 새 섹션에 오신 것을 환영합니다.

00:03.500 --> 00:12.560
이 새로운 섹션에서는 VMProtect라는 상용 패커로 보호되는 트로이 목마의 압축을 푸는

00:12.560 --> 00:15.230
방법을 살펴보겠습니다.

00:15.680 --> 00:26.360
이 트로이 목마 VM 빈을 다운로드하여 압축을 풀고 바탕 화면의 VMProtect 트로이 목마라는 폴더에 넣으세요.

00:26.360 --> 00:38.150
먼저 DIE로 스캔하겠습니다. Flare를 열고 유틸리티 폴더로 이동하여 Detect It Easy DIE를

00:38.180 --> 00:40.040
실행하세요.

00:43.780 --> 00:46.300
그런 다음 쉽게 감지하기를 사용합니다.

00:46.810 --> 00:50.950
여기에 있는 점 3개를 클릭하면 트로이 목마가 열립니다.

00:55.030 --> 00:56.830
휴지통에 전화합니다.

00:56.860 --> 00:58.000
열기를 클릭합니다.

01:00.920 --> 01:05.720
보고서에 따르면 보호자가 보호되고 있음을 확인할 수 있습니다.

01:06.320 --> 01:18.350
그리고 이것은 델파이로 작성되었습니다. 이제 우리는 이 트로이 목마가 델파이 트로이 목마이며 VMProtect라는 상용 패커에

01:18.350 --> 01:21.230
의해 보호된다는 것을 알았습니다.

01:22.010 --> 01:27.320
이제 디텍트 잇 이지 기능을 닫고 포장을 풀어보겠습니다.

01:27.860 --> 01:38.600
32비트 트로이 목마이므로 x32dbg, x32dbg를 실행하세요. 옵션, 환경설정에서 시스템 중단점 및 콜백을

01:38.600 --> 01:48.740
선택 취소하고 예외 탭으로 이동하여 범위 무시를 클릭하고 모든 0, 8개의 0, 8개의

01:48.740 --> 01:52.670
F를 정리할 수도 있습니다.

01:52.700 --> 01:57.650
즉, 예외가 발생했을 때 디버거가 중단되는 것을 원하지 않습니다.

01:59.060 --> 02:09.920
이제 트로이 목마를 열고 폴더로 이동한 다음 드롭다운을 클릭하고 모든 파일을 선택한 다음 트로이 목마를

02:09.920 --> 02:12.650
선택하여 엽니다.

02:13.430 --> 02:18.650
이제 진입 지점에 도달했으며 세 개의 중단점을 설정하겠습니다.

02:18.680 --> 02:21.980
첫 번째 중단점은 VirtualAlloc입니다.

02:25.150 --> 02:30.760
Enter 키를 누릅니다. 두 번째 중단점은 VirtualProtect입니다.

02:33.670 --> 02:39.130
Enter를 누르면 세 번째 중단점이 GetProcAddress입니다.

02:40.300 --> 02:46.360
프로세스 주소 가져오기를 나타내는 GetProcAddress입니다.

02:46.720 --> 02:47.500
프로세스 주소

02:47.500 --> 02:54.130
가져오기는 트로이 목마가 특정 라이브러리가 있는 주소를 식별하려고 시도하는 곳입니다.

02:54.370 --> 03:01.120
그리고 이것은 트로이 목마가 외부 함수를 호출하려고 할 때 매우 일반적으로 사용됩니다.

03:01.600 --> 03:02.740
그러니 Enter 키를 누르세요.

03:03.220 --> 03:09.640
이제 중단점 탭으로 이동하여 중단점 세 개가 모두 설정되었는지 확인합니다.

03:12.110 --> 03:15.020
이제 첫 번째 중단점으로 이동합니다.

03:18.390 --> 03:19.980
그리고 그것은 우리의 VirtualAlloc을 강타했습니다.

03:20.760 --> 03:30.120
이제 F8 키를 누르거나 이 버튼을 클릭하여 VirtualProtect로 이동합니다.

03:31.060 --> 03:32.500
VirtualProtect로 이동합니다.

03:35.280 --> 03:41.070
이제 5개의 파라미터를 스택에 푸시하고 VirtualProtect를 호출하려고 합니다.

03:41.310 --> 03:45.570
이제 스택으로 이동하여 두 번째 매개 변수를 살펴봅니다.

03:46.230 --> 03:55.830
따라서 메모리에서 권한을 변경하려는 위치는 0x01 다음에 4000입니다.

03:56.490 --> 04:00.000
메모리 맵으로 이동하여 위치를 확인할 수 있습니다.

04:00.000 --> 04:06.870
0x401 뒤에 오는 4개의 0은 실행 섹션인 점 텍스트 섹션입니다.

04:08.070 --> 04:13.530
따라서 현재로서는 실행 및 읽기만 가능합니다.

04:13.650 --> 04:15.270
쓰기 불가능합니다.

04:16.300 --> 04:17.490
W가 없습니다.

04:19.330 --> 04:21.940
그러니 이쪽과 이쪽으로 돌아와 주세요.

04:21.940 --> 04:23.500
이제 넘어갈 수 있습니다.

04:24.590 --> 04:26.950
하지만 이를 따라하고 싶으시다면 가능합니다.

04:26.960 --> 04:28.700
하지만 그럴 필요는 없다고 생각합니다.

04:29.030 --> 04:36.410
따라서 내부의 포장을 풀고 자체 코드를 덮어쓸 가능성은 없으므로 넘어가겠습니다.

04:37.400 --> 04:44.330
이제 메모리 맵으로 돌아가서 W가 있는 것을 확인하겠습니다.

04:45.670 --> 04:47.710
이제 쓰기 가능으로 변경되었음을 의미합니다.

04:49.570 --> 04:57.550
이제 우리는 끝까지 달려갑니다. F9를 누르거나 이 버튼을 클릭하면 VirtualProtect가 두 번째로

04:58.210 --> 05:00.490
실행되고 계속해서 그 위를 지나갑니다.

05:01.630 --> 05:08.200
VirtualProtect로 이동한 다음 다시 이동하여 5개의 매개변수를 스택에 밀어 넣습니다.

05:08.650 --> 05:11.380
이제 VirtualProtect를 호출하려고 합니다.

05:11.410 --> 05:14.260
이번에는 이 주소로 오세요.

05:14.440 --> 05:21.400
따라서 이 메모리 영역에 대한 권한을 변경할 것입니다. 따라서 두 번째 덤프에서 이를 따를 수 있습니다.

05:21.430 --> 05:23.170
그래서 두 번째 덤프를 선택합니다.

05:23.170 --> 05:26.740
그런 다음 이 주소를 마우스 오른쪽 버튼으로 클릭하고 DWORD를 팔로우합니다.

05:27.840 --> 05:30.840
현재 덤프에서 두 번째 덤프인 DWORD를 따릅니다.

05:31.530 --> 05:32.850
이제 비어 있습니다.

05:33.120 --> 05:35.490
아직 여기에 아무것도 풀지 않았습니다.

05:35.550 --> 05:42.030
따라서 주소 지역이 일반 지역과 다르다는 것을 알 수 있습니다.

05:42.180 --> 05:49.290
일반적인 지역 주소는 0x004로 시작하고 그 뒤에 0이 다섯 번 나옵니다.

05:49.470 --> 05:52.690
하지만 이 영역은 0x012입니다.

05:52.710 --> 05:55.890
따라서 이 지역에서 포장을 풀 가능성이 높습니다.

05:56.400 --> 05:59.700
그래서 우리는 계속 실행하면서 어떤 일이 일어나는지 지켜보고 있습니다.

05:59.790 --> 06:06.420
현재 이 영역은 0x01287에 이어 0이 세 개 있습니다.

06:06.450 --> 06:09.480
메모리 맵을 보면 여기입니다.

06:09.960 --> 06:13.920
현재 실행 및 읽기 전용입니다.

06:13.950 --> 06:15.780
쓰기 불가능합니다.

06:16.260 --> 06:22.830
이제 이 부분을 넘어 다시 돌아와서 메모리 맵을 살펴보면 보시다시피

06:23.750 --> 06:26.330
이제 쓰기 가능합니다.

06:26.370 --> 06:29.480
W. 즉, 여기에 무언가를 쓸 것입니다.

06:29.660 --> 06:31.640
여기서 몇 가지 코드를 풀어보겠습니다.

06:32.690 --> 06:34.580
그럼 계속 달려보겠습니다.

06:35.840 --> 06:37.980
그리고 세 번째로 VirtualProtect를

06:38.000 --> 06:48.260
다시 공격합니다. 이제 넘어가서 VirtualProtect로 이동하고 다시 건너뛰고 넘어갑니다. 5개의 매개변수를 스택에 푸시합니다.

06:48.480 --> 06:55.040
이제 이 메모리 주소 0x012F와 그 뒤에 0이 세 개 있는 VirtualProtect를 호출합니다.

06:55.520 --> 06:59.030
따라서 0x012F도 0x012 범위의

07:00.570 --> 07:06.660
동일한 메모리 영역입니다. 0x012F는 여기입니다.

07:07.020 --> 07:09.780
이 부분은 현재 읽기만 가능합니다.

07:09.810 --> 07:11.250
아직 쓸 수 없습니다.

07:12.420 --> 07:15.390
따라서 지금 넘어갔다가 다시 돌아오면 이제 쓰기

07:16.270 --> 07:19.240
가능한 상태가 되는 것을 볼 수 있습니다.

07:20.560 --> 07:21.880
그래서 우리는...

07:23.860 --> 07:31.300
이전에 이 작업을 수행한 적이 있고 여기 VirtualProtect에 대한 이전 값이 덤프할

07:31.330 --> 07:37.210
값이 아니라는 것을 알고 있으므로 이 값을 따를 필요는 없습니다.

07:37.210 --> 07:44.980
하지만 어쨌든 원한다면 할 수 있습니다. 덤프 3을 입력한 다음 여기에 마우스 오른쪽 버튼을 클릭하고 DWORD를 따라 덤프를

07:44.980 --> 07:45.910
호출합니다.

07:46.900 --> 07:49.120
이전에 해본 적이 있고 여기에서 코드를

07:49.120 --> 07:53.680
풀 수 있다는 것을 알고 있기 때문에 우리가 관심을 갖는 것은 이것입니다.

07:53.980 --> 07:58.000
여기에서도 메인 코드가 아닌 포장을 풀려고 합니다.

07:58.570 --> 07:59.560
바로 이거예요.

08:00.400 --> 08:04.750
이제 다음 중단점으로 넘어가 보겠습니다.

08:05.660 --> 08:07.550
그리고 다시 누르세요.

08:07.880 --> 08:08.900
뒤로 물러서세요.

08:11.050 --> 08:13.180
VirtualProtect로 이동합니다.

08:13.480 --> 08:18.580
다시 점프하여 5개의 매개변수를 스택으로 밀어 넣습니다.

08:19.270 --> 08:24.670
이제 0x0126000에 대한 권한 비트를 변경합니다.

08:25.440 --> 08:26.970
0x0126000.

08:28.870 --> 08:30.790
그럼 여기서 따라갈 수 있습니다.

08:30.790 --> 08:32.920
마우스 오른쪽 버튼을 클릭하고 덤프에서 DWORD를 팔로우합니다.

08:34.060 --> 08:39.100
0x0126000으로 메모리 맵을 살펴봅니다. 0x0126000이 여기 있습니다.

08:39.100 --> 08:43.420
현재로서는 읽을 수 있지만 한 걸음 더 나아가서 어떤 일이 발생하는지 살펴봅시다.

08:44.220 --> 08:48.000
이제 여기를 보시면 쓰기 가능 상태가 됩니다.

08:49.680 --> 08:51.510
그럼 계속 달려보겠습니다.

08:53.810 --> 09:00.980
이제 실행 중이며 마침내 덤프에 무언가를 채웠습니다.

09:01.760 --> 09:07.130
따라서 이 부분도 여기에서 볼 수 있듯이 지금 채워지고 있습니다.

09:08.300 --> 09:11.420
이 메모리 주소와 여기에서도 마찬가지입니다.

09:11.720 --> 09:14.990
여기에서 엠바카데로 문자열을 볼 수 있습니다.

09:15.680 --> 09:25.040
즉, 실행할 델파이 세션이라는 뜻입니다. 0x0126000도 0x0128과 같은 영역에 있으며

09:25.040 --> 09:28.790
주소에서 조금 더 아래에 있습니다.

09:30.240 --> 09:30.540
알겠습니다.

09:30.540 --> 09:32.280
이제 우리는 계속 달릴 수 있습니다.

09:37.610 --> 09:40.280
자, 이제 GetProcAddress를 호출합니다.

09:40.310 --> 09:43.820
이 중단점에 도달했습니다.

09:43.820 --> 09:51.290
그리고 다른 대안은 여기 아래를 보는 대신 여기 오른쪽에서 매개변수를 찾는 것입니다.

09:51.830 --> 09:59.690
따라서 GetProcAddress에 대해 자세히 알고 싶으시면 MSDN에서 찾아보실 수 있습니다.

09:59.960 --> 10:10.100
두 번째 매개변수는 찾고자 하는 API의 이름이며, 이 API가 있는 주소를 반환합니다.

10:10.730 --> 10:13.040
원하시면 여기에서 읽어보실 수 있습니다.

10:13.550 --> 10:18.400
따라서 이 경우 반환되는 주소는 -입니다.

10:19.710 --> 10:28.590
하지만 저희는 멀웨어가 덤핑하는 위치를 찾는 데만 관심이 있기 때문에 이 멀웨어가 어떤 API를 찾으려고 하는지

10:28.590 --> 10:31.320
추적하는 데는 관심이 없습니다.

10:31.560 --> 10:37.650
하지만 GetProcAddress에 중단점을 설정한 이유는 덤프할 정확한 시점이 언제인지 알고 싶기 때문입니다.

10:37.950 --> 10:44.880
따라서 올바른 덤프 시점은 GetProcAddress가 덤핑이 완료되었음을 나타내는 문자열을

10:44.880 --> 10:46.530
찾고 있을 때입니다.

10:46.860 --> 10:49.810
그래서 GetProcAddress에 중단점을 설정했습니다.

10:49.920 --> 10:58.230
따라서 현재 두 번째 매개변수인 ProcAddress를 살펴보면 이 API가 주소를 가져오려고 하는

10:58.240 --> 11:03.330
것은 바로 이 API입니다. 계속 실행하여 GetProcAddress를 실행합니다.

11:03.360 --> 11:09.120
이번에는 SetValue라는 다른 API를 찾고 있습니다. 다시 실행합니다.

11:10.330 --> 11:14.980
다시 누르세요. 이번에는 3단계를 찾고 있습니다.

11:16.270 --> 11:19.900
다시 실행하면 이제 GetProcAddress에 도달합니다.

11:19.900 --> 11:21.580
이번에는 인코드포인터입니다.

11:22.730 --> 11:24.970
다시 실행합니다.

11:24.980 --> 11:27.020
GetProcAddress, 인코딩 포인터.

11:27.700 --> 11:29.030
다시 실행합니다.

11:29.030 --> 11:31.220
GetProcAddress, 인코딩 포인터.

11:31.880 --> 11:33.710
다시 실행합니다.

11:34.070 --> 11:35.380
주소, 인코딩 포인터.

11:35.390 --> 11:43.880
따라서 F9 또는 이 버튼을 계속 클릭하면 이 함수에 대한 API 주소를 가져오기 위해 GetProcAddress를 계속

11:43.880 --> 11:46.100
호출하는 것을 볼 수 있습니다.

11:46.250 --> 11:49.400
아마도 이것이 VMProtect가 작동하는 방식일 것입니다.

11:49.550 --> 11:54.140
주소를 얻기 위해 포인터로 무언가를 시도하고 있습니다.

11:55.040 --> 11:56.390
F9를 계속 누릅니다.

11:56.600 --> 11:57.620
F9를 다시 입력합니다.

11:57.650 --> 12:06.800
이번에는 디코드포인터입니다. 디코드포인터의 GetProcAddress. F9를 다시 클릭하고 여전히 동일한 GetProcAddress, DecodePointer를

12:06.920 --> 12:07.730
클릭합니다.

12:07.730 --> 12:16.940
따라서 멀웨어를 실행하기 위한 모든 API, 함수 이름, 함수 주소를 디코딩하고 메모리에

12:17.210 --> 12:19.790
압축을 풀려고 합니다.

12:20.000 --> 12:26.700
그러니 F9 또는 이 버튼을 누르세요. 이제 인코딩 포인터를 다시 실행합니다.

12:27.270 --> 12:32.980
이렇게 해서 VMProtect가 다시 작동하는 것 같습니다.

12:33.000 --> 12:36.720
자, 이제 VirtualProtect로 돌아왔습니다.

12:36.900 --> 12:43.780
이제 다음 동영상에서 분석을 계속 이어가겠습니다.

12:43.800 --> 12:45.240
시청해 주셔서 감사합니다.
