Como han dicho otros, la lectura / impresión es su área de mayor riesgo para los desbordamientos de búfer.
Sin embargo, es posible que puedas usar la biblioteca bignum para rociar el montón. Por ejemplo, MPIR / GMP usa una estructura bignum que se parece un poco a esto:
typedef struct
{
off_t count;
mpn_limb_t* limbs;
} mpz+t;
Donde off_t
describe el número de miembros y su signo describe el signo del número general. Luego, cada mpn_limb_t
se escribe a un tamaño apropiado para su plataforma.
Claramente, esto no se puede asignar y no se puede asignar a la pila, así que básicamente estás escribiendo todos estos números ( mpn_limb_t
) en el montón, lo que te permite heap spray que no explotará directamente la biblioteca, pero puede facilitar otro exploit.
El proceso de desinfección para esto es no confiar en una serialización binaria de su número, ya que cada bit se usa para almacenar el número en forma bruta y colocarlo en la memoria que le brinda el rango completo de códigos de operación. Realmente necesitas leer el número en un formato legible por humanos, que aunque es menos eficiente, hace que sea un poco más difícil producir shellcode útil (a menos que puedas escribir algo con los opcodes representados por el ascii de 0-9, lo cual dudo ).
La adición, la multiplicación, etc. "no pueden" desbordarse, en el sentido de que gmp / mpir al menos no asignará suficiente memoria para el objetivo mpz_t
y se detendrá allí.
Debe haber (definitivamente hay una función de impresión) una función para leer números enteros de la representación de texto. Me aseguraría de que use esto y use la función de impresión correspondiente para la salida. Entonces podrá manejar los números hasta los límites impuestos por su memoria mientras no escriba sin sentido arbitrario en la memoria. Puede consultar la documentación de estas funciones para verificar su comportamiento en caracteres no enteros / decimales.
Las excepciones de punto flotante no deben ser causadas por ninguna biblioteca flotante mp, ya que el tamaño / representación interna del flotador en cuestión no puede ser manejado por el procesador de todos modos. Si observa los algoritmos (consulte algoritmos para APFPA utilizados en este tipo de código, verás que utilizan operaciones de punto flotante de precisión normal. Cualquier biblioteca decente debería asegurarse de que no causen una excepción de punto flotante cuando trabajen en "miembros".