¿Por qué los punteros de grasa son una buena protección?

16

Estoy aprendiendo sobre los desbordamientos de búfer, y tengo la idea del indicador de grasa, pero lo que no entiendo es ¿de qué manera son una buena protección? Si pudiera modificar el puntero para que apunte a otra dirección, ¿no podría modificar la base obj base y la sección final obj del puntero grueso para que el puntero todavía parezca válido?

    
pregunta Pixel 03.04.2017 - 16:54
fuente

2 respuestas

38

Los desbordamientos de búfer no tienen que ver con configurar el puntero para que apunte a otra dirección arbitraria.

Un desbordamiento de búfer ocurre cuando una entrada hace que su programa realice una operación aparentemente correcta (por ejemplo, " increment() : mueve el puntero hacia adelante 256 bytes" ) demasiadas veces, de modo que el puntero se mueve fuera de la estructura / matriz de datos deseada, y pasa a otro objeto.

Un "puntero grueso" contiene información sobre la estructura de datos / tamaño de la matriz.  Esto significa que increment() puede tener verificaciones de seguridad en su código, para asegurarse de que el puntero esté dentro de los límites apropiados. Aún necesita verificaciones de seguridad en algún lugar de su código, pero esto le permite centralizarlo.

    
respondido por el cloudfeet 03.04.2017 - 17:52
fuente
3

Parece que piensas en el tipo de bufferoverflow que usualmente ocurre en el montón. Por lo general, los fragmentos de memoria asignados se almacenan como elementos, con metadatos, que incluyen punteros al elemento siguiente y anterior, en listas doblemente vinculadas. En teoría, al desbordar el búfer, podría sobrescribir los metadatos de la siguiente porción de memoria y, si se libera esa, podría sobrescribir el puntero de una función, lo que lleva a la ejecución de código arbitrario. Para obtener más información sobre la explotación, visite este sitio web

Los punteros gordos podrían protegerlo de esto: simplemente revisando cada operación en el arreglo, como leer o escribir en la ubicación, internamente una verificación de límites, si el desplazamiento / índice dado es válido, se realizará y solo si Si se pasa la verificación de límites se ejecutará la operación. (Como ya se dijo @cloudfeet). Esto significa que no podrá escribir después de los límites de su memoria y, por lo tanto, no podrá sobrescribir cosas como los metadatos del siguiente fragmento de memoria o un puntero en la pila.

    
respondido por el Sebastian Walla 03.04.2017 - 19:29
fuente

Lea otras preguntas en las etiquetas