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

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
snapchange — KVM을 사용한 메모리 스냅샷의 경량 퍼징 | Kitploit
도구/GitHubGitHub/awslabs/snapchange
Dynamic Analysis (Sandboxing)Vulnerability AnalysisDynamic Code Analysis (DAST)DebuggersSecurity VirtualizationFuzzing
GitHubawslabs/snapchange

snapchange

KVM을 사용한 메모리 스냅샷의 경량 퍼징

저장소 보기
469302년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Snapchange

KVM을 사용한 메모리 스냅샷 경량 퍼징

Snapchange는 원시 메모리 덤프와 레지스터 상태를 KVM 가상 머신(VM)에 로드하여 실행할 수 있는 기능을 제공합니다. 실행 중 특정 시점에 이 VM은 KVM이 찾은 더티 페이지 또는 퍼저가 수동으로 더티하게 만든 페이지를 리셋하여 초기 상태로 재설정할 수 있습니다.

빠른 링크:

  • Cookbook은 fuzz, trace, coverage, minimize, project 명령줄 유틸리티의 예제를 제공합니다
  • QEMU로 스냅샷 생성
  • 아키텍처
  • 퍼저 수명 주기

튜토리얼

  • 튜토리얼 1 - 기본 사용법
  • 튜토리얼 2 - ASAN을 사용한 LibTIFF
  • 튜토리얼 3 - 커스텀 뮤테이터를 사용한 FFmpeg
  • 튜토리얼 4 - 시스템 콜 퍼저
  • 튜토리얼 5 - Redqueen

지향점

  • KVM을 사용하여 물리 메모리 및 레지스터 상태 스냅샷 재생
  • 다중 코어에서 병렬 실행
  • 게스트 VM에 인트로스펙션 기능 세트 제공
  • 브레이크포인트 커버리지를 통한 실시간 커버리지 상태
  • 퍼저 구성 요소의 실시간 성능 메트릭
  • 단일 단계 디버그 추적, 테스트 케이스 최소화, 테스트 케이스 커버리지와 같은 퍼징 유틸리티 제공
  • 커스텀 변형 및 생성 전략을 허용하는 입력 추상화

예제:

퍼저 템플릿에서 대상 퍼저 생성

root@kitploit:~
$ cp -r -L fuzzer_template your_new_fuzzer

your_new_fuzzer/create_snapshot.sh를 수정하여 대상의 스냅샷을 캡처하세요

src/fuzzer.rs를 업데이트하여 변형된 데이터를 게스트 VM에 주입하세요

root@kitploit:~
#[derive(Default)]
pub struct TemplateFuzzer;

impl Fuzzer for TemplateFuzzer {
    // The type of Input being fuzzed. Used to know how to generate and mutate useful inputs.
    type Input = Vec<u8>;
    // The starting address of the snapshot
    const START_ADDRESS: u64 = 0x402363;
    // The maximum length of mutated input to generate
    const MAX_INPUT_LENGTH: usize = 100;

    fn set_input(&mut self, input: &Self::Input, fuzzvm: &mut FuzzVm<Self>) -> Result<()> {
        // Write the mutated input into the data buffer in the guest VM
        fuzzvm.write_bytes_dirty(VirtAddr(0x402004), CR3, &input)?;
        Ok(())
    }

    fn reset_breakpoints(&self) -> Option<&[BreakpointLookup]> {
        Some(&[
            // Reset when the VM hits example1!main+0x123
            BreakpointLookup::SymbolOffset("example1!main", 0x123)
        ])
    }
}

16개 코어로 퍼징 시작

root@kitploit:~
$ cargo run -r -- fuzz -c 16

구현

이 README에서 사용하는 용어:

  • 하이퍼바이저(Hypervisor): KVM에서 스냅샷을 실행하는 대상 무관 코드
  • 퍼저(Fuzzer): 대상별 특정 퍼즈 케이스에 대해 게스트를 수정하고 모니터링하는 코드

하이퍼바이저는 요청된 각 코어에 대해 물리 메모리 파일을 매핑하는 것으로 시작합니다. 이렇게 하면 각 코어는 고유한 메모리 사본을 갖게 됩니다. 그런 다음 하이퍼바이저는 KVM 게스트를 생성하고 이 백킹 메모리를 게스트에 제공합니다. 이 게스트의 레지스터 상태는 그런 다음 주어진 레지스터 상태로 초기화되고 게스트 실행이 시작됩니다. 하이퍼바이저는 게스트가 종료(exit)할 때까지 대기합니다. 각 종료는 하이퍼바이저가 처리하며 일부는 대상별 변형, 수정 또는 인트로스펙션을 위해 퍼저에 전달됩니다. 종료 핸들러가 게스트를 리셋해야 한다고 표시하면 하이퍼바이저는 실행 루프를 종료하고 게스트를 원래 스냅샷 상태로 되돌린 다음 실행 루프를 다시 시작합니다.

게스트의 커버리지는 커버리지 브레이크포인트를 사용하여 생성됩니다. 브레이크포인트를 지정할 주소 목록이 포함된 별도의 파일을 하이퍼바이저에 제공할 수 있습니다. 이 주소들 중 하나라도 적중되면 그 주소가 커버리지 데이터베이스에 추가되고 해당 주소의 명령어가 복원됩니다. 이렇게 하면 브레이크포인트가 다시 트리거되지 않습니다.

프로젝트 디렉터리

Snapchange는 구성에 대상별 프로젝트 디렉터리를 활용합니다. 이 디렉터리는 입력 및 출력 파일과 디렉터리가 배치되는 곳입니다. 다음 파일 확장자/디렉터리가 입력으로 사용됩니다:

  • .physmem - 원시 물리 메모리 파일을 포함하는 파일
  • 레지스터 파일 (다음 중 하나)
    • .regs - 레지스터 상태를 포함하는 JSON 레지스터 파일
    • .qemuregs - qemu의 info registers 출력

프로젝트 디렉터리에 있는 파일과 그 용도의 전체 목록은 여기에서 확인할 수 있습니다.

디버깅 추적

디버깅 단일 단계 추적의 전체 예제는 여기에서 확인할 수 있습니다.

root@kitploit:~
ITERATION 604 0x00007ffff7ecb0d5 0x11115000 | libc-2.31.so!__GI___getpid+0x5 (0x7ffff7ecb0d5)              
    syscall 
    [0f, 05]
ITERATION 605 0xffffffff83a00000 0x11115000 | entry_SYSCALL_64+0x0 (0xffffffff83a00000)                    
    swapgs 
    [0f, 01, f8]
ITERATION 606 0xffffffff83a00003 0x11115000 | entry_SYSCALL_64+0x3 (0xffffffff83a00003)                    
    mov qword ptr gs:[0xa014], rsp 
    [None:0x0+0xa014=0xa014]] 
    RSP:0x7fffffffeb78 -> example1!main+0x19 (0x55555555514e)-> 0xff8458b48f44589
    [65, 48, 89, 24, 25, 14, a0, 00, 00]
ITERATION 607 0xffffffff83a0000c 0x11115000 | entry_SYSCALL_64+0xc (0xffffffff83a0000c)                    
    nop 
    [66, 90]
ITERATION 608 0xffffffff83a0000e 0x11115000 | entry_SYSCALL_64+0xe (0xffffffff83a0000e)                    
    mov rsp, cr3 
    RSP:0x7fffffffeb78 -> example1!main+0x19 (0x55555555514e) -> 0xff8458b48f44589
    CR3:0x11115000
    [0f, 20, dc]

스냅샷

VirtualBox 또는 QEMU를 통해 스냅샷을 얻는 방법에 대한 정보는 아래와 같습니다:

  • VirtualBox
  • QEMU

예제에는 처음부터 전체 스냅샷을 만드는 make_example.sh (예제 1 같은) 스크립트가 포함되어 있습니다. 이러한 예제들은 재현 가능한 스냅샷을 위해 다른 대상의 템플릿으로 사용할 수 있습니다.

문서 및 clippy

root@kitploit:~
make all
cargo doc --open

어디서부터 읽어야 할까요?

HACKING은 코드베이스에서 시스템 이해를 시작하기 위한 몇 가지 상위 수준 위치를 제공합니다.

보안

자세한 내용은 CONTRIBUTING을 참조하세요.

라이선스

이 프로젝트는 Apache-2.0 라이선스에 따라 라이선스가 부여됩니다.

도구 다운로드