>> ALTAVOZ 1: Vamos a escribir un programa que para crear una cadena del usuario sin
utilizando el CS50 Biblioteca de funcionar GetString.
Para ello, vamos a seguir adelante y utilizar scanf, la función que el GetString
función utiliza realmente debajo de la capucha.
Pero yo voy a hacer esto deliberadamente de manera buggy.
Yo voy a hacer de una manera que creo sería correcto, pero resulta que
mi suposición de que va a ser muy, muy deficiente.
Y, de hecho, muy peligroso.
Debido a errores como el que yo estoy a punto de hacer que puede ser explotada por los adversarios
de tal manera que su máquina o su programa puede asumir el control potencialmente.
>> Vamos a comenzar de la siguiente manera.
Primero vamos a declarar nuestra cadena, de otro modo conocido ahora como una estrella de char,
y llamar a que s.
Permite siguiente solicita al usuario una cadena, al igual que con "string por favor." Y
ahora vamos a obtener la cadena del usuario usando scanf, entre comillas, "% s". En
Es decir, vamos a informar a scanf que no, de hecho, esperan conseguir una cadena
desde el usuario.
>> Pero ahora tenemos que decirle a scanf una cosa más -
dónde colocar la cadena que el usuario proporciona.
Bueno, yo voy a empezar simplemente con comas s, especificando que me gustaría
scanf para poner la cadena allí.
Estoy al lado va a imprimir algo como "gracias printf para el% s
barra invertida n coma. "Y como siempre, estoy va a pasar en la cadena, s.
Ahora vamos a guardar, compilar y ejecutar este programa, y ​​ver si no podemos inducir
el problema que predijo.
>> Hacer scanf-1.
./scanf-1.
Cadena por favor.
Vamos a proporcionar algo como, "hola." "Gracias por la nula". Hmm, eso no es
lo que yo esperaba.
Entonces, ¿qué está pasando aquí?
>> Bueno, resulta que ya declaramos s como una estrella de caracteres pero no lo hicimos
efectivamente almacenada en s la dirección de un pedazo real de memoria, scanf no lo hizo
tener en cualquier lugar de poner la cadena que el usuario escribió pulg
De hecho, si el usuario tuviera que ahora escriba una cadena mucho más larga que "hola"
por ejemplo, varias líneas de texto o varios párrafos de texto, es bastante
posible que podamos inducir una llamado fallo de segmentación.
>> Debido a scanf no va a saber que En realidad no he puesto una dirección
interior de s.
Más bien, se va a ver algún valor s, en un patrón de bits que puede
muy bien ser un valor basura, no sólo por casualidad.
Y scanf todavía va a tratar de escribir la cadena de usuario a esa dirección,
incluso si es un valor de basura, la cual de hecho, podría inducir un choque.
>> Entonces, ¿cómo vamos a arreglar esto?