lunes, 4 de junio de 2007

e-volución: ¿un futuro superior?

ZorphDark [blackhat4all@gmail.com]

En la década de 1980, tras un largo período de investigaciones, se logró exponer en las pantallas de rayos catódicos imágenes realistas que representaban nuestro mundo. La creación de potentes tarjetas gráficas, la reproducción de sonido digital de alta calidad y el desarrollo de la velocidad de los procesamientos digitales, permitieron la introducción y el progreso de la multimedia en todas las computadoras personales. Esto conllevó a impresionantes mejoras en la concepción y el diseño de sistemas operativos y programas dotados de una interfaz gráfica, además del perfeccionamiento de los videojuegos y aplicaciones que requerían del uso de imágenes y sonido.

El acceso a la computación por parte de un creciente grupo de personas no especializadas en la materia fue posible gracias a esa “explosión” gráfica. Este incremento de usuarios se hizo notar aún más con la aparición de la Web en 1989 y la desenfrenada expansión de Internet en los años 90. El objetivo del desarrollo de la informática y las nuevas tecnologías cambiaba repentinamente su rumbo. Con su corta edad y su escasa madurez, éstas comenzaban a intervenir en todas las esferas de la economía y en gran parte de las sociedades desarrolladas de una forma acelerada.

El nuevo mundo

Mucho antes de haber sido discutida seriamente por los políticos, psicólogos, sociólogos y filósofos, la “nueva era” de la información y las comunicaciones se adentraba con gran fuerza en el quehacer y en el pensar de muchas personas. La nueva generación y una parte importante de los adultos, comenzó a ver el ciberespacio como algo interesante, eficaz, e incluso, como una vía de escape a los problemas cotidianos.

Tras un caudal de estudios e investigaciones a lo largo de muchos siglos por tratar de esclarecer materialmente el mundo que nos rodea, muchos hombres de ciencia, precursores de las tecnologías actuales, nos han dejado el problemático legado de asimilar un nuevo mundo, muy diferente a las concepciones físicas con que se ha interpretado el nuestro. Nos encontramos ahora ante un universo colmado de sorpresas e interrogantes. Con el paso del tiempo, la ciencia ha adquirido nuevas dimensiones: a los científicos que intentan interpretar el mundo real, se le suman aquellos que se convierten en creadores y programadores de nuevos espacios dentro de un vasto territorio poco explotado en relación con sus dimensiones y sus riquezas tecnológicas y filosóficas.

La otra cara…

El problema está en que las nuevas tecnologías se desarrollan mucho más rápido que la conciencia humana. La informática y las redes han permitido un considerable desarrollo de la economía, la educación, la medicina y las comunicaciones, pero ¿hasta dónde? Esta revolución de finales del siglo XX ha sido tan silenciosa como apresurada. Muchos futuristas fanatizan con la idea de que estamos ante una nueva civilización, llena de esplendor y de maravillas, y otros muestran el pesimismo de terminar con una guerra devastadora contra máquinas dotadas de gran inteligencia artificial. La respuesta no está en profetizar, sino en el uso que se le dé a ese potencial tecnológico. Nuestro futuro depende del abandono de los pensamientos con fines bélicos y económicos, que ponen en juego nuestro destino y el fruto de los brillantes logros y descubrimientos a lo largo de la historia de la humanidad.

También es una realidad de que hay que conllevar este desarrollo con el de los países subdesarrollados, que carecen incluso de una energía eléctrica y telefonía que satisfaga las demandas. Se debería pensar seriamente en gastar menos recursos en robots militares y asignar más en ayuda de los que no tienen con qué alimentarse. Pero aún así, en medio de esa desigualdad, hay centenares de logros científicos que ocurren a diario que no se pueden obviar. La puesta en práctica de muchos de ellos puede ser tan dañina como una guerra, por estar financiados por entidades y gobiernos con intereses contrarios al desarrollo de la humanidad. Hay que tener muy en cuenta el uso que se le dé a la inteligencia artificial, a la química y a la genética. Vivimos una etapa muy interesante, donde el hombre ha pasado del modo de interpretación al de creación, y cualquiera de esos novedosos inventos puede acarrear un desastre global. El hombre actual se orienta mucho a lo nuevo, lo desconocido… ¿podrán la ciencia y las tecnologías ayudarnos a corregir el mundo en que nos encontramos? Depende de nosotros, de nuestras ideas y de nuestro esfuerzo.

Creando nuevas entidades

A la par de los biólogos en su afán de creación de organismos genéticamente modificados en el mundo real, los programadores se encuentran inmersos en el desarrollo de otro tipo de entidades, que se diferencian principalmente por no existir físicamente. Se pone en juego nuestra visión material del mundo y nuestro papel como “simples humanos” y no como “dioses”. El esfuerzo de los genetistas y de los cibernéticos continúa siendo un dilema, no sólo por su eficacia, sino, por su lugar en la evolución del hombre y en su futuro inmediato. Concebir clones y organismos al gusto propio de uno es tan interesante y riesgoso como la implementación de inteligencia en entidades mecánicas o virtuales.

Nos alejamos de los tiempos en que los dibujos de paisajes, el cine, las imágenes digitales realistas y las animaciones con efectos especiales eran un arte asombroso. Estamos ahora frente a creaciones artísticas de mayor magnitud. Dejamos de ser espectadores de una obra para convertirnos en creadores de un mundo inimaginable en la actualidad. Con el desarrollo científico-técnico, nuestro espíritu creativo se ha desarrollado aún más, al punto de concebir un ser mitológico y hacerlo realidad en pantallas catódicas, de plasma o en un holograma.

La interactividad de la multimedia ha abierto un portal que nos acerca cada día más a la dimensión de lo “no real” de los bits. El hecho de poder conversar con softwares inteligentes y poder resolver complicados problemas lógico-matemáticos ha brindado un gran impulso a nuestra imaginación, hasta el punto de hacer realidad nuestros pensamientos. La ciencia-ficción es incapaz de predecir hasta donde podrá llegar nuestro ingenio. Este es nuestro presente. ¿Qué será del futuro? ¿Qué sucederá cuando seamos capaces de crear una realidad virtual en la cual podamos adentrarnos y programar nuestro entorno? ¿Qué ocurrirá cuando la ciencia y la biología permitan la incorporación de “mejoras” en nuestro organismo? ¿Qué pasará cuando podamos intervenir en nuestro destino? ¿Nos convertiremos en nuestros propios dioses? Quizás esto no sea un sueño.

Inteligencia artificial ¿hasta qué punto?

Es difícil imaginar que el hombre, que aún no conoce los misterios de su cerebro y la metodología de sus pensamientos, pueda concebir una máquina que iguale su potencial. Algunos creen que para el 2020 podamos tanto viajar a Marte como conversar con una computadora “humanizada”. ¿Qué hay de fantasía o realidad en esto último? Si bien mucho esfuerzo y recursos económicos y financieros podrían poner los pies de un astronauta sobre las arenas de nuestro planeta cercano, la “inteligencia definitiva” del software de un cyborg está un poco distante de cumplirse. El sistema binario no brinda capacidades de cálculo suficientes como para interpretar la lógica de los sentimientos, las decisiones personales y el comportamiento propio de un ser humano. Sería muy difícil e incluso imposible representar nuestro mundo y las más variadas ideas con fórmulas matemáticas.

A pesar de ello, el cómputo con ADN en cuatro estados, la mecánica cuántica, el procesamiento holográfico y los híbridos neurodigitales -que combinan neuronas vivas con chips-, nos alejan de nuestras fronteras y muestras nuevos horizontes dignos de explorar. La velocidad de procesamiento y la capacidad de almacenamiento de las computadoras actuales con la ayuda de la lógica de un cerebro humano sería suficiente para superarnos en todo sentido. ¿Será posible esto? ¿Hasta qué punto?

e-volución: Evolución Electrónica

La instauración de un procesamiento no lineal y multifuncional podría acercarnos un poco al sueño de compartir nuestro mundo con máquinas realmente útiles y autónomas, que tracen metas y tomen decisiones por sí mismas. De este modo nos acercamos a otro problema bien descrito en los libros de ciencia-ficción. Es necesario enfatizar en que nuestra evolución debe ir por encima de la evolución electrónica. De hecho, es hora de que se elabore un esquema de análisis crítico capaz de tener en cuenta los nuevos desafíos que nos impone la ciencia y la técnica, para poder darles un sentido, y de esa forma, ayudarnos a nosotros mismos a trazar un camino seguro por el cual transitar.

La solución no está en frenar o luchar contra la evolución de la ciencia y la tecnología, la creación de robots inteligentes y de organismos genéticamente modificados. Esa no es la vía. Hay que desarrollar libremente el fenómeno Internet, la creación de softwares libres y el intercambio científico sin intereses de otro tipo que no sean el perfeccionamiento del hombre dentro de la sociedad y la naturaleza en que se desenvuelve. Cualquier intento de censura cerrará puertas que no se volverán a abrir o se abrirán del modo incorrecto. Hay que cultivar en todas las personas en las que recaiga el peso de la creación del nuevo mundo (ya sean programadores, políticos, filósofos, económicos, artistas, etc.) una concepción humanista de sus pensamientos.

El ciberespacio, en vez de globalizar el mundo en una idea monopolizadora, entrará a medida que su desarrollo lo permita, en cada una de las culturas e ideologías del planeta, para que la interpretación de la vida y la historia humana tenga lugar en sus más variadas concepciones. La llamada brecha digital es un factor que debe eliminarse para la diversificación de las culturas en Internet. El libre acceso a la información fomentará el desarrollo del “nuevo” y el “viejo” mundo, enriquecerá las mentes más enajenadas y contribuirá en gran medida a la evolución del intelecto humano. Tanto como nadie debe perder en este proceso de cambios el “instinto de lo real”, nadie se debe quedar atrás en la revolución de las tecnologías e información. Debemos estar dispuestos a entrar en este universo de información y conocimientos inagotables con mucha precaución, preparación y deseos de lograr para la especie humana un futuro superior.

Para saber más...

Continuar leyendo

Introducción a .NET

Krlo [blackhat4all@gmail.com]

.NET es un proyecto de Microsoft para crear una nueva plataforma de desarrollo de software. Microsoft intenta desarrollar una estrategia horizontal que integre todos sus productos, desde el sistema operativo hasta las herramientas de mercado. Esta tecnología es una respuesta a la tecnología Java de Sun Microsystems, para acaparar el creciente mercado de los negocios en el mundo Web. Microsoft anunció la iniciativa de .NET en Julio del 2000. Ya en Abril del 2003, la versión 1.1 de .NET Framework estaba en nuestras vidas, y para siempre.

Bases

Para aprovechar al máximo las ventajas de .NET, es imprescindible conocer cómo funciona y qué brinda.
El Framework es la base de toda la plataforma, es la infraestructura que reúne un conjunto de lenguajes, herramientas y servicios que simplifican el desarrollo de aplicaciones. Algunas biografías incluyen el ASP.NET.

1. El conjunto de lenguajes de programación: C# (nació con .NET, sin duda el paradigma de esta tecnología), Visual Basic, Delphi (Object Pascal), C++, J#, Perl, Python, Fortran y Cobol.NET.

2. La Biblioteca de Clases Base o BCL: Se clasifica en tres grupos claves: ASP.NET y Servicios Web XML, Windows Forms y ADO.NET. Su función es brindar los servicios necesarios para realizar las operaciones básicas involucradas en el desarrollo de aplicaciones, entre otras la interacción con los dispositivos periféricos, manejo de datos (ADO.NET), administración de componentes web (aquí es donde entra ASP.NET), herramientas de gráficos (GDI+), operaciones aritméticas, interacción con el API Win32,... Prácticamente todo lo necesario para trabajar lo brinda la BCL.

3. El Common Language Runtime (CLR): El componente más importante del framework es el CLR (motor común de ejecución). Si eres programador de Java, piensa en el CLR de .NET como el equivalente del Java Virtual Machine (JVM). Si no conoces Java piensa en el CLR como el corazón y el alma de la arquitectura .NET. A un alto nivel, el CLR activa los objetos, realiza chequeos de seguridad sobre ellos, los coloca fuera de la memoria y destruye los no referenciados (Garbage Collection).

Cómo se crean aplicaciones.

1. Elegir un compilador: .NET ya soporta más de 20 lenguajes, cada uno con un compilador particular, aunque todos con un fin común como veremos después. Elegir un lenguaje no es tan difícil, el mayor peso lo da nuestros gustos y la experiencia que tengamos con alguno de ellos. Se recomienda utilizar uno o dos para obtener mayores beneficios del CLR.

2. Compilar el código a Lenguaje Intermedio de Microsoft (MSIL): Toda aplicación en .NET está compuesta por ensamblados, toda DLL o EXE es un ensamblado. Los mismos, además de un manifiesto, metadatos y recursos, contienen código intermedio (IL). El IL es común a todos los lenguajes, y todos los lenguajes se convierten a IL. ¿Cómo se logra esto?
El Common Type System (CTS) es un conjunto de reglas para declarar, usar y administrar tipos. Establece una plataforma que permite integración de lenguajes, seguridad en los tipos y un alto rendimiento de ejecución de código. Los tipos creados en .NET deben cumplir las reglas del CTS.
El Common Languague Specification (CLS) es un convenio entre los diseñadores de lenguajes y los diseñadores de .NET Framework. Está formado por un subconjunto del CTS y un conjunto de reglas y restricciones que posibilitan a un compilador, agregar un lenguaje a la plataforma .NET. Todos los lenguajes no tienen reglas iguales. Por ejemplo, C++ es case-sensitive, y VB.NET no. Con el objetivo de que todos vayan por la misma línea, Microsoft publicó el CLS.
Todo esto posibilita crear una clase Vehículo en Visual C++, implementar un auto en C# y un avión en VB, ambos herederos de Vehículo. Para completar podemos crear el ConductorDeVehículo en Java #. Polimorfismo entre lenguajes!!!.

3. Compilar MSIL en código nativo: En tiempo de ejecución, un compilador Just-In-Time (JIT), componente del CLR, convierte MSIL en código nativo. Durante esta compilación, el código debe pasar un proceso de comprobación que examina el MSIL y los metadatos para averiguar si el código garantiza la seguridad de tipos. El JIT es muy interesante, sólo compila a código nativo cada parte del IL una sola vez. La primera vez que se necesita un método se compila y se guarda, la próxima sólo se busca lo anteriormente compilado y se ejecuta este. En parte, por eso se denomina Justo a Tiempo, en el momento preciso compila lo únicamente necesario, si un método de la aplicación nunca se requiere en ejecución, nunca se compila, y se hace sólo una vez.

4. Ejecutar el código: El CLR proporciona la infraestructura que permite que la ejecución tenga lugar, así como una amplia gama de servicios que se pueden utilizar durante la ejecución. El CLR tiene los siguientes componentes:

El Execution Engine es el componte encargado de dirigir toda la ejecución de los programas, usa los demás componentes del CLR para cargar y descargar código, verificar el IL, manejar la memoria, mantener la seguridad de tipos, manejo de excepciones y la colocación y liberación de objetos. El último paso es realizado por el Garbage Collector, sin duda una herramienta vital, pues nos aísla de tener que pensar en liberar memoria como en C++.

Las ventajas más importantes que proporciona .Net Framework son:

  • Código administrado: El CLR realiza un control automático del código para que éste sea seguro, es decir, controla los recursos del sistema para que la aplicación se ejecute correctamente.
  • Interoperabilidad multilenguaje: El código puede ser escrito en cualquier lenguaje compatible con .NET, ya que siempre se compila en código intermedio (MSIL).
  • Compilación just-in-time: El JIT compila el código intermedio (MSIL) generando el código máquina propio de la plataforma, sea Windows o Mac. Se aumenta así el rendimiento de la aplicación al ser específico para cada plataforma.
  • Garbage collector: El CLR proporciona un sistema automático de administración de memoria denominado recolector de basura. El CLR es el encargado de detectar cuándo el programa deja de utilizar la memoria y la libera automáticamente.
  • Seguridad de acceso al código: Se puede especificar que una pieza de código tenga permisos de lectura de archivos pero no de escritura. Es posible aplicar distintos niveles de seguridad al código, de forma que se puede ejecutar código procedente del Web sin tener que preocuparse si esto va a estropear el sistema escribiendo o cambiando donde no debe.

Futuro de la tecnología:

El .NET Framework 3.0 es el nuevo modelo de programación para Windows. Combina la funcionalidad de sus anteriores con cuatro nuevas tecnologías, que empezaremos a oír cuando tengamos en Cuba una mayor proliferación del Vista. En la figura podemos apreciarlas en azul oscuro:

  • Windows Presentation Foundation (WPF o Avalon): Provee a los desarrolladores y diseñadores de un modelo de programación unificado para crear aplicaciones Windows que mezclan la UI con contenido multimedia. Podemos dividir el proceso en el diseño y las funcionalidades, para unirlos en el resultado final.
  • Windows Communication Foundation (WCF o Indigo): Es el modelo de programación unificado de Microsoft para la construcción de aplicaciones orientadas a servicios en código manejado. Extiende el .NET Framework, permitiendo a los desarrolladores construir Web Services seguros y fiables.
  • Windows Workflow Foundation (WF o WinOE): Windows Workflow Foundation es el modelo de programación unificado de Microsoft para un desarrollo rápido de aplicación orientadas a procesos empresariales.
  • Windows CardSpace (WCS, antes "InfoCard"): Windows CardSpace permite a los usuarios identificarse digitalmente de una manera sencilla y familiar.

Conclusiones

En .NET el programador se puede concentrar en resolver el problema, no tiene que complicarse en cuestiones como manejo de memoria o integridad de sus objetos. Para ello existe el Garbage Collector y un fuerte sistema de tipos. Por cuestiones de espacio no puedo abordar el sistema de tipos de .Net, o en los ensamblados y sus metadatos. Mi idea era definir muchas cuestiones de esta tecnología sin profundizar en detalles. Pretendo hacer otro artículo sobre ensamblados, metadatos y Reflection, para no dejar el tema aquí.

Para saber más...

Continuar leyendo

¿Por qué?

Alien [blackhat4all@gmail.com]

Hola, primeramente mis saludos a todos aquellos que han seguido la revista desde sus inicios y, en especial, a los que de una forma u otra han colaborado enviando artículos, críticas o sugerencias.

Los que acostumbran a leer mis escritos (que pienso que la mayoría sean aquellos que posean cuentas de Infomed), se habrán dado cuenta que casi siempre hablo sobre cómo optimizar las conexiones, cómo acelerar la descarga de archivos, etc. Quisiera hacerles entender que mi objetivo con estas cosas no es desacreditar ni echar por tierra el trabajo que realizan los que se encargan de mantener la red en funcionamiento; por el contrario, aunque a veces desee que un rayo me parta el MÓDEM en dos (en sentido figurado, claro está), estoy satisfecho (entre comillas), con el servicio que nos brindan, reconozco que es uno de los servidores que más personas atiende en el país, y que se esfuerzan por dar lo mejor de sí para mantener esta isla conectada las 24 horas. Sólo que soy de los que piensan que no hay nada de malo en tratar de sacarle el mayor provecho al servicio que nos brindan. Todos los que están leyendo esto es porque de alguna forma tiene un PC, y aunque esté corriendo a 5 Ghz, con 2 Gb Ram y 300 Gb de HDD, siempre van a tratar de, en la medida de sus posibilidades, de mantenerla lo más cuidada posible, instalar sólo las cosas necesarias, etc.

Tampoco soy de los que escriben para hacer preguntas, trato de resolver mis problemas yo mismo. Si no sé cómo funciona algo, lo primero que hago antes de salir a preguntar, es “cacharrear”. Creo que esa es la forma más instructiva de aprender. Además, todo sabemos que como se cultiva la computación es con muchas “horas nalgas”. Pero también, al igual que ustedes, yo tengo preguntas que hacer, y si alguien de los que está leyendo esto sabe las respuestas, por favor, que me escriba.

Normalmente Infomed está conectado a la verdadera Red de Redes. Supongo que por ésto el país esté pagando, ya que es un servicio que se presta y bla bla bla...; pero una vez conectado, los nodos de Infomed funcionan como puntos de acceso, es decir, los usuarios que pertenecen a dicha red hacen peticiones de servicios e Infomed a su vez se los pide a Internet, y el resultado los reenvía a nosotros. Para que tengan una idea de cómo funciona, piensen que el resto del mundo habla un idioma, aquí en Cuba se habla otro e Infomed es un traductor. La pregunta entonces está clara, ¿por qué Infomed se niega a brindar acceso a ciertas páginas? o, para seguir con el ejemplo, ¿por qué se niega a traducir ciertas palabras?

Estoy conciente que hay muchos lugares en Intenet a los que es mejor no entrar, ya sea por su contenido pornográfico, o por cosas más bien relacionadas con política y asuntos de los que prefiero no comentar, aunque, como dice el dicho, para gustos se han hecho los colores. Pero alguien, por favor, me puede decir ¿qué tiene de malo la web del programador?.

Para los que no tuvieron (y digo “tuvieron”, porque ya no tendrán) la posibilidad de entrar a dicho sitio, les comentaré que era una página donde personas conocedoras de distintos lenguajes de programación exponían sus códigos -algo muy importante para los que se iniciaban en la programación.

Yo, personalmente, no veo mal a los “traductores” que por respeto a sus clientes se nieguen a “traducir” palabras que puedan ofender a algún oído, pero ¿por qué no querer traducir palabras como Aprender, Conocer, Saber, Educarse, Cultivarse, Formarse, ....? La lista sería inmensa.

En publicaciones anteriores, por estas mismas razones se expuso una corta lista de sitios alternativos a los que entrar, lugares desde los cuales se podían hacer amistades, buscar información, etc. Y realmente no pensé que tuviera que llegar al punto de escribir un artículo sobre esto, pero es que cada día que pasa, son más las restricciones, y ya está empezándome a cansar el mensaje de: Access Denied.

Pienso que todavía nos falta mucho -muchísimo- por llegar a tener una red de la cual podamos aprender. No digo que no limitemos algunos sitios, porque no me gustaría que si tuviese un hijo, estuviera mirando a las 3:00 am una página de Playboy, viendo por el monitor métodos de tortura o fotos de mutilaciones. Pero sí me agradaría que al despertarme a las 6:00 am, él estuviera sentado frente a la máquina, tratando de optimizar un código que vio en una página de programación. Si es así, quizás hasta le prepare el desayuno, y en la noche siguiente nos desvelemos los dos.

Para saber más...

Continuar leyendo

Correos anónimos en clientes e-mail

Alien [blackhat4all@gmail.com]

Durante mucho tiempo las personas han utilizado programas para enviar correos anónimos. En esta misma revista, inclusive, hace dos semanas atrás se mostraba cómo utilizar el servicio de Telnet para dichos fines. Ahora, en este artículo, yo invito un poco a la reflexión: ¿cómo funciona el servicio de correo postal?

Bien, a la hora de enviar un correo a una dirección determinada a través de la oficina postal, es obligatorio poner el remitente. Esto es algo muy lógico, ya que quien recibirá la correspondencia, está en todo el derecho de saber quién se la envía, sólo que la oficina postal no se encargará de chequear si la dirección puesta por el remitente es verdadera o no, sólo le interesa que haya algo escrito en ese campo y que las normativas que requiere la oficina postal para el envío de correspondencia se hayan cumplido (que esté un tipo de sello, que se haya pagado por el servicio, etc. [no sé, yo realmente nunca he pasado un correo postal]).

El correo anónimo se envía utilizando el mismo principio, es decir, por ejemplo, si una persona tiene una cuenta de Infomed y quiere en determinado momento pasar un correo, al servidor de Infomed no le interesa saber el nombre de la persona, lo único que requiere como datos reales, es la dirección a la cual va destinada el correo, y saber que el correo que se está enviando pertenece a su dominio (infomed.sld.cu).

¿Por qué utilizar programas para el envío de correspondencia anónima, si nosotros mismos podemos hacerlo? En mi caso, y no pienso que sea muy especial, uso como gestor de correo el Mozilla Thunderbird. A través de él puedo crear cuentas de correo (todas las que quiera). Supongamos que es la primera vez que creo mi cuenta, así que me dirijo a las opciones que me permiten crearla:

  • Especifico el nombre que quiero que tenga dicha cuenta.
  • Mi servidor de correo entrante (pop3.sld.cu)
  • Mi servidor de correo saliente (smtp.sld.cu)
  • Le indico cuál es mi dirección de correo electrónico.
  • Finalizar.

Esos más o menos -a grandes rasgos- son los pasos para crear una cuenta de correo en la mayoría de los gestores de correo, y no está mal, sólo que así hemos creado una cuenta de correo válida, y nuestro objetivo es crear una cuenta de correo que no exista. Para eso solo debemos modificar el último campo. ¿Por qué...? Sucede que cuando un correo pasa por Infomed, lo primero que hace el servidor es verificar que sea él quien debe enviarlo y, para esto, utiliza toda la cadena de caracteres que va después de la arroba (@). Si, por ejemplo, creamos desde Infomed una cuenta de nombre fulano@mengano.com, nunca se llegará a enviar, puesto que dará error al hacer la comparación:

@infomed.sld.cu != @mengano.com

Si queremos crear una cuenta que podamos utilizar, debemos hacerla manteniendo fija la cadena de texto tras la @, por ejemplo, cuenta_falsa@infomed.sld.cu.

Este articulo se complicaría demasiado si empiezo a poner ejemplo de cómo utilizar luego dicha cuenta en cada gestor de correos por separado. Pero en mi caso, cuando creo un mensaje nuevo, sólo tengo que decirle que no va a ser cuenta_real@servidor.cu quien va a hacer el envío, sino cuenta_falsa@servidor.cu.

Por esta vía es mucho más práctico que utilizando otros programas con el mismo fin, ya que no dejaríamos de usar el gestor de correo al que estamos acostumbrados, podríamos enviar archivos adjuntos (no todos los programas de envío de correo anónimo lo permiten), se puede personalizar más creando una plantilla con determinadas características, etc.

Entre las desventajas que tiene el hacerlo de esta forma, es que cada vez que demos en recibir correos, se intentará recibir también lo que esté en el buzón de cuenta_falsa@servidor.cu, pero como la cuenta no existe, dará un error. Esto se solucionaría de diversas maneras: se le puede decir que no reciba todos los correos, sino solamente los de cuenta_real@servidor.cu, o creando sólo la cuenta falsa cuando lo necesitemos, y luego borrándola... eso ya queda en sus manos.

Las posibilidades de dar con la dirección real de la persona que envía un correo anónimo son muy bajas, pero existen. Se pudiera hacer si el mensaje se edita con algún editor de texto sencillo. En una línea determinada mostrará la dirección IP de la persona que envió el correo, el servidor por el cual pasó, y la hora de salida. Con estos datos se le puede pedir al servidor la lista de todas las IP y números de teléfonos (en caso de que la cuenta estuvieran anclada) que a esa hora se conectaron y, conociendo el teléfono pueden dar fácilmente con tu cuenta real y con tu dirección física. Pero eso dejémoslo para los que trabajan para la NASA.

Para saber más...

Continuar leyendo

Notas para un mejor uso de HyperTerminal

ZorphDark [blackhat4all@gmail.com]

A pesar de ser una de las herramientas menos potentes de su tipo, HyperTerminal se ha convertido en los últimos años en el terminal de comunicaciones más utilizado por usuarios de computadoras personales. ¿El motivo? Pues, como es de esperar, el gigante azul compró una licencia a Hilgraeve para distribuir en el lanzamiento de Windows 95 una versión reducida del HyperACCESS. Denominada HyperTerminal, pasó a formar parte del grupo Comunicaciones de sus Accesorios hasta la salida de Windows XP en el 2001. Posteriormente, sólo se incluyó en los Service Packs que distribuyó Microsoft para parchear los "pequeños" errores y problemas de seguridad de dicha versión de su sistema operativo insigne.

La mayor parte de las personas no ha tenido la necesidad de "descubrir" este programa, ya que los navegadores se han encargado de arrebatarle la popularidad impuesta en el mercado de los terminales. Se puede confirmar esto preguntándole a cualquier usuario de Windows qué es un terminal. Puede que de entre millones de negativas haya algún que otro veterano de los años '80 con una respuesta convincente. Pues con la secesión de los BBS -debido a la explosión web de la década pasada-, los terminales de comunicaciones cesaron de jugar un papel importante en las redes para darle cabida a las primeras versiones de Mosaic, Netscape, Mozilla e Internet Explorer. Tales utilidades permitían descargar, a través de una interfaz gráfica, contenido multimedia e hipertextual desde servidores de información. De la misma forma, los clientes de mensajería instantánea habían superado el simple envío y recepción de los mensajes de texto plano. Estos factores, entre otros de carácter tecnológico, desplazaron al olvido aquellas aplicaciones de fondo negro y caracteres grises.

A pesar de esto, muchos de nosotros al no tener acceso a nuestros servidores de Internet, necesitamos recurrir a los legados obsoletos de las redes de aquella era. Ante la inexplicable ausencia o escasez de ADSL, fibras ópticas, servicios inalámbricos o PLC en nuestro país, el HyperTerminal se convierte en una solución para transferir binarios y textos de forma sincrónica a otra computadora utilizando el bitraje que nos proporcionan las líneas telefónicas de ETECSA.

Al ejecutar la aplicación, un cuadro de diálogo nos permite nombrar y seleccionar el icono que va a representar la conexión que queremos establecer con un equipo remoto. Luego escribimos los detalles del número telefónico al que está conectado el módem de dicho equipo, seleccionamos el módem desde el cual queremos iniciar la comunicación y, presionando el botón Marcar, enviamos a ese dispositivo la señal necesaria para que comience a realizar su labor. Si la otra computadora está configurada para recibir llamadas entrantes (activando la opción Llamar » Esperar una llamada), tras un timbre telefónico que indica que se estableció la comunicación, ambos módems estarán listos para comenzar la modulación de las señales entrantes y salientes. Hasta que finalice la llamada, ambos usuarios podrán escribir en tiempo real en la pantalla de la terminal; opción válida para los que no tienen acceso a algún IRC o desean tener una conversación privada. Para tener éxito en esta última opción se debe utilizar cualquier método de encriptación sencillo como ROT-13. Los caracteres entrantes se pueden guardar directamente en un archivo de texto especificado en Transferir » Capturar texto. Para imprimirlos, se debe activar la opción Transferir » Capturar en impresora.

Si nos conectamos desde una computadora portátil, podemos establecer ubicaciones y reglas de marcado específicas para cada punto de comunicación. En caso de efectuar llamadas locales, es recomendable desactivar la opción Utilizar código de país o región y código de área en la opción Modificar del cuadro de diálogo Conectar.

Realmente es preferible tener una conversación hablada que escrita (disculpen los chateros), pero el HyperTerminal tiene una ventaja de la que carece nuestra telefonía fija: la transmisión de datos. Para aprovechar correctamente la computadora, el módem y el teléfono que algunos tenemos en los hogares, y dejar de lamentarnos por no tener acceso a una cuenta de correo electrónico o a un servidor FTP, acudiremos a Transferir » Enviar archivo... y seleccionamos el nombre de fichero y el protocolo que utilizaremos para enviarlo. Es aconsejable utilizar Zmodem, puesto que está diseñado para manejar transferencias de datos mayores que los demás protocolos con una menor tasa de errores. Además, cuenta con una característica denominada checkpoint restart (se activa seleccionando la opción Zmodem con recuperación de errores), que permite que cualquier transmisión interrumpida -algo bastante común- pueda continuar desde el último punto de comprobación válido. Los archivos recibidos se almacenan por defecto en %UserProfile%, pero mediante Transferir » Recibir archivo... podemos seleccionar otra carpeta donde colocarlos en cada sesión de comunicación.

Cada conexión efectuada tiene una configuración única, que consta de un número de teléfono (o de host, véase más adelante), configuración específica de puerto y de comprobaciones de paridad. Dichas conexiones pueden guardarse en un archivo de extensión HT, para ser reutilizadas en otra ocasión, constituyendo una gran ventaja si se utiliza frecuentemente el HyperTerminal con equipos remotos fijos.

HyperTerminal puede obrar como una alternativa al Cliente Telnet de Microsoft -el predeterminado del sistema-, que se ejecuta mediante el comando telnet. De esta forma puede interactuar con un servidor Telnet si se tienen privilegios de administración. Para efectuar una conexión mediante TCP/IP, en la ventana Conectar a se debe seleccionar la opción Conectar usando TCP/IP (Winsock) y escribir la dirección y el puerto del host al que se desea llamar. Los parámetros de inicialización pueden ser pasados al programa desde la línea de comandos o dentro de un archivo de procesamiento por lotes batch (.BAT). HyperTerminal se encuentra en %ProgramFiles%\Windows NT\hypertrm.exe y la sintaxis para esta tarea es la siguiente:

hypertrm.exe/t <dirección telnet>[:<puerto>]

Como cualquier otra terminal de comunicaciones, HyperTerminal está directamente vinculado a los módems instalados en el sistema operativo. Cualquier comando AT estándar que se escriba en la terminal recibirá una respuesta del módem predeterminado. Por ejemplo, si escribimos ate1 se visualizará OK si este dispositivo funciona correctamente y ERROR en caso de que no se detecte módem alguno. Si tecleamos ati0 o ati3, se mostrarán la descripción del módem. De todas formas, hay un método más eficiente para realizar consultas a un módem: en Panel de Control » Opciones de teléfono y módem, ficha Módem, botón Propiedades, ficha Diagnóstico y botón Consultar módem.

Para saber más...

Continuar leyendo

Comentando C# con XML

Krlo [blackhat4all@gmail.com]

Aunque muchos de nosotros no acostumbramos a comentar nuestro código, porque creemos que no vale la pena o nos dejamos arrastrar por la haraganería, estamos conscientes que un programa no comentado es un problema colosal a la hora del mantenimiento. En Microsoft, se refieren a comentar como una Best Practice para el desarrollo de cualquier tipo de aplicación. Por tal motivo, el lenguaje insignia de su plataforma .NET incorpora desde su primera versión en Visual Studio .NET 2003, la facilidad de que su IDE se relacione directamente con un estilo particular de comentar código. Por supuesto, estamos hablando de C# y la documentación XML.

Aunque para nada son obsoletos los // y /**/, los comentarios XML son usados por el IDE para describirnos, en tiempo real, las características de los métodos u objetos comentados cuando en un futuro los estemos utilizando. Recuerden, por ejemplo, como siempre que usamos un objeto X y escribimos un punto a continuación de su identificador (x.), enseguida nos muestra una lista de las opciones disponibles, como sus métodos, y de estos su tipo de retorno, descripción, parámetros, etc. Esto sucede porque dichos métodos fueron comentados con XML. En la siguiente imagen podemos llevarnos mejor la idea:

Creando comentarios XML:

Con XML podemos comentar: clases, delegados, interfaces, campos, eventos, propiedades y métodos. La manera de trabajar con todos es, antes de su definición, teclear tres ´/´ (///) y aparecerá, en dependencia del caso, una estructura en XML a completar.

Para el caso de un método string Califica(int nota){}, aparecerá:

///<summary>
///Este método califica en Excelente, Muy Bien, Bien…
///</summary>
///<param name="nota">Nota cuantitativa del estudiante</param>
/// <returns>Nota cualitativa</returns>
public string Califica(int nota)

Seguro se dan cuenta de para qué se utilizan etiquetas como summary, param y returns. Vamos a ver como nos clasifica José Antonio González Seco en su libro "El lenguaje de programación C#", muchas de ellas:

Etiquetas de uso genérico
Éstas se utilizan para cualquier objeto que tratemos de comentar:

  • <summary>: Su contenido se utiliza para indicar un resumen sobre el significado del elemento al que precede. Cuando utilizamos el operador . para acceder a algún miembro de un objeto se mostrará esta información.
  • <remarks>: Su contenido indica una explicación detallada sobre el elemento al que precede. Se recomienda usar <remarks> para dar una explicación detallada de los tipos de datos y <summary> para dar una resumida de cada uno de sus miembros.
  • <example>: Su contenido es un ejemplo sobre cómo usar el elemento al que precede.
  • <seealso>: Se usa para indicar un elemento cuya documentación guarda alguna relación con la del elemento al que precede.
  • <permission>: Se utiliza para indicar qué permiso necesita un elemento para poder funcionar.

Etiquetas relativas a métodos
Además de las etiquetas de uso general ya vistas, en las definiciones de métodos se pueden usar las siguientes:

  • <param>: Permite documentar el significado de un parámetro de un método.
  • <paramref>: Se usa para referenciar a parámetros de métodos. No tiene contenido y el nombre del parámetro referenciado se indica en su atributo name.
  • <returns>: Permite documentar el significado del valor de retorno de un método.

Etiquetas relativas a propiedades
El uso más habitual de una propiedad consiste en controlar la forma en que se accede a un campo privado, por lo que ésta se comporta como si almacenase un valor. Mediante el contenido de la etiqueta <value> es posible describir el significado de ese valor:

/// <value>Edad de la persona representada</value>
public int Edad{
  set { edad = (value<0)? 0:value }
  get { return edad; }
}

Etiquetas relativas a excepciones
Para documentar el significado de un tipo defindo como excepción, puede incluirse un resumen sobre el mismo como contenido de una etiqueta de documentación <exception> que preceda a su definición. El atributo cref de ésta suele usarse para indicar la clase de la que deriva la excepción definida. Por ejemplo:

<exception cref="System.Exception">
/// Excepción creada para cuando se reproduzca reggaeton.
/// </exception>
class MusicException: Exception
{}

Etiquetas relativas a formato
Para mejorar la forma de expresar el contenido (simple pacotilla) de las etiquetas de documentación que se utilicen, es posible incluir en ellas las siguientes etiquetas de formato:

  • <see>:Se utiliza para indicar hipervínculos a otros elementos de la documentación generada. Nos puede interesar relacionar un objetivo con otro ya comentado.
  • <code> y <c>: Ambas etiquetas se usan para delimitar textos han de ser considerarse fragmentos de código fuente.
  • <para>: Se usa para delimitar párrafos dentro del texto contenido en otras etiquetas. Como <p></p> en HTML.
  • <list>: Se utiliza para incluir listas y tablas como contenido de otras etiquetas.

Generar un archivo XML sobre la solucion comentada:

Podemos crear archivos XML que se compilen al mismo tiempo de la compilación del código. Estos archivos son difícil de entender, por lo que hay que agregarle al comienzo una línea que especifíque la hoja de estilo con que se quiere publicar.

<?xml:stylesheet href="<ficheroXSL>" type="text/xsl"?>

Si no sabemos crear hojas de estilo XSL, podemos generar reportes web con Visual Studio como veremos más adelante. Para crear un archivo XML sobre la documentación cuando se compile la solución:

VS 2003: View » Property Pages » Configuration Properties » Build » XML Documentation File. En el diálogo que aparece especificar el nombre de la documentación en XML.

VS 2005: Project » Application Properties » Build » Output » XML Docum. File. Al igual que en el caso anterior, indicar dónde quieres el archivo y con qué nombre.

Generar Reporte Web de Comentarios:

Visual Studio .NET permite generar automáticamente un reporte en formato HTML de todos los comentarios XML que fueron colocados en el proyecto o solución; si la solución tiene más de un proyecto se documentarán todas las clases con sus respectivos métodos y miembros clasificadas de acuerdo a sus respectivos proyectos.

Para utilizar esta herramienta en VS 2003 apuntamos al menú de Herramientas (Tools), y seleccionamos la opción Generar Reporte Web de Comentarios (Build Comment Web Pages), tal como se muestra en la siguiente figura:

Aparecerá un cuadro de diálogo que nos presentará dos opciones:
• Realizar los comentarios de toda la solución.
• Realizar los comentarios de los proyectos seleccionados.

La lista de proyectos se encuentra bajo estas dos opciones, donde se puede seleccionar los proyectos a los cuales se aplicará la generación de los Comentarios Web. Luego de esto podemos seleccionar la carpeta de destino del archivo de Comentarios Web, el mismo que puede ser añadido a los Favoritos de Internet Explorer para poder acceder a él directamente. Dejaremos las opciones predeterminadas.

Realizando este artículo, traté de generar un reporte en VS 2005 y no encontré la manera. Por lo menos no aparece explícitamente. Si algún lector ha resuelto este inconveniente, por favor, tire algunos strings para BlackHat con la solución.

Conclusiones:

Como pudimos ver, es posible crear la documentación de nuestro proyecto de forma automática, sólo completando las etiquetas del XML. El hecho que la misma se genera a partir de los fuentes permite hacer ambas cosas a la vez, programar y documentar. Si eso no fuera un fuerte motivo, utilizar las bondades del IntelliSense del IDE, a la hora de usar métodos, clases o variables nos compromete aún más con la idea.

Para saber más...

Continuar leyendo

doWTP_Restore.exe

Alien [blackhat4all@gmail.com]

Hace unos días, mientras estábamos dándole formato a la revista número 15, lo vi por primera vez. Un archivo de nombre doWTP_Restore.exe dentro de la carpeta MSOCache se apareció en una memoria que recién habíamos formateado. En ese momento no le prestamos mucha atención, puesto que estábamos más preocupados por terminar la revista a tiempo que por un posible programa maligno que yo tuviese en la máquina; sólo me limité a escribir en un TXT: "Tengo que revisar la memoria".

Hace dos días exactamente estaba registrando en las notas y vi que tenía cosas pendientes por hacer, así que me dediqué a buscar toda la información que pudiera acerca de este archivo. Fui hasta la biblioteca de virus nacionales (es una vecina que aún sin tener conexión a ningún tipo de red, han pasado por su máquina todos los tipos de virus que han salido en Cuba) y, efectivamente, en su memoria estaba ese mismo archivo.

Dos cosas: quisiera aclarar antes que nada a aquellos que tengan el NOD32 -que yo también lo tengo actualizado, y aun así no me detectó nada- que no se deben confiar. Y la otra es que al menos yo no lo llamaría virus todavía, a pesar de que según tengo entendido, en alguna máquina, Kaspersky lo reconoció como un programa potencialmente maligno.

¿Cómo sé si lo tengo?

El programa se encuentra dentro de una carpeta de nombre MSOCache, y hasta donde sé, se propaga fundamentalmente por la memorias Flash. Lo primero es tratar de habilitar la opción de mostrar archivos ocultos; así sabremos si tienen o no en nuestro dispositivo una carpeta con dicho nombre. Si no la tienen, no sigan leyendo esto, pero en caso de tenerla, de nada les servirá formatear la memoria, ya que al parecer, en la máquina hay un programa que cada un tiempo verifica a ver si en la Flash está el archivo, y si no está, lo copia. Tendrían que formatear la memoria y extraerla rápidamente de la PC, pero eso no lógico, ya que no la van poder poner hasta que no desinfecten la computadora.

¿Qué hace?

Como dije anteriormente, no lo puedo catalogar como virus, hasta ahora no he visto cosas inusuales graves como para decir que es “el peor virus de la historia”. Pero si:

1. Ralentiza el proceso de reconocimiento y carga de las memorias que lo tienen: cosa esta muy lógica, ya que no sólo tiene la máquina que reconocer el nuevo hardware, sino que tiene que cargar y pasarle parámetros a un archivo que puede ir desde ser un "Hola Mundo" hasta un programa encargado de calcular el factorial de 1000.
2. Evita que la memoria pueda ser extraída en cualquier momento: esto no es siempre, y puede estar dado por la misma razón anterior, si un programa se carga desde la memoria, esto conllevaría a que la memoria no se puede extraer tan fácil.

Estas son las cosas que veo que me hace, y lo que me han comentado, pero realmente puede ser una bomba de tiempo como el Melissa y activarse tanto en una fecha determinada como por una acción del usuario.

¿Qué hago?

Bien, el virus funciona gracias a un autorun.inf que está también dentro de la memoria. Este archivo no consta de mas de 4 líneas, pero en el se carga al doWTP_Restore.exe y se le pasa parámetros inclusive. Lo primero es tener bien claro que no se debe formatear la memoria, ya que esto traería como consecuencia que se sobreescriban los ficheros, y cualquier cosa que hayamos hecho para detener su efecto quedará obsoleta. Lo otro es que los archivos están ocultos y con atributos de sólo lectura y de sistema. Para quitarles estos atributos, yo personalmente lo hago desde una ventana de MS-DOS escribiendo la siguiente línea:

Attrib –r –h –s autorun.inf
Attrib –r –h –s MSOCache

Una vez hecho esto, los archivos están a la vista y listos para ser modificados. Ahora lo que tenemos que hacer es editar el autorun.inf con cualquier editor de texto y borrarle todas las líneas de código que tenga escritas. Luego lo guardamos con el mismo nombre y, por un problema de estética, podríamos concluir yendo al DOS y dándoles los atributos que tenían:

Attrib +r +h +s autorun.inf
Attrib +r +h +s MSOCache

Haciendo esto no quiere decir que se haya desinfectado ni la memoria ni la máquina, pero al menos no estaremos contribuyendo a propagar el programa en cuestión, ya que al ejecutarse el autorun.inf lo que haría sería... nada. Y cuando el virus residente en nuestra máquina intente copiar los archivos a la memoria, se dará cuenta que están ahí con esos mismos nombres y pensará que no en necesario copiarlos.

La otra parte está en desactivar de la computadora al archivo que se encarga de infectar la memoria Flash.

Para que el archivo pueda ejecuta su acción, debe estar en ejecución. Yo tengo en mi PC un programa de nombre ProcessExplorer, que me da una información bastante detallada de todas las aplicaciones que están corriendo en cada momento. El mismo no requiere de instalación, lo que lo hace más portátil todavía. Pero aún así, el que tenga cualquier otro, se dará cuenta que en hay un programa de nombre ctfmgr.exe que no presenta ninguna descripción, no muestra el nombre de la compañía por el cual fue creado ni nada. Simplemente lo que se debe hacer es terminar dicha aplicación y todo su árbol de procesos. Pero esto no para aquí. Aunque el archivo esté en la máquina, en algún momento debe ser cargado, y la forma más estándar de ejecutar aplicaciones al inicio de sesión es usando el Registro. Para eliminarlo del registro, debemos ir a la clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Y eliminar el valor ctfmgr, cuya direccion de carga es c:\windows\ctfmgr.exe

Igualmente, podría hacerse al abrir msconfig desde la ventana Ejecutar en el menú Inicio, luego ir hasta la pestaña Inicio, y allí desmarcar la casilla que haga referencia al archivo citado con anterioridad. Aunque quitándolo del Registro, desaparece automáticamente.

Aclaro que esto, aunque funciona, no es el método más apropiado para desinfectar la PC, ya que una persona inexperta, trabajando en el Registro de Windows, podría introducir el delicado dedito en la tecla DELETE luego de haber hecho clic en una clave importante, y si por casualidad alguien presiona el ENTER del teclado numérico, a continuación...

Esto es más bien una solución temporal hasta que Segurmática (que es la empresa que se encarga de darle tratamiento y solución a los virus que afectan al país) saque en una de sus actualizaciones alguna solución.

Para saber más...

Continuar leyendo

Buffer Overflow: hackeando la pila (I)

Eliux [aorozco@infomed.sld.cu]

Stack Overflow, Buffer Overflow o "romper la pila" es una de las técnicas más usadas por los hackers profesionales en la fabricación de spam, bugs, odays, exploits, intrusiones a sistemas, etc. Un código, cuando rompe la pila, puede saltar a una zona cualquiera de memoria y/o ejecutar un código maligno que produzca un efecto indeseado en la máquina y viole la seguridad del sistema. Es una de las técnicas -sino la más poderosa- que tiene un hacker contemporáneo…

Notas del autor:
En los tiempos en los que incursioné en el Underworld como un newbie, me prometí que sería un hacker y que haría esas cosas que suelen hacer los hackers en las películas y uno no tiene ni idea de cómo lo hacen. Y la verdad es que hackers como Kevin Mitnick no llegaron a ser grandes descargando programas de una página Web, sino estudiando y programando sus propios códigos, usando sus propias técnicas. Si fuéramos a hablar de técnicas como de poderes de un mago, hoy les daré un indicio de cómo funciona mi poder favorito de mis tiempos de aprendiz de brujo, les hablo del Buffer Overflow.

Para entender bien este texto es necesario que conozcan algo de C y ensamblador, así como del funcionamiento interno de la pila. Durante el transcurso del texto seré tan breve como práctico. Este escrito es sólo una introducción al Buffer Overflow, no constituye un soporte clave para el domino del mismo. Este artículo fue creado con fines educativos; el autor no se hacer responsable del mal uso del contenido del mismo.

Introducción:

Si buscamos en Internet información sobre los Buffer Overflow, encontraremos un número elevado de vulnerabilidades que lo han usado. Ejemplo de ello son: syslog, sendmail, y los exploits.

El lector debe saber que el buffer no es más que un bloque contiguo de memoria de computadora que mantiene varias instancias del mismo tipo de datos, también conocido en el mundo de la programación como listas secuenciales, matrices o arrays. Los arrays, como todas las variables, pueden ser declarados tanto estáticos como dinámicos. Las variables estáticas son asignadas a la pila en tiempo de ejecución.

Overflow es inundar, machacar o sobrepasar el límite de algo. Por lo que Buffer Overflow se puede interpretar como el desborde o la superposición de códigos/datos en memoria, que se produce cuando se llena un segmento continuo de memoria con más elementos del requerido, provocando así la sobrescritura de códigos/datos ajenos a los permitidos en el proceso.

En este escrito nos centraremos más en el Stack Overflow o desbordamiento de pila, que de seguro es un término bastante conocido u oído por ustedes; pero lo que no saben es que éste puede producir más efectos colaterales que el sólo hecho de sobrescribir código.

Hagamos un análisis simple y general de cómo funciona la memoria en la PC.

Organización de la memoria:

Para entender cómo funcionan los Stack Overflow deberemos entender primero cómo es organizado un proceso en memoria. Los procesos son divididos en tres regiones: TEXT, DATA, y STACK. Nos centraremos en región de STACK o más conocida como pila. Pero no seamos perezosos, primero veamos una pequeña vista de las otras regiones.

TEXT:
La región TEXT es ajustada por el programa e incluye código (instrucciones). Esta región corresponde a la sección TEXT del archivo ejecutable. Cualquier intento de escribir en ella resulta una violación de segmentación, ya que sus datos son declarados sólo-lectura; algo así como protegidos por el sistema.

DATA:
La región contiene datos inicializados y sin inicializar. Las variables estáticas (static: su valor perdura durante la ejecución de todo el programa) son guardadas aquí. La región DATA corresponde a la sección data-bss de los ejecutables. Su tamaño es agrandable con la instrucción de código C: system call brk(2) y, si el crecimiento de éste o del STACK agota la memoria disponible, el proceso es repaginado para ejecutarse otra vez, pero con un espacio de memoria mayor (como se muestra en la figura). Quiere decir que esta vez hay más memoria entre los segmentos DATA y STACK para que éstos puedan seguir creciendo (El segmento DATA crece hacia abajo y el STACK hacia arriba).

STACK:
Una pila o STACK no es más que una array que tiene como propiedad principal que sus elementos se insertan del modo LIFO, que significa que el primer elemento que entra será el último en salir. Es algo que desde el punto de vista lógico usamos diariamente para colocar elementos uno encima del otro y llamamos pila.

¿Para qué se usan las pilas en los programas?

La técnica más empleada por los lenguajes de alto nivel de la actualidad es la función o procedimiento. Desde el punto de vista interno de un programa, una llamada a una función (procedure call), altera el flujo de control tal como un jump (salto) lo hace; pero a diferencia de éste, la función retorna el control a la posición siguiente desde donde fue llamado, conservando los valores de los registros de la máquina (AX, BX, ZF, etc.)

Este cambio sólo es perceptible cuando se trabaja a bajo nivel -o sea, en ensamblador-, donde cuando se hace un salto a una función primero se hace PUSH a los registros y estos se guardan en la pila y se recobran cuando se sale del procedimiento, y éste antes de salir hace POP. Además de registros en la programación de alto nivel, el STACK es usado en tiempo de ejecución para pasar parámetros a las funciones y devolver valores.

La región STACK:

Como ya dijimos, un STACK es, entre otras cosas, un bloque contiguo de memoria conteniendo datos. Existe un registro llamado STACK POINTER (puntero de pila) cuyo nombre clave es SP, que apunta al tope del STACK. El fondo de la pila está en una dirección ajustada a su tamaño, es ajustado dinámicamente por el Sistema Operativo en tiempo de ejecución, cuando la CPU implementa instrucciones para hacer PUSH (introducir) y POP (sacar) al STACK.

El STACK consiste en frames lógicos de STACK (cuadros), que son "pusheados" cuando se llama a una función y "popeados" cuando se sale de ésta. Un STACK FRAME contiene los parámetros para una función, sus variables locales y los datos necesarios para recuperar el STACK FRAME previo, incluyendo el valor del puntero de instrucción (IP: apunta a la zona de memoria donde está la instrucción a ejecutar por el microprocesador) que permite ubicarnos en la posición siguiente a la llamada (IP+1).

Dependiendo de la implementación, el STACK podrá decrecer (detrás de las direcciones más altas de memoria) o crecer. En nuestros ejemplos usaremos un STACK que decrece, ya que suponemos que estamos trabajando con un procesador Intel Pentium y así es cómo procede la pila en este, así como en otros como SPARC, MIPS y MOTOROLA.

El STACK POINTER (SP) puede apuntar a cualquier zona de la pila, e incluso a la siguiente dirección libre después de ésta. Durante el texto tomaremos como punto de referencia un SP que apunta a la última dirección del STACK (donde está el inicio de la pila).

Además del SP, necesitaremos un FRAME POINTER (FP), o puntero de cuadro, que como su nombre lo indica, permite a partir de él, acceder a un frame que contenga un elemento "pusheado" (parámetros y variables locales de la función), mediante un desplazamiento. Es por ello que es llamado en algunas referencias bibliográficas como LOCAL BASE POINTER (LB) o puntero base local. Su importancia radica en que  las variables locales pueden ser referenciadas mediante sus offsets, ya que sus distancias a FP no cambian con POPs y PUSHs. Muchos de ustedes que conoce del lenguaje de ensamblador de los procesadores Intel x86 pensarán: ¿dónde está ese registro FP, que yo no lo conozco? Pues no lo busquen, puesto que aquí FP es un registro que usaremos para hacer referencia a su funcionamiento; podríamos llamarlo un registro lógico, por lo que para almacenar su valor, entre otras cosas, usaremos otro registro que sí existe y es muy usado en el mundo del ensamblador, un registro auxiliar  para referenciar a datos en memoria, como son variables, arreglos y parámetros, muy similar a un puntero común de C. Me refiero al BASE POINTER (BP). Este puntero se usará principalmente para acceder a las variables locales y procedimientos porque, a diferencia del SP, sus offsets no varían con respecto a él con PUSHs y POPs.

La primera cosa que hace la máquina cuando se  llama a un procedimiento es guardar el FP (muchas veces como en los ejemplos que usaremos usan el BP) previo, ¡piensa por qué! Pues para ser restaurado a la salida del procedimiento. Luego copia el actual SP hacia el BP (haciéndolo el nuevo puntero FP) para apuntar a las variables locales de la función, detrás de el quedaría el SP guardado y los parámetros de la función. Luego se asigna espacio para las variables locales restando a SP el tamaño total de las variables. A la salida del procedimiento, el STACK debe poder recuperar su FP guardado y las variables locales de la función ya no estarán en él.

Muchos de estos registros, en vez de registros, los verán escritos con una e delante (ej: ebp, esp, etc.) porque sin la e se refieren más bien a las versiones de 16 bits de los procesadores, y la e se refiere a registros de 32 bits.

Continuar leyendo