Tutoriales

Implementación PoC de suplantación de pila de llamadas

paseo silencioso de la luna es una implementación de PoC de suplantación de identidad de pila de llamadas completamente dinámica.

larga historia corta

SilentMoonwalk es una implementación PoC de falsificación de pila de llamadas completamente dinámica, que implementa una técnica que elimina a la persona que llama original de la pila de llamadas, utilizando ROP para desincronizar el desenrollado del flujo de control.

autor

Este PoC es el resultado de una investigación conjunta sobre el tema del engaño de la pila. Los autores del estudio son:

Me gustaría enfatizar que si no hay Waldo-IRC y mentiroso 0que ayuda tanto en las primeras etapas de la PoC como en la investigación detrás de la PoC.

descripción general

Este repositorio demuestra una implementación de PoC para falsificar la pila de llamadas al llamar a API de Windows arbitrarias.

Este intento fue inspirado por este hilo de twittery este hilo de twitterDónde está el profesor namaso Muestra y recomienda el uso de cadenas ROP para extender el método de desenrollado de la pila de modo que el desenrollado no esté sincronizado con el flujo de control real y restaure la pila original después.

Este PoC intenta hacer algo similar a lo anterior y usa una pila asíncrona para ocultar completamente la pila de llamadas original, mientras elimina la biblioteca de imágenes EXE. Al regresar, se llama al dispositivo ROP para restaurar la pila original. En el código, este proceso se repite 10 veces en un bucle, utilizando un marco diferente para cada iteración, para demostrar la estabilidad.

modo de soporte

Actualmente, la herramienta admite 2 modos, uno de los cuales es en realidad un parche de error para los marcos RBP emergentes identificados que no funcionan, funciona cambiando el RSP actual y agregando dos marcos falsos a la pila de llamadas. Dado que se ejecuta con marcos sintéticos, llamo a este modo «SINTÉTICO».

Al seleccionar un cuadro para relajarse sacando el registro RBP de la pila, la herramienta puede seleccionar un cuadro inapropiado y terminar con un corte abrupto de la pila de llamadas, como se muestra a continuación.

Esquema de pila de llamadas sintéticas

Una solución tonta a este problema es crear dos marcos falsos y vincularlos nuevamente a la pila de llamadas cortadas. Esto crea una pila de llamadas aparentemente legítima, incluso sin el marco adecuado para deshacer las llamadas a POP RBP, pero:

  • Pierdes la ventaja de las técnicas asincrónicas.
  • La pila todavía no se expande
  • La pila de llamadas resultante parece legítima a primera vista, pero puede fallar en una inspección rigurosa

El resultado de _synthetic cheating se puede observar en la siguiente imagen:

Figura 1: Windows 10: pila de llamadas aparentemente legal, no cancelable, módulo EXE completamente eliminado (llamada a la función getchar sin argumentos)

NOTA: Este modo de operación está deshabilitado por defecto. Para habilitar este modo, cambie CALLSTACK_TYPE a 1

modo de pila asíncrono

Este patrón es la solución correcta al problema anterior, donde un marco inadecuado simplemente se reemplaza por otro marco adecuado.

Figura 2: Windows 10: pila de llamadas legítima e irreparable, módulo EXE completamente eliminado (llamando a la función de 4 parámetros MessageBoxA)

utilidades

En el repositorio también puede encontrar una pequeña herramienta para inspeccionar funciones de tiempo de ejecución, que puede ser útil para analizar entradas de funciones de tiempo de ejecución.

UnwindInspector.exe -h

 Unwind Inspector v0.100000

 Mandatory args:
   -m : Target DLL
   -f : Target Function
   -a : Target Function Address

Salida de ejemplo:

UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] Using function address 0x7ffaae12182c

  Runtime Function (0x000000000000182C, 0x00000000000019ED)
  Unwind Info Address: 0x000000000026AA88
    Version: 0
    Ver + Flags: 00000000
    SizeOfProlog: 0x1f
    CountOfCodes: 0xc
    FrameRegister: 0x0
    FrameOffset: 0x0
    UnwindCodes:
    [00h] Frame: 0x741f - 0x04  - UWOP_SAVE_NONVOL     (RDI, 0x001f)
    [01h] Frame: 0x0015 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0015)
    [02h] Frame: 0x641f - 0x04  - UWOP_SAVE_NONVOL     (RSI, 0x001f)
    [03h] Frame: 0x0014 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0014)
    [04h] Frame: 0x341f - 0x04  - UWOP_SAVE_NONVOL     (RBX, 0x001f)
    [05h] Frame: 0x0012 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0012)
    [06h] Frame: 0xb21f - 0x02  - UWOP_ALLOC_SMALL     (R11, 0x001f)
    [07h] Frame: 0xf018 - 0x00  - UWOP_PUSH_NONVOL     (R15, 0x0018)
    [08h] Frame: 0xe016 - 0x00  - UWOP_PUSH_NONVOL     (R14, 0x0016)
    [09h] Frame: 0xd014 - 0x00  - UWOP_PUSH_NONVOL     (R13, 0x0014)
    [0ah] Frame: 0xc012 - 0x00  - UWOP_PUSH_NONVOL     (R12, 0x0012)
    [0bh] Frame: 0x5010 - 0x00  - UWOP_PUSH_NONVOL     (RBP, 0x0010)

Hospedarse

Para construir un POC y observar un comportamiento similar al de la imagen, asegúrese de:

  • Deshabilitar GS (/GS-)
  • Deshabilitar optimización de código (/Od)
  • Deshabilitar la optimización de todo el programa (eliminar /GL)
  • Deshabilitar las preferencias de tamaño y velocidad (quitar /Os, /Ot)
  • permitir Intrínseco si no está habilitado (/Oi)

Trabajo previo

Vale la pena mencionar el trabajo previo realizado sobre este tema que sirvió de base para este trabajo.

  • suplantación de dirección de remitente: Tecnología e ideas originales de Namaszo. Todos los demás PoC que conozco se basan en esta base.
  • pasador: Este increíble trabajo de Arash es la primera extensión adecuada del PoC de falsificación de dirección de retorno de Namaszo.
  • Cuervo vulcano: Un tramposo de la pila de llamadas que engaña creando sintéticamente una pila de subprocesos que refleja la pila de llamadas real de otro.
  • desenrollador: Una muy buena implementación de Rust PoC de un falsificador de pila de llamadas que reemplaza marcos en la pila de llamadas al analizar la información del código de desenrollado.

crédito

  • gritos waldo-irc y mentiroso 0, que colaboró ​​conmigo en esta investigación. Les debo todo.
  • La idea detrás de esto es todo gracias a namaso, personalmente creo que es un genio. También verificó este PoC antes de publicarlo, muchas gracias a él.

notas

  • [SYNTHETIC STACK ONLY]: Como una limitación de la forma en que posiciono el widget, el número máximo de parámetros es actualmente 8 (modificar y agregar más parámetros es trivial, pero soy demasiado perezoso para molestarme).
  • [DSESYNC STACK ONLY]: Como limitación de la forma en que configuro el programa de trucos, el número máximo de parámetros admitidos actualmente es 4.
  • Hay pruebas muy limitadas para esto. Puede haber excepciones que actualmente desconozco.
  • No se probó el desenrollado que implicaba registros de 128 bits.
  • Las funciones de llamada que utilizan registros de 128 bits no se admiten oficialmente.

por favor considera atención y apoyo Siempre estamos actualizados

LEER  7 ejemplos interesantes de comandos de 'ordenación' de Linux

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba