command - how - mac shortcuts
“/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”;? (1)
Encontré esta línea en el if.c de unix versión 6.
ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
¿Por qué hay tantos x? ¿Y por qué pondrías esto?
El código del que hablas se ve así:
ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
while(c=nargv[0][i]) {
ncom[9+i++] = c;
}
ncom[9+i] = ''/0'';
Todos esos x''s actúan como un búfer, son anulados por el siguiente bucle. Por lo tanto, el código agrega efectivamente "/ usr / bin /" al comando en nargv[0]
.
Con un poco más de contexto, el código está haciendo esto:
execv(nargv[0], nargv, np);
execv(ncom+4, nargv, np);
execv(ncom, nargv, np);
Si el comando dado en nargv[0]
es "foo"
, primero intentará ejecutar "foo"
luego "/bin/foo"
y finalmente "/usr/bin/foo"
.
Tenga en cuenta que lo anterior es un buen ejemplo de cómo no hacer tales cosas:
Si la cadena en nargv[0]
es más larga que la cantidad de x, el código continuará felizmente copiando datos. Esto anulará otras partes de la pila. El resultado es un buen ejemplo de un desbordamiento de búfer. (Usted asigna un búfer de algún tamaño y escribe más datos que los asignados).
Este ejemplo demostrará el problema:
#include <stdio.h>
int main(){
char s[]="abcde";
int i;
for(i=0;i<100;i++){
printf("position %2d contains value %3d/n",i,s[i]);
s[i]=0;
}
puts(s);
return 0;
}
Si lo ejecutas, lo más probable es que salga esto:
position 0 contains value 97
position 1 contains value 98
position 2 contains value 99
position 3 contains value 100
position 4 contains value 101
position 5 contains value 0
position 6 contains value 0
position 7 contains value 0
position 8 contains value 0
position 9 contains value 0
position 10 contains value 0
position 11 contains value 0
position 12 contains value 12
position 1 contains value 0
position 2 contains value 0
position 3 contains value 0
position 4 contains value 0
position 5 contains value 0
position 6 contains value 0
position 7 contains value 0
[...]
Rellenará la cadena (que contiene los valores ASCII de 97 a 101) con ceros y continuará escribiendo la memoria donde encontrará la posición de la variable i
, también la pondrá a cero. Ahora i
es cero y, por lo tanto, el bucle comienza de nuevo, anulando la cadena ya anulada una y otra vez.
No solo se pueden anular las variables locales, sino que también se puede anular la dirección de retorno de una función, lo que resulta en una "falla de segmentación" o en la ejecución de un código arbitrario, que a menudo utiliza el malware.