Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
snapchange — Fuzzing ligero de una instantánea de memoria mediante KVM | Kitploit
Herramientas/GitHubGitHub/awslabs/snapchange
Análisis Dinámico (Sandboxing)Análisis de VulnerabilidadesAnálisis Dinámico de Código (DAST)DepuradoresVirtualización de SeguridadFuzzing
GitHubawslabs/snapchange

snapchange

Fuzzing ligero de una instantánea de memoria mediante KVM

Ver Repositorio
46930hace 2 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Snapchange

Fuzzing ligero de una instantánea de memoria usando KVM

Snapchange proporciona la capacidad de cargar un volcado de memoria en bruto y el estado de los registros en una máquina virtual (VM) de KVM para su ejecución. En un punto de la ejecución, esta VM puede restablecerse a su estado inicial restableciendo las páginas sucias encontradas por KVM o las páginas ensuciadas manualmente por un fuzzer.

Enlaces rápidos:

  • Cookbook proporciona ejemplos de utilidades de línea de comandos fuzz, trace, coverage, minimize y project.
  • Tomar una instantánea con QEMU
  • Arquitectura
  • Ciclo de vida del fuzzer

Tutoriales

  • Tutorial 1 - Uso básico
  • Tutorial 2 - LibTIFF con ASAN
  • Tutorial 3 - FFmpeg con mutador personalizado
  • Tutorial 4 - Fuzzer de syscalls
  • Tutorial 5 - Redqueen

Aspiraciones

  • Reproducir una instantánea del estado de la memoria física y los registros usando KVM
  • Ejecución paralela en múltiples núcleos
  • Proporcionar un conjunto de funciones de introspección a la VM invitada
  • Estado de cobertura en tiempo real mediante breakpoints de cobertura
  • Métricas de rendimiento en tiempo real de los componentes del fuzzer
  • Proporcionar utilidades de fuzzing como traza de depuración de un solo paso, minimización de casos de prueba y cobertura de casos de prueba
  • Abstracción de entrada para permitir estrategias personalizadas de mutación y generación

Ejemplo:

Crear un fuzzer objetivo a partir de la plantilla de fuzzer

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

Modificar your_new_fuzzer/create_snapshot.sh para tomar una instantánea de tu objetivo

Actualizar src/fuzzer.rs para inyectar datos mutados en la VM invitada

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)
        ])
    }
}

Iniciar el fuzzing con 16 núcleos

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

Implementación

Uso rápido de términos para este README:

  • Hypervisor: El código agnóstico al objetivo que ejecuta la instantánea en KVM
  • Fuzzer: El código específico del objetivo utilizado para modificar y monitorizar el invitado para un caso de fuzzing específico del objetivo

El hypervisor comienza mapeando el archivo de memoria física para cada núcleo solicitado. De esta manera, cada núcleo tiene su propia copia única de memoria. Luego, el hypervisor crea el invitado de KVM y le proporciona a este invitado la memoria de respaldo. El estado de los registros de este invitado se inicializa con el estado de registros dado y se lanza la ejecución del invitado. El hypervisor espera hasta que el invitado sale. Cada salida es manejada por el hypervisor y algunas se pasan al fuzzer para mutación, modificación o introspección específica del objetivo. Si el manejador de la salida indica que el invitado debe restablecerse, el hypervisor sale del bucle de ejecución, restablece el invitado al estado original de la instantánea y reinicia el bucle de ejecución nuevamente.

La cobertura del invitado se genera mediante breakpoints de cobertura. Se puede proporcionar al hypervisor un archivo separado con una lista de direcciones para breakpoints. Si se alcanza alguna de estas direcciones, la dirección se añadirá a la base de datos de cobertura y se restaurará la instrucción de esa dirección. De esta manera, el breakpoint no se volverá a activar.

Directorio del proyecto

Snapchange aprovecha directorios de proyecto específicos del objetivo para la configuración. Este directorio es donde se colocan los archivos y directorios de entrada y salida. Las siguientes extensiones/directorios de archivo se utilizan como entradas:

  • .physmem - El archivo que contiene el archivo de memoria física sin procesar
  • Archivo de registros (uno de los siguientes)
    • .regs - Archivo de registros JSON que contiene el estado de los registros
    • .qemuregs - Salida de info registers de qemu

La lista completa de archivos y sus usos en el directorio del proyecto se puede encontrar aquí.

Traza de depuración

Un ejemplo completo de la traza de depuración de un solo paso se puede encontrar aquí.

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]

Instantáneas

A continuación se ofrece información sobre cómo obtener una instantánea mediante VirtualBox o QEMU:

  • VirtualBox
  • QEMU

Los ejemplos incluyen un script make_example.sh (como el ejemplo 1) que realiza una instantánea completa desde cero. Estos ejemplos se pueden utilizar como plantilla para otros objetivos con el fin de obtener instantáneas reproducibles.

Documentación y clippy

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

¿Dónde empezar a leer?

El archivo HACKING proporciona algunas ubicaciones de alto nivel en la base de código para comenzar a entender el sistema.

Seguridad

Consulta CONTRIBUTING para obtener más información.

Licencia

Este proyecto está licenciado bajo la Licencia Apache-2.0.

Descargar herramienta