Pregunta:
¿Cómo son los indicadores de grasa una buena protección?
Pixel
2017-04-03 19:54:31 UTC
view on stackexchange narkive permalink

Estoy aprendiendo acerca de los desbordamientos de búfer y me hago la idea del puntero gordo, pero lo que no entiendo es cómo son una buena protección. Si pudiera modificar el puntero para que apunte a otra dirección, ¿no podría modificar la base obj y la sección final del obj del puntero gordo para que el puntero todavía parezca válido?

[¿Qué es un puntero gordo?(respuesta)] (https://www.quora.com/What-is-a-fat-pointer#answer_11394193)
Dos respuestas:
cloudfeet
2017-04-03 20:52:44 UTC
view on stackexchange narkive permalink

Los desbordamientos de búfer no se tratan de 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 mueva fuera de la estructura / matriz de datos deseada y dentro de otro objeto.

Un "puntero gordo" contiene información sobre la estructura de datos / tamaño de la matriz. Esto significa que increment () puede tener controles 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.

Gracias me olvidé del desbordamiento de búfer básico y es cierto que en este caso ayudará. Sin embargo, ¿no podría haber un caso en el que en la memoria tenga un búfer seguido de un puntero y, al desbordar el búfer, podría establecer el puntero en una dirección elegida?En este caso, ¿ayudaría el puntero gordo?
@Pixel Si está haciendo esto, probablemente lo esté [haciendo mal] (// wiki.c2.com/?PrematureOptimization).Si no está trabajando con el tipo de sistema que [Mel, el programador más real de todos] (https://groups.google.com/forum/?_escaped_fragment_=topic/net.jokes/k2JVKQzJSpY#!topic/net.jokes / k2JVKQzJSpY) usado (pista: no lo estás), no deberías estar haciendo esto.
@Pixel No existe una estructura de datos mágica que pueda sobrevivir si se sobrescriben sus valores, ¡el punto es no llegar nunca a ese punto!En su lugar, usaría un puntero grueso (u otras formas de protección contra desbordamiento) en el código que estaba tratando con el búfer anterior, por lo que la memoria que lo sigue es segura.Tratar de crear estructuras de datos para protegerse contra la sobreescritura por desbordamientos es como vendarse el pie de forma preventiva ... porque está a punto de dispararse en él.:pags
@Pixel, el "puntero gordo" no es el que viene después del búfer: es el que usa el código para _llenar_ el búfer.El puntero gordo es lo que evita que el código se llene más allá del final del búfer y sobrescriba el puntero _otro_.
Sebastian Walla
2017-04-03 22:29:32 UTC
view on stackexchange narkive permalink

Parece que piensa en el tipo de desbordamiento de búfer que suele ocurrir 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 enlazadas. En teoría, al desbordar el búfer, podría sobrescribir los metadatos del siguiente fragmento de memoria y, si se libera, podría sobrescribir un puntero de función, lo que provocaría la ejecución de código arbitrario. Para obtener más información sobre la explotación, consulte este sitio web

Los punteros gordos podrían protegerlo de esto: simplemente verificando cada operación en la matriz, como leer o escribir en la ubicación, internamente un La verificación de límites, si el desplazamiento / índice dado es válido, se realizará y solo si se pasa la verificación de límites, se ejecutará la operación. (Como ya dijo @cloudfeet). Esto significa que no podrá escribir más allá 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.



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...