martes, enero 17, 2006
Posts Anteriores
El asistente usaba este codigo
para su tarea:
...
int hora_de_comer;
int sueldosProg[3];
int empLimpieza= dispersion("nuevoEmple");
int i;
for(i=0;i<=3;i++) sueldosProg[i]+=300;
// $300 la hora
tabla[empLimpieza].sueldo+= 40;
// $40 la hora
...
...
int hora_de_comer;
int empLimpieza= dispersion("nuevoEmple");
int sueldosProg[3];
...
Como era viernes, a las 20:00 hs el personal completo se presentó para cobrar cada sueldo.
Algo raro habia pasado, el
asistente habia observado al nuevo empleado reclamando con desesperacion al gerente. Al lunes
siguiente el nuevo empleado ya no estaba...El asistente sabia que algo raro estaba pasando,
pero no tenia nada para comprobarlo. Al finalizar la mañana del lunes el asistente fue a los
vestuarios a mudarse de ropa, y encontro el locker del empleado "enfermo" abierto. Este empleado
ya no estaba enfermo, estaba actualmente trabajando, pero no en los vestuarios, asi que el
asistente no pudo resisitir la tentacion de revisar el locker, y se encontró con una c++ quick reference
saliendose del bolso del limpiador. Comentó esto a los programadores, pero nadie daba con la realidad.
El empleado habia visto el bug que el asistente dejo en su codigo, habia considerado una
celda adicional (que no existe) dentro del array de programadores. Cambió entonces el orden en la declaracion
de las variables y el código se habia vuelto en un generador de cash para uno de los empleados,
sin saber quien era. El ex empleado enfermo conocia la funcion de dispersión que la empresa usaba, detectó el bug y tambien conocÃa el sueldo horario
de los programadores, asi que sabÃa a quien iba a caerle un sueldo extra, de $300 la hora :D...
Aún sin conocer el nombre del afortunado que cobraba sin trabajar, nadie se enteró de quién estaba
cobrando de mas, y aunque el codigo del asistente fue reemplazado el sueldo fantasma quedó intacto.
La pregunta es...¿ quién se llevo la guita adicional (aprox. $24.000) ? . La respuesta es...el empleado
de la empresa cuyo valor resultado de la funcion de dispersión respecto de su nombre era 300 :D..
El compilador de C no detecta que el indice del arreglo ha sido sobrepasado, y la proxima
variable a escribir será una celda ficticia, 4 bytes adelante del ultimo elemento dentro del vector.
En este caso la variable hora_de_comer es vÃctima de la sobreescritura al principio, cambiando el orden
pasa a ser empLimpieza. El orÃgen de varios errores del
tipo 'valor fuera de rango' tambien se deriva (a veces) de lo que acabo de explicar, pero en este caso el bug
da piedad, almenos corta el programa. El hecho de no respetar una
frontera implica sobreescribir una variable en la posicion consecutiva dentro de la pila, la cual
no siempre es del mismo tipo que la otra, siempre hablando en terminos de la pila dentro del modelo
de memoria de un proceso en win32.
1 Comments:
Grandioso sitio,muy buen contenido,es una de las mejores paginas referente al tema que he encontrado,sigue asi.
Publicar un comentario
<< Home