
사고 대응 및 디지털 포렌식 디버깅 확장
SwishDbgExt는 Microsoft WinDbg 디버깅 확장 프로그램으로, Microsoft WinDbg에서 사용 가능한 명령어 세트를 확장하고 기존 명령어를 수정 및 개선합니다. 이 확장 프로그램은 Matt Suiche(@msuiche)가 개발했습니다. 추가 기능 요청, 기여 제안, 버그 신고는 [email protected]로 연락 주세요.
SwishDbgExt는 다양한 디버깅, 사고 대응 및 메모리 포렌식 명령어를 제공하여 커널 개발자, 문제 해결사 및 보안 전문가의 작업을 더 쉽게 만드는 것을 목표로 합니다. SwishDbgExt는 WinDbg 디버깅 확장 프로그램이므로 로컬 또는 원격 커널 디버깅 세션, Microsoft LiveKd에서 생성된 라이브 세션, 블루 스크린으로 인한 Microsoft 크래시 덤프 또는 Comae DumpIt 같은 하이브리드 유틸리티에서 사용할 수 있습니다.
자세한 내용은 https://blog.comae.io/comae-2016-contest-swishdbgext-features-3c9a63c62209#.tnt1b9usx 에서 확인하세요.
WinDbg 확장 프로그램을 해당 (x86 또는 x64) WinDbg 폴더에 복사하거나 아래와 같이 !load 명령어를 사용하여 수동으로 로드할 수 있습니다. 대상 DLL의 전체 경로에는 공백이나 따옴표를 사용할 수 없습니다.
!load X:\FullPath\SwishDbgExt.dll
###예제:
kd> !load E:\projects\labs\SwishDbgExt\bin\x64\SwishDbgExt.dll;
SwishDbgExt v0.7.0 (Nov 2 2016) - Incident Response & Digital Forensics Debugging Extension
SwishDbgExt Copyright (C) 2016 Comae Technologies FZE - http://www.comae.io
SwishDbgExt Copyright (C) 2014-2016 Matthieu Suiche (@msuiche)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
WinDbg 템플릿을 더 DML 친화적인 템플릿으로 업데이트하려면 패키지에 포함된 windbg_template.reg 파일을 직접 가져올 수 있습니다.
사용 가능한 확장 명령어에 대한 정보를 표시합니다.
이 명령어는 인수를 지정하지 않으면 모든 명령어 목록을 보여주고, 기존 명령어의 이름을 인수로 지정하면 해당 명령어의 매개변수 목록을 보여줍니다.
콜백 함수 표시
사용된 코드 케이브 검색
콘솔 명령어 기록 표시
사용자 자격 증명 표시 (gentilwiki의 mimikatz 기반)
드라이버 목록 표시. !ms_drivers는 현재 로드된 드라이버 목록을 표시합니다. 이 예제에서는 이 커널 덤프에서 충돌 시점에 로드된 몇 가지 드라이버를 보여줍니다. 이 명령어로 드라이버에 대한 심층 IRP 정보도 볼 수 있습니다: 위 이미지에서 e1cexpress.sys의 IRP 내 드라이버별 I/O 스택 위치를 확인할 수 있습니다. 여기에는 IRP_MJ_CREATE 같은 함수 코드가 표시되며, 이는 대상 장치 객체를 열어 해당 장치가 I/O 작업에 사용 가능함을 나타냅니다.
메모리 공간을 디스크에 덤프
Ex 큐에 대기 중인 작업자 표시.
!exqueue는 Windows 8에서 제대로 작동하지 않으므로, 작동하는 버전을 구현해야 했습니다. 원래 명령어와 마찬가지로 대기 중인 작업 스레드를 표시합니다.
WinDbg에서 세그먼테이션 재설정 (Fix "16.kd>")
GDT 표시.
!ms_gdt는 전역 디스크립터 테이블을 표시합니다. x64에서는 모든 셀렉터가 플랫(0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF)입니다. 이 명령어는 GDT에 대한 의심스러운 후킹을 확인하는 데 매우 유용할 수 있습니다. x64에서 GDT 후킹을 시도하면 버그 체크가 호출되기 때문입니다. x64에서는 GDT 후킹이 금지되어 있습니다.
레지스트리 하이브 목록 표시.
ms_hivelist는 레지스트리 하이브 목록을 표시합니다.
하이브(예: \Registry\Machine\Software)를 직접 열어 하위 키, 값 등을 볼 수 있습니다:

IDT 표시.
!ms_idt는 인터럽트 디스크립터 테이블을 표시합니다. GDT와 매우 유사하게, x64 시스템에서 IDT가 후킹되면 버그 체크가 호출됩니다. 이는 Microsoft가 커널 모드 드라이버가 IDT에 대한 호출을 가로채 자체 처리를 추가하는 것을 방지하도록 (프로그래밍 방식으로) 구현했기 때문입니다. 따라서 위 이미지에서는 모든 항목에 'No'가 표시됩니다.
메모리 공간을 분석하고 악성코드 점수 지수(MSI)를 반환합니다 (Frank Boldewin의 작업 기반)
마스터 부트 레코드(MBR) 스캔
네트워크 정보 표시 (소켓, 연결 등)
객체 목록 표시
프로세스 목록 표시.
!ms_process는 !process 및 !dml_proc의 개선된 버전입니다.
아래에서 확인할 수 있듯이 DML(Debugger Markup Language)을 명령어와 함께 사용하는 것이 좋은 점 중 하나입니다. 밑줄 친 모든 명령어는 실제로 명령어에 대한 링크입니다.
아래 예제에서는 /vads /scan 옵션의 출력을 볼 수 있습니다. VAD(가상 주소 디스크립터)를 스캔합니다. "Malware Score Index" 열이 있어 셸코드나 힙 스프레이를 탐지하는 데 유용할 수 있습니다.
아래 스크린샷에서는 힙 스프레이 사용으로 인해 여러 VAD에서 비정상적으로 높은 점수를 볼 수 있습니다. 점수를 클릭하면 스캔 알고리즘이 실행됩니다.
스캔 알고리즘은 Frank Boldewin의 OfficeMalScanner 유틸리티를 기반으로 합니다.
그리고 셸코드의 위치에 대한 정보를 반환합니다:
/scan 옵션은 내보내기 함수에 사용하여 EAT(Export Address Table)가 패치되었는지 또는 함수 프롤로그가 수정되었는지 확인할 수도 있습니다.
SSDT(!ms_ssdt)에 대해서도 유사한 테스트가 가능합니다.
키 제어 블록 읽기
키 노드 읽기.
!reg WinDbg 명령어는 버그로 인해 오랫동안 불편했습니다. 따라서 SwishDbgExt에는 레지스트리 데이터에 최대한 간단하게 접근할 수 있도록 자체 레지스트리 탐색기 함수가 있습니다.
키 값 읽기
의심스러운 NDIS 후크 스캔 및 표시
서비스 목록 표시
서비스 디스크립터 테이블(SDT) 함수 표시.
!ms_ssdt는 시스템 서비스 디스패치 테이블을 표시합니다. 이 명령어는 DKOM(Direct Kernel Object Manipulation)을 통한 의심스러운 루트킷 후크 조사에 매우 유용합니다. nt!NtEnumerateKey 같은 낮은 수준의 루틴이 후킹된 것을 발견하면, 이는 루트킷 감염 가능성을 분석하는 데 도움이 됩니다.
스토어 관리자(ReadyBoost) 관련 정보 표시.
이 명령어는 운영 체제에서 사용 중인 현재 ReadyBoost(USB 3.0 필요) 캐시를 나열하고, 스토어 관리자가 관리하는 메모리 페이지 로그를 표시합니다. 매개변수: /cache
KTIMER 목록 표시.
!ms_timers는 KTIMER 구조를 표시합니다. 이 구조는 다양한 타이머 객체를 나타내고 포함하는 불투명 구조체입니다. 이 명령어는 어떤 드라이버가 어떤 타이머 객체를 생성했는지, 어떤 드라이버가 어떤 루틴을 호출했는지 등을 파악하는 데 도움이 될 수 있습니다.
캐시된 VACB 목록 표시
상세 모드 켜기/끄기
다음은 Alex Ionescu가 발표한 연구를 기반으로 하며, https://github.com/ionescu007/lxss/ 에서 확인할 수 있습니다.
이 기능은 Windows 10+ 운영 체제에서 선택적 기능으로 제공되며, 다음 PowerShell 명령어로 설치할 수 있습니다:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Windows Subsystem for Linux에 대한 자세한 내용은 다음 링크를 참조하세요:
Windows Subsystem for Linux Overview.
Instance 0xFFFFE704EEB8F010
GUID: {E29032FD-35D3-4C53-AB68-6BCEBDA7176F}
State: (1) [STARTED]
Creation Flags: 00000001
GlobalData: 0xFFFFF802ED4138A0
Root Handle: 80000834
Temp Handle: 80000838
Job Handle: 8000083c
Token: 80000818
Event Handle: 800008bc
Map Paths (0): 0xFFFFE704EF437920
VFS Context: 0xFFFFE704EEFC4710
Memory Flags: 0x2
Last PID: 35
Thread Groups: 3
Session 0xFFFFE704EDB79EC0
Instance: 0xFFFFE704EEB8F010
Console inode: 0x0
Foreground PID: -1
Process Group 0xFFFFE704EDB79AE0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EDB79EC0
Thread Group 0xFFFFE704EF4F8000
Binary Path: /init
Thread(s): 1
Owner Process Group: 0xFFFFE704EDB79AE0
Flags: 0x00000000
Main Thread: 0xFFFFE704EF5CC010
Arguments (006 bytes): 0x00007FFFC081D6E0
Process 0xFFFFE704EF2F1D70
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84EF800
NT Process Handle: 0xFFFFFFFF80000F58
VDSO Address: 0x00007FFFC0849000
Stack Address: 0x00007FFFC001E000
Session 0xFFFFE704EF5DB830
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF32D7A0
Foreground PID: 2
Process Group 0xFFFFE704EF5EF970
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF5DB830
Thread Group 0xFFFFE704EF5EE000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704EF5EF970
Flags: 0x0000000C
Main Thread: 0xFFFFE704EF5F8010
Arguments (010 bytes): 0x00007FFFDF34E418
Process 0xFFFFE704EDEF6EC0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84E6800
NT Process Handle: 0xFFFFFFFF80000D9C
VDSO Address: 0x00007FFFDF883000
Stack Address: 0x00007FFFDEB4F000
Session 0xFFFFE704EF0A8ED0
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF06B9C0
Foreground PID: 19
Process Group 0xFFFFE704F059CBC0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF0A8ED0
Thread Group 0xFFFFE704EDE51000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704F059CBC0
Flags: 0x0000000C
Main Thread: 0xFFFFE704EDC78090
Arguments (010 bytes): 0x00007FFFF78CFB78
Process 0xFFFFE704F06389B0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E618D800
NT Process Handle: 0xFFFFFFFF80001650
VDSO Address: 0x00007FFFF7C99000
Stack Address: 0x00007FFFF70D0000
Yara 규칙으로 프로세스 메모리 스캔.
프로세스 메모리 스캔.
!ms_yarascan /pid 0x228 /yarafile /yarafile C:\Rules.yar
모든 프로세스 메모리 스캔.
!for_each_process "r? @$t0 = (nt!_EPROCESS *) @#Process; .process /r /p @$t0; !ms_yarascan /pid @@C++(@$t0->UniqueProcessId) /yarafile C:\\Rules.yar"
MsPEImageFile은 Windows 바이너리(PE)에서 사용하는 기본 공통 정보를 포함하며, 다음 세 가지 클래스로 파생됩니다: