Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Win32_Offensive_Cheatsheet — Win32 및 커널 남용 기법 (펜테스터용) | Kitploit
도구/GitHubGitHub/matthieu-hackwitharts/win32_offensive_cheatsheet
Persistence MechanismsExploitationIDS/IPS EvasionReverse EngineeringPost-ExploitationPenetration TestingBinary AnalysisLearning & EducationRed Teaming

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
Curated Resources
Payload Development
GitHubmatthieu-hackwitharts/win32_offensive_cheatsheet

Win32_Offensive_Cheatsheet

Win32 및 커널 남용 기법 (펜테스터용)

저장소 보기
981136173년 전Kitploit 검토 완료
공유

Win32 공격용 치트시트

모의 침투 테스터와 레드 팀원을 위한 Win32 및 커널 악용 기술, @UVision과 @RistBS 제작

개발 모드 활성화, 어떤 도움이라도 환영합니다 :)

  • Windows 바이너리 문서
    • PE 구조
    • PE 헤더
    • PE 파싱
    • 내보내기 주소 테이블 (EAT)
    • 함수 주소 확인
    • 가져오기 주소 테이블 (IAT)
      • IAT 파싱
    • 가져오기 조회 테이블 (ILT)
    • SeDebug 권한 활성화
  • 바이너리 실행
    • 클래식 셸코드 실행
    • DLL 실행
    • RAW 파일을 PE로
  • 코드 인젝션 기술
    • CreateRemoteThread 인젝션
    • 프로세스 할로잉
    • APC 큐 기술
    • Early Bird
    • 리플렉티브 DLL 인젝션
    • DLL 인젝션
    • 프로세스 도펠갱잉
    • 파이버
    • CreateThreadPoolWait
    • 스레드 하이재킹
    • MapView 코드 인젝션
    • 모듈 스톰핑
    • 함수 스톰핑
  • 후킹 기술
    • 인라인 후킹
    • IAT 후킹
  • RE 우회 기술
    • 호출 및 문자열 난독화
    • 수동 함수 확인
    • Win32 API 해싱
  • EDR/엔드포인트 우회
    • 직접 syscall
    • 고수준 언어
    • 인라인 후킹 패치
    • 후킹 감지
    • ETW 패치
    • 샌드박스 우회
    • 디버깅 우회
    • VirtualProtect 기술
    • 새 복사본 언훅
    • 헬스 게이트
    • 헤븐스 게이트
    • PPID 스푸핑
    • 프로세스 계측 콜백
    • 힙 암호화
    • 슬립 난독화
  • 드라이버 프로그래밍 기초
    • 일반 개념
    • 시스템 서비스 디스패치 테이블 (SSDT)
    • 드라이버 진입점
    • 입력 출력)
    • 드라이버와 통신
    • 드라이버 서명 (Microsoft)
    • 사용자 지정 콜백 (ObRegisterCallbacks)
  • 공격용 드라이버 프로그래밍
    • 커널 콜백 패치
    • 보호된 프로세스 패치
  • OPSEC 향상을 위한 Win32 API 사용
    • 지속성
      • 예약 작업
    • 명령줄 스푸핑
  • 기타 자료
    • x64 호출 규약
    • 간접 실행
      • SetProcessValidCallTargets를 사용한 CFG 우회

  • 악성코드/정교한 기술
    • Emotet 사례: WMI를 사용한 PPID 스푸핑
    • Zeus 악성코드 숨김 파일 기술
    • SpyEye 키로거 후킹 기술
    • 가장 터무니없는 악성코드 중지 (WannaCry)

Windows 바이너리 문서

유용한 도구 및 웹사이트/도서/치트시트

  • 🔹 https://github.com/RistBS/Awesome-RedTeam-Cheatsheet/ (매우 좋은 치트시트)
  • 🔹 https://www.ired.team/ (훌륭한 코드 인젝션 노트가 있는 멋진 레드 팀 치트시트)
  • 🔹 https://undocumented.ntinternals.net/ (문서화되지 않은 NT 함수)
  • 🔹 https://docs.microsoft.com/en-us/windows/win32/api/ (Microsoft 공식 문서)
  • 🔹 Windows Kernel Programming - Pavel Yosifovich
  • 🔹 https://research.checkpoint.com/ (회피, 안티디버그 등에 관한 매우 흥미로운 문서)
  • 🔹 https://www.vx-underground.org/ (악성코드 개발과 리버스에 관한 훌륭한 콘텐츠)

PE 구조

PE 헤더

  • DOS_HEADER : PE의 첫 번째 헤더로, MS DOS 메시지("이 프로그램은 DOS 모드에서 실행할 수 없습니다...."), MZ 헤더(PE 식별용 매직 바이트) 및 일부 스텁 콘텐츠를 포함합니다.
  • IMAGE_NT_HEADER : PE 파일 서명, 파일 헤더 및 선택 헤더를 포함합니다.
  • SECTION_TABLE : 섹션 헤더를 포함합니다.
  • SECTIONS : 헤더는 아니지만 알아두면 유용합니다. PE의 섹션들입니다.

자세한 내용 : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266

PE 파싱

IAT 및 ILT 절대 주소를 검색하는 간단한 PE 파싱:

  • 기본 주소 얻기 : GetModuleHandleA(NULL);
  • PIMAGE_DOS_HEADER = 기본 주소, DOS 헤더
  • PIMAGE_NT_HEADER = BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew (RVA NT_HEADER)
  • IMAGE_DATA_DIRECTORY = PIMAGE_NT_HEADER의 OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
  • IMAGE_IMPORT_DIRECTORY = IMAGE_DATA_DIRECTORY.VirtualAddress (IMAGE_IMPORT_DIRECTORY의 RVA)
  • IMAGE_IMPORT_DESCRIPTOR = BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress (IMAGE_IMPORT_DESCRIPTOR의 RVA)
  • IAT 절대 주소 : IMAGE_IMPORT_DESCRIPTOR.FirstThunk (RVA IAT) + BaseAddress
  • ILT 절대 주소 : IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk (RVA ILT) + BaseAddress

내보내기 주소 테이블 (EAT)

EAT는 PE에서 내보낸 모든 함수를 확인하고 DLL도 확인합니다. IMAGE_EXPORT_DIRECTORY 구조에 정의되어 있습니다:```c
typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; // name of DLL DWORD Base; // first ordinal number DWORD NumberOfFunctions; // number of entries in EAT DWORD NumberOfNames; // number of entries in (1) (2) DWORD AddressOfFunctions; // RVA EAT and contains also RVA of exported functions DWORD AddressOfNames; // Pointer array contains address of function names DWORD AddressOfNameOrdinals; // Pointer array contains address of ordinal number of functions (index in AddressOfFunctions) } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Please note that the EAT is defined in a DLL, not in a "real" PE (a PE will use the EAT of a loaded dll to resolve pointers to functions it want to use).

### 함수 주소 확인

**함수 주소 사용**

무엇을 기다리고 있나요? 이 함수를 찾으세요!

**서수 번호 사용**

서수 번호는 `AddressOfFunctions` 배열에서 해당 함수 주소를 가리키는 **인덱스 위치**입니다. 아래와 같이 함수의 올바른 주소를 **검색하는 데** 사용할 수 있습니다.

주어진 서수 번호 3으로 해당 주소(Addr4)를 찾아보겠습니다.

- **AddressOfFunctions** : *Addr1 Addr2 Addr3 Addr4 .... AddrN*
- **AdressOfNameOrdinals** : *2 5 7 3 ... N*

우리가 찾는 주소는 (0부터 시작하여) 3번째 위치에 있으며, 서수 번호는 이 주소의 **인덱스**에 해당합니다.

**함수 이름 사용**

AddressOfNames 배열의 N번째 요소는 AddressOfNameOrdinals 배열의 N번째 요소에 대응합니다. 주어진 이름을 사용하여 해당 서수 번호를 검색한 다음, 이 번호를 사용해 함수 주소를 찾을 수 있습니다.

## Import Address Table (IAT)

- PE 로더는 어떤 주소가 어떤 함수에 해당하는지 알지 못합니다. IAT를 통해 문제를 해결해 봅시다.
- IMAGE_IMPORT_DIRECTORY 구조체에 정의됩니다:```c
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    DWORD	Characteristics; 
    DWORD	OriginalFirstThunk;	// RVA to ILT
    DWORD	TimeDateStamp;	
    DWORD	ForwarderChain;
    DWORD	Name; 		        // RVA of imported DLL name
    DWORD	FirstThunk;             // RVA to IAT
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;

요약하자면, IAT는 PE가 로드된 DLL(ntdll, kernel32...)에서 가져온 여러 함수에 대한 포인터를 포함하는 테이블입니다.

IAT 파싱

  1. IAT의 RVA를 얻습니다.
  2. IMPORT_DESCRIPTOR 구조체를 파싱하세요 : Name 멤버는 현재 DLL 이름의 RVA입니다.
  3. 실제 DLL 이름을 얻으려면 : ILT (originalFirstThunk+BaseAddress)에서 찾으세요.
  4. 현재 DLL의 내보내기 함수를 얻으려면 : PIMAGE_IMPORT_BY_NAME function_name->Name = ImageBase+AdressOfData

자세한 코드 예제는 여기 : https://github.com/matthieu-hackwitharts/Win32_Offensive_Cheatsheet/blob/main/miscellaneous/iat_parser.cpp

Import 룩업 테이블

PE가 가져온 모든 DLL에는 자체 ILT가 있습니다.``` Absolute address of ILT = BaseAddress + OriginalFirstThunk (IAT)

가져온 DLL에 있는 모든 함수 이름을 포함합니다.

<br>


## SeDebug 권한 활성화

**SeDebug** 권한은 Windows 권한 목록에서 가장 "탐나는" 권한입니다. 이 권한을 사용하면 승인된 모든 프로세스를 "디버그"할 수 있으며, 이는 ```PROCESS_ALL_ACCESS``` 권한으로 핸들을 여는 것과 같은 여러 공격적 작업으로 해석될 수 있습니다.

사용자 모드에서 이 권한을 활성화하려면 다음과 같은 함수를 사용해야 합니다:```cpp
void EnableDebugPriv()
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
도구 다운로드