Desbordamiento de búfer: ¿Por qué el registro ESP cambia su valor después de una violación de acceso?

1

Antecedentes: Actualmente estamos intentando explotar una vulnerabilidad de BoF. Después de configurar el entorno, ejecutando un programa C compilado que contiene la función strcpy, desmonté el programa mientras se ejecutaba en el Depurador de inmunidad, para que los datos en la pila del programa durante el momento del bloqueo se puedan analizar y explotar.

Problema: Luego, de acuerdo con los videos de tutoriales y publicaciones de blog investigados, el siguiente paso es encontrar el desplazamiento en la cadena dañada que contiene los datos que se sobrescriben en los valores de los registros ESP y EIP. Esto se hace para que podamos encontrar una instrucción ESP JMP en el archivo ejecutable y sobrescribir la dirección de retorno (valor EIP) utilizando la ubicación de memoria (sin los caracteres incorrectos) de dicha instrucción.

Pregunta: Se hizo todo lo anterior para suponer que el puntero de pila (ESP) apunta al bloque de memoria que contiene la carga útil justo después de la sobrescritura y la violación de acceso. Así que tl dr mi pregunta es: ¿Cómo puede el ESP apuntar a la carga útil si siempre se supone que está apuntando a la parte superior de la pila?

Imágenes, por favor, ayuda a explicar: lo siento por la imagen de tamaño más pequeño. Pero la imagen vino del gran profesor Vivek de la clase SPSE de securitytube.net.

    

pregunta Rennitbaby 28.03.2018 - 08:23
fuente

1 respuesta

1

Como has señalado correctamente, ESP siempre apunta a la parte superior de la pila. También se producen desbordamientos de pila debido a un desbordamiento de un búfer en la pila ( no se debe a un desbordamiento de, digamos un búfer asignado por malloc ) . Así que cuando lo hagas:

char* buf[100];

en realidad estás asignando algo de espacio en la pila para tu búfer. Para ilustrar esto:

Elestado/contenidoinicialdeestebúfer,antesdequesesobrescribaconnuestraentrada,esdesconocidoysepuedeobservarusandoundepurador,como gdb . Por lo tanto, si va a desbordar ese búfer con su entrada, sobrescribirá todo lo que existe en la pila (verifique la imagen anterior para ver en qué dirección se producirá el desbordamiento), por lo que sobrescribirá el EIP para apunta a lo que quieras que apunte. Ahora, cuando una función regresa ( la mayoría de las veces usando RET instrucción ) aparece EIP y también realiza: add esp, 4 . De esta manera, ESP apuntará al último parámetro que se presionó en la pila cuando se llamó a la función, en su ejemplo / imagen este parámetro es Arg 1 ( ya que los argumentos se empujan en la pila en orden inverso ). Así que la imagen que publicaste es correcta y muestra el estado de ESP cuando la función regresa. Entonces, si encuentra una instrucción como jmp esp etc ... puede saltar directamente a la ubicación de su carga útil.

Pero ese no es el único caso explotable. Por lo tanto, es una buena práctica usar un depurador y observar si algún registro apunta a su carga útil, y si busca una instrucción jmp reg . Por ejemplo, en esta publicación , puede ver que tanto ESP y EDI apuntan a la carga útil.

    
respondido por el game0ver 28.03.2018 - 14:42
fuente

Lea otras preguntas en las etiquetas