Me estoy familiarizando con Desbordamientos de búfer (BOF) y estaba replicando un ataque simple descrito por Techorganic . Crean un programa en C simple llamado " classic ", que contiene una vulnerabilidad BOF obvia (cuando lee hasta 400 bytes en un búfer de 80 bytes de STDIN), y luego crea el búfer adecuado para explotarlo, y guárdelo en " in.txt ". A pesar de que sigue su curso sin problemas, una vez que se realizan todos los preparativos, ejecutan el programa con el siguiente comando:
user@pc$ (cat in.txt ; cat) | ./classic
Mi primer pensamiento fue "Holy Moly, ¿qué está pasando allí?", la idea original era simple, ejecuta classic e ingresa el búfer, mi intención era ejecutar como:
user@pc$ ./classic < in.txt
Al igual que cualquier otro mortal haría. Pero para mi sorpresa, su forma funciona, y la mía no.
La conclusión es: ¿qué hace la primera sintaxis y cuál es la diferencia clave que hizo que su solución funcionara y no la mía, a pesar de que son semánticamente iguales (o similares, al parecer)?