En el exploit de desbordamiento de búfer, 0x20 (carácter de espacio) no aparece en la memoria y se reemplaza por null

2

La situación: Actualmente estoy trabajando en shellcode (modifiqué el código de ensamblaje de Project Shellcode) que ejecuta "cmd.exe / c calc.exe". El shellcode en sí funciona bien. Sin embargo, cuando uso el código de shell durante una explotación de desbordamiento de búfer, el byte 0x20 (carácter de espacio) en la cadena se reemplaza con un byte nulo. No puedo encontrar una buena explicación de por qué sucede esto. El siguiente es el código de ensamblaje:

; Llama a calc.exe. Modificado de enlace [SECCIÓN. Texto]

BITS 32

inicio global

_start:

jmp short GetCommand

CommandReturn:    pop ebx; ebx ahora apunta a la cadena    xor eax, eax; eax claro    empuje eax; empuje nulo en la pila    presione ebx; presione la cadena de comando en la pila    mov ebx, 0x7c86114d; coloque la dirección winExec en ebx    llame a ebx; llame a WinExec ({cmd}, 0)

xor eax, eax; elimina el valor de retorno de WinExec    presione eax; presione nulo en la pila como valor de parámetro    mov ebx, 0x7c81caa2; coloca la dirección ExitProcess en ebx
   llame a ebx; llame a ExitProcess (0)

GetCommand:    llamar a CommandReturn    db 'cmd.exe / c calc', 0; el carácter de espacio se reemplaza por nulo.

Lo que sé hasta ahora:

  1. Sé que no tengo un problema de espacio, porque he colocado una cadena más larga sin espacios y aún se muestra en la memoria.
  2. Sé que el código shell funciona porque lo he probado colocándolo directamente en un búfer y llamando al búfer como una llamada de función en C.

Lo siguiente es lo que veo en la ventana superior izquierda de Immunity:

  1. Las direcciones 0012FFB3-0012FFCB es el código de shell
  2. Antes de eso es mi diapositiva NOP.
  3. Comenzando en la dirección 0012FFD0 se supone que es "cmd.exe / c calc.exe", pero es solo "cmd.exe", veo en la dirección 0012FFEB que hay un nulo en lugar de 0x20 al final.
pregunta Sandra E 20.10.2014 - 18:58
fuente

1 respuesta

1

Oh, yo ... sé por qué sucede esto: se debe a que en mi aplicación de prueba vulnerable, estoy usando fscanf para leer la cadena de entrada maliciosa de un archivo, y este espacio en la cadena hexadecimal se cortará fscanf.

Según ( enlace ): "la función leerá e ignorará cualquier carácter de espacio en blanco que se encuentre antes de la próxima caracteres que no sean espacios en blanco (los espacios en blanco incluyen espacios, caracteres de nueva línea y tabulación, consulte espacio) "

Nota: solo estoy leyendo el flujo una vez en la aplicación de prueba vulnerable.

    
respondido por el Sandra E 25.10.2014 - 16:58
fuente

Lea otras preguntas en las etiquetas