Tenemos un programa que es vulnerable a la sobrescritura de un puntero de marco de un byte. La pila está marcada como ejecutable, la máquina Linux ha sido deshabilitada, las cookies de la pila están deshabilitadas y es un poco endian standard x86.
Podemos ejecutar:
buf[256];
for(int i=0; i <=256; i++)
buf[i] = argv[1][i];
Sin embargo, quiero poner mi código de shell en buf
y luego saltar a él. Si usara un desbordamiento de pila normal, podría obtener una confiabilidad de explotación al ir a una biblioteca cargada que tiene la instrucción jmp $esp
codificada en algún lugar, y luego colocar mi código de shell donde están los argumentos de la función, etc. Pero esto no es posible aquí.
Entonces, ¿qué hace si es un proceso remoto (no puede codificar los valores de las direcciones) y necesita explotar la confiabilidad? Lo único que me vino a la mente es la alineación de la pila donde podríamos predecir los bits bajos (¿2 o 3 bits, tal vez?).
Solo necesito saber el byte bajo del puntero del cuadro para poder sobrescribirlo con un control de valor un poco más pequeño eip para apuntar a jmp esp y la instrucción en esp sería como un salto corto -0x80 o algo como que.
He reducido el puntero del cuadro = > ret se ejecuta = > control eip = > punto eip a jmp esp instrucción = > la siguiente instrucción es el salto corto -0xsomevalue ejecución = > la carga útil se ejecuta.
Pensé en otras heurísticas, como escribir el puntero a jmp esp una y otra vez en el búfer para que sea más probable que obtenga el control de eip, pero de esa manera mi método de jmp -0xsomevalue ya no funcionaría.