Ingeniería Inversa en Linux

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Ingeniería Inversa en Linux"

Transcripción

1 Índice: 1. Introducción. 2. Qué es la ingeniería inversa. 3. La no distribución del código fuente 4. Para qué se utiliza. 5. Utilidades. 6. El formato ELF. 7. Desarrollo de la Ingeniería Inversa. 8. Ingeniería inversa en un ejemplo real. 9. Conclusiones. 10. Referencias. 11. Información de contacto. Ingeniería Inversa en Linux Diego Bauche Madero Mayo Introducción Este documento pretende que el lector se inicie y aprenda de forma rápida y precisa el arte de la ingeniería inversa sobre Linux. El documento no pretende ser muy grande. Tratare de explicar paso por paso cómo un experto en la ingeniería inversa puede lograr convertir y entender el funcionamiento de un ejecutable de Linux (Un ejecutable ELF) para distintos beneficios. Para leer este documento es necesario que el lector tenga amplios conocimientos en la programación sobe ensamblador en Intel a 32 bits, conocimientos sobre la programación en C, así como que tenga experiencia depurando y programando aplicaciones y que sepa manejar el sistema operativo Linux. 2. Que es la ingeniería inversa La ingeniería inversa (o de reversa) es el arte de poder entender como funciona un ejecutable o un objeto para así poder revertirlo, duplicarlo o mejorarlo. La practica de la ingeniería inversa se utiliza desde hace ya mucho tiempo en empresas con muchos fines, un ejemplo claro podría ser cuando una empresa distribuidora de un software, compra el producto de una empresa rival, con el fin de poder entender la funcionalidad e implementarla en su solución, un ejemplo mucho mas claro pasa con las empresas automotrices, las cuales suelen comprar algún automóvil de la competencia con el fin de explorarlo, analizarlo, desensamblarlo y poder crear algo mejor. En términos técnicos, la ingeniería inversa quiere decir convertir el código máquina de vuelta a un lenguaje legible, por ejemplo, convertir calc.exe a calc.c o calc.cpp. 3. La no distribución de el código fuente El código fuente de los programas muchas veces (Sino es que la mayoría) no suele ser distribuido en

2 conjunto ni por separado con un programa, existen muchísimas razones por las cuales esto no sucede, las mas claras y las mas dadas son, por ejemplo: 1. El código fuente es intelecto del programador, y quiere protegerlo. 2. La publicación del código fuente seria de gran riesgo para una empresa la cual compite con otros programas. 3. Evadir la redistribución de el programa con otro con otro nombre como autor. 4. Dificultar mucho la búsqueda de vulnerabilidades dentro de la aplicación. 5. La penetración de servidores (Hacking) puede ser de muy alto riesgo, por lo tal muchos programadores suelen usar técnicas anti forenses para dificultar el rastreo del intruso. 6. No permitir la mas mínima modificación a la aplicación. 7. Evadir la distribución de variaciones de la aplicación, lo cual representaría muchos problemas. 4. Para que se utiliza la ingeniería inversa La ingeniería inversa es comúnmente usada para contrarrestar cualquiera de los propósitos de la no distribución de código fuente dado en la tabla anterior, así como para descubrir código malicioso dentro de un programa, saber como actúa para beneficio del usuario, etc. Por ejemplo, un usuario recibe una aplicación llamada Navidad.exe por medio de MSN Messenger, el usuario, teniendo habilidades y experiencia en el área de la Informática y sabiendo aplicar la ingeniería inversa, no confía mucho en esta aplicación por lo cual utiliza la ingeniería inversa como método para tratar de buscar algún acto malicioso que el programa realice, el usuario identifica el programa Navidad.exe como un Gusano que acaba de ser lanzado por lo cual su Antivirus no pudo identificarlo, decide no correrlo, y lo reporta. Para dar un ejemplo de Linux y no solo de Windows (Siguiendo la temática del documento), un caso común de Linux es cuando sospechas de algún binario porque el MD5 no concuerda. 5. Utilidades Hasta este momento, el lector ya sabe qué es la ingeniería inversa, el porque es necesaria y casos prácticos en los cuales puede ser utilizada, pero... Como se desarrolla esta técnica?, Existen distintos tipos de practicas para aplicarla, por lo tanto existen distintas técnicas y distintas utilidades, pero lo que nunca puede faltar en la mano para hacer ingeniería inversa en Linux son: strings: Un programa que te imprime en pantalla todas las partes del programa las cuales contienen cadenas de caracteres legibles, como se muestra en el ejemplo de la siguiente imagen:

3 Como se puede apreciar, lo que nosotros hicimos fue crear un archivo llamado foo.c el cual es un código fuente en C, y después de la compilación, pudimos apreciar que con el comando strings podemos ver las cadenas de caracteres de los objetos de los cuales el programa depende (/lib/ld linux.so.2, libc.so.6), así como los símbolos (printf), después alguna otra información, seguida por Esto es un puntero a este texto y Hola mundo. Strings generalmente viene incluida en todos las distribuciones Linux. en el paquete binutils. objdump: Esta aplicación es sumamente importante, ya que nos ayudara a desensamblar el código y nos dará información sobre el encabezado del objeto. Objdump generalmente viene incluida en todas las distribuciones Linux. En el paquete binutils. gdb: Es un depurador de aplicaciones, con el cual podremos seguir el flujo del objeto y modificarlo, así como desensamblarlo y averiguar información importante sobre el. Al igual que strings y objdump, gdb viene incluido en la mayoría de las distribuciones Linux, en el paquete gdb. DataRescue IDA Pro: El mejor desensamblador que conozco, puede desensamblar binarios ELF, PE, COFF, a.out, etc. Pero lo que lo hace tan buena herramienta es que te ayuda a entender claramente el flujo de una aplicación y te facilita la lectura de las instrucciones, así como genera gráficos, Etc. Desafortunadamente, IDA Pro no es un programa libre ni mucho menos gratuito, sin embargo, lo estaré utilizando en gran parte del proceso de este texto, así que recomendaría que el lector consiguiera una copia. IDA Funciona sobre Linux y Sobre Windows (a partir de la versión 4.7 salio un porte para Linux). Existe una copia de IDA Pro que es Freeware, pero en lo personal no la he probado, aunque posiblemente les servirá a las personas las cuales no puedan conseguir una copia de IDA Pro comercial (El enlace se encuentra en Referencias) 6. El formato ELF No pienso dar una explicación amplia sobre como funciona este tipo de formato binario, lo voy a resumir un

4 poco tratando de explicar claramente como funciona. ELF (Executable and Linking Format) es el formato binario por defecto de Linux. El mismo nombre nos da a entender que no es solo el formato de los binarios ejecutables, sino que es el mismo formato para objetos y objetos compartidos que después se enlazan a un ejecutable, podríamos llamar a estos módulos (esto quiere decir que así como ELF es el formato de /bin/ls, también es el formato de /usr/lib/libc.so, / usr/src/linux/kernel/kernel.o, Etc.). Para saber si nuestro binario es ELF, basta con reconocer los primeros 4 bytes de su encabezado, o usar la aplicación 'file' que viene incluida generalmente en cualquier Linux, la cual nos dirá aun mas información sobre el objeto: $ file /bin/ls /bin/ls: ELF 32 bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped $ Como podemos apreciar en las lineas anteriores, utilice la aplicación 'file' sobre el binario /bin/ls, y el resultado me dice que la aplicación es una aplicación de tipo ELF, de 32 bits, es ejecutable, su arquitectura es Intel x86, para GNU/Linux, y esta enlazada dinámicamente, esta 'strippeada', que quiere decir que se uso la utilería 'strip', la cual remueve la sección.sym (Los símbolos) de la aplicación. El formato ELF se divide Generalmente (en el orden presentado) en 5 áreas (Las estructuras se localizan en elf.h): 1. Cabecera o Header, el cual es el que contiene toda la información del formato dentro de una estructura de tipo Elf32_Ehdr, como cual es la primera dirección a ejecutarse (Entry point), si es de 32 o 64 bits, si es un core, un archivo compartido (Shared object), ejecutable o reubicable (Relocatable), cuanto mide, Etc. 2. Program Header Table, Son varias estructuras Elf32_Phdr las cuales describen cada una la información de un segmento (Un segmento contiene una o mas secciones), la cual es información que el cargador de ejecutables y los shared objects necesitan para poder reservar memoria para ellos, y otras cosas. 3. Segmentos (.data,.text), Los segmentos son rangos de memoria física que contienen secciones especificas de la aplicación, utilizando arreglos de estructuras Elf32_Shdr. 4. Section Header Table, la cual es opcional para un ejecutable, ya que solo contiene una tabla de secciones que no están asociadas con un segmento, como.debug (La cual contiene información para depuración),.sym (La cual contiene los símbolos), Etc. 5. Otras secciones, no asociadas con los segmentos.text,.data, Etc. Creo que esto es todo lo que necesitamos saber para poder introducirnos en lo básico de la ingeniería inversa de binarios ELF. El formato ELF es importante y es de mucha utilidad saber cómo funciona, ya que contiene la información esencial de nuestra aplicación, si estas interesado en leer la documentación amplia sobre este formato, en la sección de Referencias se encuentra la documentación oficial de ELF.

5 7. Desarrollo de la Ingeniería Inversa Para poder documentar como se desarrolla la ingeniería inversa, lo primero que vamos a hacer va a ser un programa chico y básico: #include <stdio.h> #include <stdlib.h> [1] void copia(char *dst, const char *src, short len); [2] int main(int argc, char **argv) { [3] char buf[1024]; [4] if(argc!= 2) { [5] printf("se espera un argumento\n"); [6] return 2; [7] copia(&buf[0],argv[1],sizeof(buf) 1); [8] printf("los datos copiados son: %s\n", buf); [9] return 0; [10] void copia(char *dst, const char *src, short len) { [11] for(;len;len ) [12] *dst++=*src++; Este programa lo único que hace es, verificar que los argumentos no sean diferentes a dos (Que exista un argumento), sino sale diciendo Se espera un argumento, si si hay un argumento, llama a la función copia (), la cual simplemente copia una cadena a la otra (src a dst) len bytes, escribe Los datos copiados son: <datos copiados>, y sale con suceso. Si lo analizamos en pasos: [1] y [2] declaran las funciones copia() y main(), en este momento la que nos interesa es main, y por lo que podemos ver, es declaración entera y utiliza 'argc' y 'argv'. [3] declara una cadena de datos de 1024 bytes de tipo 'char', la cual se llama buffer. [4] compara el argumento argc (la cuenta de cuantos argumentos se le pasaron a la aplicación), si no es 2 (si no existe un argumento), la linea [5] se ejecuta y retorna como se puede ver en [6]. [7] es la llamada a la función copia(), y como vimos ya en [1], copia recibe tres argumentos: dst, src y len. [8] y [9] Son las ultimas lineas del programa, las cuales simplemente despliegan el resultado de lo que hizo [7] en pantalla, y retorna la aplicación.

6 [10] es simplemente la declaración de la función copia(), por lo tanto las lineas siguientes son parte de esta función. [11] y [12] lo que hacen básicamente es copiar byte por byte la cadena 'src' a 'dst' len veces. Ahora que entendemos perfectamente como funciona el programa, podemos empezar a analizarlo. Después de compilarlo como ejemplo1, voy a desensamblarlo y voy a intentar explicar la información del código. Como yo se que el binario no paso por strip, por lo tanto se que contiene los símbolos, y que las funciones que me interesan son <main> y <copia>, empezando por main. Ejecuto objdump para que me muestre el código desensamblado de la sección.text el cual se va a mostrar en sintaxis Intel: (Nota: Yo prefiero utilizar la sintaxis Intel en lugar de AT&T, y así la utilizare en todo el proceso) $ objdump dissasembler options=intel D section.text./ejemplo <main>: : 55 push ebp : 89 e5 mov ebp,esp : 81 ec sub esp,0x d: 83 e4 f0 and esp,0xfffffff : b mov eax,0x : 29 c4 sub esp,eax : 83 7d cmp DWORD PTR [ebp+8],0x b: je <main+0x31>... Este es el formato que objdump nos tira, algo ofuscado y difícil de leer, por esta misma razón, cada que utilice un desensamblador utilizare IDA Pro, ya que es mucho mas claro: ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; Attributes: bp based frame public main main proc near ; DATA XREF: _start+17^xo var_428 = dword ptr 428h var_424 = dword ptr 424h var_420 = dword ptr 420h var_40c = dword ptr 40Ch var_408 = dword ptr 408h arg_0 = dword ptr 8 arg_4 = dword ptr 0Ch push ebp mov ebp, esp sub esp, 428h and esp, 0FFFFFFF0h mov eax, 0 sub esp, eax cmp [ebp+arg_0], 2 jz short loc_

7 mov [esp+428h+var_428], offset aseesperaunargu ; "Se espera un argumento\n" call _printf mov [ebp+var_40c], 2 jmp short loc_80483d7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_ : ; CODE XREF: main+17^xj mov [esp+428h+var_420], 3FFh mov eax, [ebp+arg_4] add eax, 4 mov eax, [eax] mov [esp+428h+var_424], eax lea eax, [ebp+var_408] mov [esp+428h+var_428], eax call copia lea eax, [ebp+var_408] mov [esp+428h+var_424], eax mov [esp+428h+var_428], offset alosdatoscopiad ; "Los datos copiados son: %s\n" call _printf mov [ebp+var_40c], 0 loc_80483d7: ; CODE XREF: main+2f^xj mov eax, [ebp+var_40c] leave retn main endp ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; Attributes: bp based frame public copia copia proc near ; CODE XREF: main+4e^xp var_2 = word ptr 2 arg_0 = dword ptr 8 arg_4 = dword ptr 0Ch arg_8 = dword ptr 10h push ebp mov ebp, esp sub esp, 4 mov eax, [ebp+arg_8] mov [ebp+var_2], ax loc_80483ec: ; CODE XREF: copia+34^yj cmp [ebp+var_2], 0 jnz short loc_80483f5 jmp short locret_ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_80483f5: mov mov ; CODE XREF: copia+12^xj eax, [ebp+arg_0] edx, eax

8 mov eax, [ebp+arg_4] movzx eax, byte ptr [eax] mov [edx], al lea eax, [ebp+arg_4] inc dword ptr [eax] inc [ebp+arg_0] movzx eax, [ebp+var_2] dec eax mov [ebp+var_2], ax jmp short loc_80483ec ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ locret_ : leave retn copia endp ; CODE XREF: copia+14^xj Como se ve en el ejemplo anterior, el formato que nos tira IDA Pro es mucho mas claro, después de 4 o 5 minutos de leer el código, puedo convertirlo a C fácilmente, este es un programa de prueba, así que eso explica porque solo tarde unos cuantos minutos, sin embargo, en programas grandes esto puede durar días y semanas enteras. Después de hacer un análisis y comentar el código, pude realizar una conversión directa (Pude invertirlo a su código original): #include <stdio.h> void copia(char *arg1, char *arg2, short arg3); int main(int argc, char *argv[]) { char buffer[1024]; if(argc!= 2) { printf("se espera un argumento\n"); return 2; copia(&buffer[0],argv[1],1023); printf("los datos copiados son: %s\n",buffer); return 0; void copia(char *arg1, char *arg2, short arg3) { short len = arg3; char *edx, *eax; for(;len!=0;len ) { edx = arg1; eax = arg2;

9 *edx = *eax; arg2++; arg1++; eax = (char *)&len; eax ; Posiblemente, o mejor dicho, obviamente, el lector en estos momentos estará pensando Bueno, si, convertiste el código y hace exactamente lo mismo que el original, pero el código original tu ya lo poseías, por lo tanto solo generaste una nueva solución, Esto es incorrecto, no se si haya influido o no que yo supiera como este código estaba hecho ya desde un principio, pero la conversión generada no fue basada en ninguna nueva solución en lo absoluto, sino que a partir del código en ensamblador, logre hacer la conversión a C. Pero, cual fue el proceso que seguí?, como pude lograr tal hecho?, es solo cosa de analizar la parte importante de nuestro código y comentarla. IDA Pro tiene la opción de cambiar el nombre de las variables para poder hacer una mejor lectura, así como puedes cambiar el nombre de las funciones y comentar cada instrucción, en este caso no voy a cambiar ningún nombre de variable, funciones o etiquetas. Vamos a comentar parte por parte del código desensamblado: main: [0] var_428 = dword ptr 428h [0] var_424 = dword ptr 424h [0] var_420 = dword ptr 420h [0] var_40c = dword ptr 40Ch [0] var_408 = dword ptr 408h [0] arg_0 = dword ptr 8 [0] arg_4 = dword ptr 0Ch [1] push ebp [2] mov ebp, esp [3] sub esp, 428h [4] and esp, 0FFFFFFF0h [5] mov eax, 0 [6] sub esp, eax [7] cmp [ebp+arg_0], 2 [8] jz short loc_ [9] mov [esp+428h+var_428], offset aseesperaunargu ; "Se espera un argumento\n" [10] call _printf [11] mov [ebp+var_40c], 2 [12] jmp short loc_80483d7

10 [0] es la forma en la que IDA Pro, a partir de su algoritmo, genera variables para facilitar a lectura del código, como podemos apreciar tiene 2 argumentos, arg_0 y arg_4, por lo tanto deducimos main(int argc, char **argv) {. [1] a la [6], no es código realmente importante, solo esta consiguiendo todo el espacio suficiente para las variables dentro del stack. [7], podemos apreciar que compara [ebp+arg0] (o sea, [ebp + 8] = argc) con 2, podemos transformar este código a un if(argc == 2). [8], adentro del if(argc == 2), salta a la etiqueta loc_ , con esto sabemos que la [7] y la [8] son if(argc == 2) goto loc_ ;. [9], mueve a la variable var_428 (Si vemos que el valor de la variable var_428 es 428h, entonces la operación de [esp+428h+var_428h] es (esp + 0x x428) la dirección donde se encuentra la cadena ' Se espera un argumento\n '. [10], llama a printf, el argumento que printf toma es a donde apunta [esp+428h+var_428], por lo tanto, podemos deducir que la linea [9] y la linea [10] finalizan siendo 'printf( Se espera un argumento\n ); '. [11] y [12] son irrelevantes, claramente se aprecia que lo que hacen es mover el valor entero '2' a var_40c, y llamar a la etiqueta loc_80483d7, que simplemente termina el control del programa, por lo cual deducimos que es return 2;, también deduciendo que la función main() es de tipo 'int'. Así finaliza parte de nuestro análisis de la función <main>, con lo cual la revertimos a código C, quedando así: int main(int argc, char **argv) { if(argc == 2) { goto loc_804395; printf( Se espera un argumento\n ); return 2; La segunda parte del análisis va enfocada a desensamblar la etiqueta loc_804395: loc_ : [1] mov [esp+428h+var_420], 3FFh [2] mov eax, [ebp+arg_4] [3] add eax, 4 [4] mov eax, [eax] [5] mov [esp+428h+var_424], eax [6] lea eax, [ebp+var_408]

11 [7] mov [esp+428h+var_428], eax [8] call copia [9] lea eax, [ebp+var_408] [10] mov [esp+428h+var_424], eax [11] mov [esp+428h+var_428], offset alosdatoscopiad ; "Los datos copiados son: %s\n" [12] call _printf [13] mov [ebp+var_40c], 0 loc_80483d7: [14] mov eax, [ebp+var_40c] [15] leave [16] retn [1] Se mueve 0x33F (0x33F = 1023) a la variable var_420. [2] Se mueve argv a eax. [3] Se suma 4 a eax. Como saben ya, *argv es argv[0], argv siendo un doble puntero, mide 4 bytes, por lo tanto, sumar 4 a eax es hacer que eax apunte a *argv + 4, que es argv[1]. [4] Se mueve el valor de la dirección de eax a eax, que quiere decir esto?, básicamente eax = *eax. [5] Se mueve a la variable var_424 lo que vale eax. (int)var_424 = (int)eax. [6] Se carga en eax la dirección de var_408. eax = (char *)&var_408. [7] Se mueve a var_428 el valor de eax. (long)var_428 = (long)eax [8] Se llama a copia(), como podemos apreciar aquí, lo que contiene var_428 es la dirección de var_408. var_408 es una arreglo de 0x408 bytes (0x408 = 1032), que haría que, menos 8 bytes de alineamiento del compilador, var_408 equivalga a algo similar a char buffer[1024];. Por lo tanto, siendo var_428 la dirección de buffer (&buffer[0]), var_424 apuntando a argv[1], y argv_420 valiendo 1023, se pueda deducir que esta rutina es igual a copia(&buffer[0],argv[1], 1023);. [9] Se carga en eax la dirección de var_408 (buffer). eax = &buffer[0] [10] se carga a arg_424 el valor eax. (long)arg_424 = (long)eax [11] se carga a arg_428 el valor de la dirección donde se encuentra Los datos copiados son: % s\n. [12] se llama a printf, por lo tanto, podemos deducir que de la linea [9] a la linea [12] convertido a C significaría printf( Los datos copiados son: %s\n,buffer); [13] mueve a var_40c el entero 0. [14], [15] y [16] retornan el control, por lo tanto podemos deducir que [13], [14] y [15] son return 0; Después de tanta explicación, finalmente pudimos conseguir el código completo de main(): int main(int argc, char **argv) { if(argc == 2) { goto loc_804395;

12 printf( Se espera un argumento\n ); return 2; loc_804395: copia(&buffer[0],argv[1],1023); printf( Los datos copiados son: %s\n,buffer); return 0; copia() {... Bueno, la siguiente función ( copia() ) la vamos a desensamblar también: [1] var_2 = word ptr 2 [2] arg_0 = dword ptr 8 [2] arg_4 = dword ptr 0Ch [2] arg_8 = dword ptr 10h push ebp mov ebp, esp sub esp, 4 [3] mov eax, [ebp+arg_8] [4] mov [ebp+var_2], ax loc_80483ec: ; CODE XREF: copia+34j [5] cmp [ebp+var_2], 0 [6] jnz short loc_80483f5 [7] jmp short locret_ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_80483f5: ; CODE XREF: copia+12j [8] mov eax, [ebp+arg_0] [9] mov edx, eax [10] mov eax, [ebp+arg_4] [11] movzx eax, byte ptr [eax] [12] mov [edx], al [13] lea eax, [ebp+arg_4] [14] inc dword ptr [eax] [15] inc [ebp+arg_0] [16] movzx eax, [ebp+var_2] [17] dec eax [18] mov [ebp+var_2], ax

13 [19] jmp short loc_80483ec ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ [20] locret_ : ; CODE XREF: copia+14j [21] leave [22] retn copia endp [1], como podemos ver, var_2 es una WORD (o sea, una variable de 2 bytes, por lo tanto podemos deducir que es de tipo 'short'). [2], Aquí podemos ver que tiene tres argumentos, arg_0, arg_4 y arg_8, por lo tanto el programa esta declarado con 3 argumentos. [3] y [4], Aquí apreciamos que lo que esta haciendo es mover el valor de arg_8 a eax, y de (short)eax a var_2 ((short)eax == ax), como dijimos en [1], var_2 es una WORD, por lo tanto podemos deducir que el arg_8 (siendo el tercer argumento) es short arg_8;. [5], [6] y [7], estas lineas hacen una comparación de 0 con var_2 (var_2 como ya lo vimos contiene el valor del argumento 3), si la comparación no se cumple, salta a loc_80483f5; Si sí se cumple, salta a locret_ , Como podemos ver, el nombre de esta ultima función es locret_..., cuando generalmente es loc_, que quiere decir esto?, IDA Pro detecta si la parte donde se encuentra esta función es solo un return, y si sí, declara el nombre de la función así, por lo tanto hasta aquí podemos deducir que estas lineas podrían ser if(var_2 == 0) { goto loc_80483f5; else { goto locret_ ; [8] y [9], aquí vemos como mueve a edx el valor de arg_0 (o sea, del segundo argumento), con lo cual podríamos decir eax = arg_0; edx = eax; [10], aquí podemos ver como mueve el valor de arg_4 (del segundo argumento) a eax, eax = arg_4. [11], aquí vemos como mueve a eax el primer byte de la dirección de eax, que podría ser, eax = *eax; [12], se mueve *eax (que es al obviamente) a *edx, (recordemos que edx apunta a arg_0) o sea que es algo como *edx = (char)eax;. [13], [14] y [15], se carga en eax la dirección de el segundo argumento, y después se incrementa eax, después se incrementa el primer argumento, que seria eax = arg_4; eax++; arg_0++; [16], [17] y [18], se mueve a eax la el valor de var_2, se decrementa eax y se mueve el valor de eax a var_2, seria (short)eax = var_2; eax ; var_2 = (short)eax; [19], salta a loc_80483ec (que es [5]), por lo cual deducimos que desde [5] hasta [19], son un loop, y por esta misma razón descubrimos que if(var_2 == 0) { goto loc_80483f5; else { goto locret_ ; de [5], [6] y [7] realmente seria for(; var_2!= 0; var2 ) { [20], [21] y [22] finalmente aquí podemos ver que no se regresa ningún valor cuando el for acaba, por lo tanto deducimos que copia() es del tipo 'void'. Después de convertir todo esto, y después de cambiar algunas cosas las cuales no son validas en C, podemos finalmente convertir el programa completo con éxito, el cual quedaría así: void copia(char *arg_0, char *arg_4, short arg_8) { short var_2 = arg_8;

14 char *eax, char *edx; for(; var_2!= 0;) { eax = arg_0; edx = eax; eax = arg_4; *edx = *eax; arg_4++; arg_0++; (short *)eax = (short)var_2; eax ; var_2 = (short)eax; return; int main(int argc, char **argv) { if(argc == 2) { goto loc_804395; printf( Se espera un argumento\n ); return 2; loc_804395: copia(&buffer[0],argv[1],1023); printf( Los datos copiados son: %s\n,buffer); return 0; Como se puede apreciar, lo que este código hace es lo que hace el mismo código original, para hacer la prueba, compilamos este código como prueba1_rev2.c y lo probamos: $!gcc gcc o prueba1_rev2 prueba1_rev2.c prueba1_rev2.c: In function `copia': prueba1_rev2.c:14: warning: cast from pointer to integer of different size $./prueba1_rev2 aaaa Los datos copiados son: aaaa $ Como se ve, es exactamente lo mismo. Después de saber muy bien como funciona, podemos simplificar el código y hacerlo mas entendible, hasta el punto de llegar al código original, pero sin poder conseguir los nombres de variables, hasta quedar asi:

15 void copia(char *arg_0, char *arg_4, short arg_8) { for(; arg_8!= 0;arg_8 ) { *arg_0++ = *arg_4++; return; int main(int argc, char **argv) { char buffer[1024]; if(argc!= 2) { printf("se espera un argumento\n"); return 2; copia(&buffer[0],argv[1],1023); printf("los datos copiados son: %s\n",buffer); return 0; Y, como se ve en este ultimo código, es exactamente lo mismo que el original, eso quiere decir que hemos podido revertir el código completamente. 8. Ingeniería Inversa en un ejemplo real. Para el ejemplo real, se escoge una aplicación sin código fuente. Lo primero que se me vino a la cabeza fue packetstorm, ya que a veces ahí publican cosas como exploits sin código fuente, entonces, abrí mi navegador y fui a Ahí, encontré un binario que se llamaba , el cual, por deducción (Creo que ya todos sabemos que si empieza con 7350, generalmente es un exploit del grupo TESO) supe que era supuestamente un exploit, lo primero que hago es obviamente bajarlo $ wget 16:28:19 (7.37 KB/s) ` ' saved [41948/41948] $ Como en lo personal no confío mucho en la fuente (packetstorm), tampoco si es solo binario sin código fuente ni mucho menos si se encuentra en una carpeta llamada removed, verifico la información del binario para verificar si es anormal:

16 $ chmod x $./elf_ep_check v ELF Size: bytes Entry Point: 0x0804bf2d.text address: 0x08048fd0 Alert: Entry point is modified, possible ELF modification (Virus, backdoor,trojan, binary compression?) $ Como podemos ver aquí, lo que hice fue correr la aplicación elf_ep_check (codigo bastante simple el cual pueden encontrar en que lo que hace es conseguir la dirección de.text (Que es donde generalmente debe empezar una aplicación, o sea que el entry point debe apuntar a ahí), y como podemos ver, el entry point apunta a 0x0804bf2d. Parece ser que el binario esta modificado, vamos a checar en que segmento se encuentra 0x0804bf2d para poder ver que contiene, para esto vamos a utilizar objdump: $ objdump h./ / : file format elf32 i386 Sections: Idx Name Size VMA LMA File off Algn fini e 0804b44c 0804b44c c 2**2 14.rodata 00000aad 0804b b **5... $ Aquí lo que hice fue usar la opción ' h' de objdump la cual saca información sobre las secciones de los segmentos, y como podemos ver, las únicas dos secciones las cuales empiezan de un numero 0x0804bXXX son.fini y.rodata, sin embargo, el segmento mas cercano es.rodata (El nombre nos hace entender que.rodata significa Read Only data ), por lo cual medimos el tamaño de este segmento buscando si se encuentra ahí nuestra dirección a la cual apunta entry point (0x0804bf2d). Lo que vamos a hacer va a ser sumar VMA (Que es la dirección virtual del segmento) con Size, lo cual nos dará el resultado de la ultima dirección en la cual acaba el segmento.rodata, y asi podremos saber con exactitud si 0x0804bf2d se encuentra dentro (VMA + Size): $ gdb q (gdb) p/x 0x0804b480+0x00000aad $1 = 0x804bf2d Como podemos ver, el resultado de VMA + Size = 0x0804bf2d, acaba justamente donde empieza a ejecutarse nuestro código, por lo tanto no se encuentra adentro de ninguna sección!, Que raro... memoria no localizada, desde aquí ya huele a virus. El problema ahora es que no va a ser fácil desensamblar esta dirección, ya que objdump desensambla de acuerdo a la memoria localizada en secciones, sin embargo IDA debería hacer el truco, pero... por alguna razón al estar haciendo pruebas y analizar profundamente las posibilidades de poder lograr esto, no funcionó, esta dirección como ya vimos no esta localizada dentro

17 ninguna sección por lo tanto confunde a los desensambladores ya que su análisis de los binarios ejecutables ELF se basa de acuerdo a la cabecera de Program Header Table. Por lo tanto, utilice gdb para desensamblar esta parte del código: Bien, por fin pude obtener el código escondido, sin embargo, como se puede apreciar, no luce tan lindo como si lo hubiera hecho en IDA, aparte de que va a dar algunos problemas y no va a ser fácil de revertir, por lo tanto, tuve que pensar en alguna otra solución. La segunda solución que vino a mi mente fue simplemente: Porque no saco solo el código escondido y lo veo con ndisasm[3]?, por esta razón cree un código en C (el cual pueden encontrar en las referencias como rodata_to_data.c) el cual abre el fichero binario, localiza el código que se encuentra entre.rodata y.rdata y lo imprime en pantalla:

18 Bien, aquí otra vez, pude lograr obtener el código de una forma totalmente diferente, sin embargo, aun me sigue pareciendo un código difícil de seguir, por lo cual tuve que buscar aun otra solución La tercera solución que vino a mi mente fue la mejor pero la mas complicada, lo que hice fue crear un nuevo código, el cual cuando le pasabas como argumento el binario, leía la aplicación, utilizaba elf.h para buscar la locación de.rodata y.data, después de esto calculaba información como cuantos bytes había entre uno y el otro (Calculaba la memoria no localizada), y modificaba el Elf32_Shdr de.rodata para que.rodata tuviera su tamaño MAS el tamaño que había enmedio (Este código se encuentra en las Referencias con el nombre change_rodata_size.c):

19 Como pueden ver,.rodata fue modificado, el tamaño ahora es mucho mayor y cubre toda la información que faltaba, por lo tanto ahora los desensambladores que estoy utilizando deben analizar esta porción de memoria. Ahora si, como se ve en el ejemplo siguiente, IDA Pro pueden desensamblar este código a la perfección. ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ public start start proc near [1] jmp short loc_804bf4e ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ db 4Fh ; O db 53h ; S db 46h ; F... Esta subrutina es el empiezo de el bloque de memoria el cual no estaba localizado dentro de ninguna sección, como podemos ver en [1], lo que hace únicamente esta subrutina es saltar a loc_804bf4e. El bloque de código es bastante extenso y me tomo varias horas analizarlo, entenderlo y revertirlo, todo el código del bloque del virus que muestre de aquí en adelante puede ser visto en siendo el análisis de IDA Pro de la porción de código del virus, el primero el código original que se genera. Por la razón anteriormente dada no pienso poner en este documento el análisis del código desensamblado comentado y modificado por mi ya que tomaría bastante tiempo, por lo tanto solo imprimiré una porción del mismo. El código analizado extensamente lo pueden encontrar en

20 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; Attributes: bp based frame osf_startup proc near ; CODE XREF: start+27^xp var_1018 = dword ptr 1018h var_100c = dword ptr 100Ch var_1004 = dword ptr 1004h var_1000 = dword ptr 1000h push ebp mov ebp, esp sub esp, 100Ch push edi push esi push ebx call sub_804cd01 ; char var_80[128]; test eax, eax ; if(eax == 0) jz short salir ; salir(); lea eax, [ebp+var_1004] ; eax = var_1004; push eax call carga_payload ; carga_payload(&var_1004); [...] ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; Attributes: bp based frame carga_payload proc near ; CODE XREF: osf_startup+1c^yp var_488 = dword ptr 488h var_478 = dword ptr 478h var_474 = dword ptr 474h var_468 = dword ptr 468h var_440 = dword ptr 440h var_42c = dword ptr 42Ch var_400 = dword ptr 400h arg_0 = dword ptr 8 push ebp mov ebp, esp sub esp, 47Ch push edi push esi push ebx mov [ebp+var_478], 0 ; var_478=0; lea esi, [ebp+var_400] ; esi = var_400; push 400h push esi push 0

Apellidos Nombre DNI

Apellidos Nombre DNI A continuación se muestra el listado de un programa cuyo objetivo es encontrar una palabra dentro de una cadena de caracteres de la sección de datos y copiar dicha palabra en otra zona de la sección de

Más detalles

Apellidos Nombre DNI

Apellidos Nombre DNI Apellidos Nombre DNI Examen de Arquitectura de Computadores (Telemática) Convocatoria de Junio: 25 5 2 Se dispone de un programa escrito en ensamblador encargado de transformar un número escrito en decimal

Más detalles

"Programación en Ensamblador del microprocesador Pentium (I)"

Programación en Ensamblador del microprocesador Pentium (I) PRÁCTICA 3 "Programación en Ensamblador del microprocesador Pentium (I)" ÍNDICE 3.1.- El microprocesador Pentium. 3.2.- Inserción de ensamblador en Visual Studio. 3.3.- Facilidades para la depuración de

Más detalles

!!" #! #!' (#! (! &)*#&)*+,-../0 %!! # -# (!',-'.,+.+

!! #! #!' (#! (! &)*#&)*+,-../0 %!! # -# (!',-'.,+.+ !"#!!" $%%#&"%%%! #! #!' (#! (! &)*#&)*+,-../0 #$%&''()*$+ %!! "% # -# (!',-'.,+.+ 1&2 &!! *&"%% $%%!! 3$%%!! ""42)5 #" / //! *# ("56...7!!$%%3 '$%% )5"88835%$%% 05"'# $%%...9..."!"!...-...3"!! )5!5" ',-'.,"%%!"

Más detalles

PRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador.

PRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador. PRACTICA #1 Aprender a programar una interrupción software empleando C y/o Ensamblador. Aprender a manipular dispositivos externos (8253, 8255) desde C y/o ensamblador. PROCEDIMIENTO: Vamos a programar

Más detalles

Organización del Computador I 1er. Parcial 17-Mayo-2005. Turno:

Organización del Computador I 1er. Parcial 17-Mayo-2005. Turno: Nota: En el parcial se puede tener la cartilla de Assembler y la de seguimiento (formatos de instrucción) pero no se pueden compartir. Para aprobar el parcial, son necesarios 6(seis) puntos. Para promocionar,

Más detalles

Arquitectura intel 8086. Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

Arquitectura intel 8086. Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005 Arquitectura intel 8086 Preámbulo de OSO para alumnos formados en el procesador MIPS Asignatura Sistemas Operativos Murcia abril de 2005 página 1. Introducción 2 2.- Direccionamiento y Registros de Segmento

Más detalles

Programación Estructurada

Programación Estructurada Programación Estructurada PROGRAMACIÓN ESTRUCTURADA 1 Sesión No. 11 Nombre: Manejo de archivos Contextualización En los lenguajes de programación estructurada como C, que carecían de una conexión a base

Más detalles

"Binary Diffing" visual en Linux con Radare2 "UNA IMAGEN DICEN MÁS QUE MIL PALABRAS"

Binary Diffing visual en Linux con Radare2 UNA IMAGEN DICEN MÁS QUE MIL PALABRAS "Binary Diffing" visual en Linux con Radare2 Binary Diffing o simplemente Bindiffing es una técnica utilizada para la visualización de código (mayormente en ensamblador) y así detectar patrones de conducta,

Más detalles

Troyano bancario captura en vídeo la pantalla del usuario

Troyano bancario captura en vídeo la pantalla del usuario Troyano bancario captura en vídeo la pantalla del usuario El atacante recibe un vídeo de la pantalla del afectado donde puede observar todo lo que hizo el usuario para entrar en su cuenta bancaria. La

Más detalles

Módulo 08 Lenguaje Ensamblador

Módulo 08 Lenguaje Ensamblador Módulo 08 Lenguaje Ensamblador Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur Copyright Copyright 2011-2015 A. G. Stankevicius Se asegura la libertad para copiar,

Más detalles

Programas de ordenador (software)

Programas de ordenador (software) Programas de ordenador (software) Jorge Juan Chico , Julián Viejo Cortés 2011, 2014, 2015 Departamento de Tecnología Electrónica Universidad de Sevilla Usted es libre

Más detalles

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52 62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52 3DUWHGH(QVDPEODGRU 4º) Escribir un programa en ensamblador que pida un número de una cifra por teclado y saque como resultado

Más detalles

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA Tema 4: Familia x86 Carlos Garre 1 Familia x86 Contenidos Concepto de familia: la familia x86. Generaciones de la familia x86. Primera generación: 8086. Segunda generación: 80286. Tercera generación: 80386.

Más detalles

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15 Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15 Sistemas operativos, arquitectura von Neumann, configuración del PC (3 puntos) 1) Señale la opción correcta: [_]

Más detalles

El lenguaje de Programación C. Fernando J. Pereda

El lenguaje de Programación C. Fernando J. Pereda <ferdy@gentoo.org> El lenguaje de Programación C Fernando J. Pereda Por qué aprender C? Portable y muy extendido Estándar (C89, C99) El lenguaje de los sistemas Un lenguaje fácil (no, no es broma) Por

Más detalles

Esquema de un programa en C: bloques básicos

Esquema de un programa en C: bloques básicos Esquema de un programa en C: bloques básicos // Incluimos los ficheros de cabecera que necesitemos. // Esto es un comentario #include #include // Si queremos definir alguna constante,

Más detalles

Departamento de Seguridad en Cómputo UNAM-CERT

Departamento de Seguridad en Cómputo UNAM-CERT Departamento de Seguridad en Cómputo UNAM-CERT Reporte de vulnerabilidad de Excel Resumen En este documento se muestra la explotación de una vulnerabilidad de Excel de ejecución de código arbitrario. Proyecto

Más detalles

Programación segura. Seguridad en los Sistemas Informáticos. Ismael Ripoll. Universidad Politècnica de València. Abril 2011

Programación segura. Seguridad en los Sistemas Informáticos. Ismael Ripoll. Universidad Politècnica de València. Abril 2011 Programación segura Seguridad en los Sistemas Informáticos Ismael Ripoll Universidad Politècnica de València Abril 2011 Ismael Ripoll (Universidad Politècnica de València) Programación segura Abril 2011

Más detalles

Entorno de Ejecución del Procesador Intel Pentium

Entorno de Ejecución del Procesador Intel Pentium Arquitectura de Ordenadores Arquitectura del Procesador Intel Pentium Abelardo Pardo abel@it.uc3m.es Universidad Carlos III de Madrid Departamento de Ingeniería Telemática Entorno de Ejecución del Procesador

Más detalles

Crear el shellcode polimórfico

Crear el shellcode polimórfico Crear el shellcode polimórfico Programación Michał Piotrowski Grado de dificultad En el artículo que apareció en el último número de la revista hakin9 hemos aprendido a crear y modificar el código de la

Más detalles

Preliminares. Tipos de variables y Expresiones

Preliminares. Tipos de variables y Expresiones Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un

Más detalles

Práctica 6. Periféricos Avanzados. Programación del Disco Duro a través de la interfaz IDE. Lectura de la tabla de particiones.

Práctica 6. Periféricos Avanzados. Programación del Disco Duro a través de la interfaz IDE. Lectura de la tabla de particiones. Práctica 6. Periféricos Avanzados. Programación del Disco Duro a través de la interfaz IDE. Lectura de la tabla de particiones. Introducción. En esta práctica accederemos al disco duro a través de la funcion

Más detalles

Generación de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones

Generación de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones Ejemplo introductorio: escritura de funciones en NASM Ejemplo introductorio: escritura de funciones en NASM En estas transparencias pondremos una subrutina ASPLE y la generación de código equivalente En

Más detalles

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 11 PRÁCTICA 11 CUATRO OPERACIONES FUNDAMENTALES EN NÚMEROS DE 8 BYTES

LENGUAJE ENSAMBLADOR 80386 PRÁCTICA 11 PRÁCTICA 11 CUATRO OPERACIONES FUNDAMENTALES EN NÚMEROS DE 8 BYTES PRÁCTICA 11 SUMA, RESTA, MULTIPLICACIÓN Y DIVISIÓN DE DOS NÚMEROS ENTEROS POSITIVOS DE HASTA 20 DÍGITOS DECIMALES 1. INTRODUCCIÓN Mediante esta práctica, trabajaremos con números binarios de hasta veinte

Más detalles

Unidad III El lenguaje de programación C 1. 2. 3. 4. 5. 6. 7. 8.

Unidad III El lenguaje de programación C 1. 2. 3. 4. 5. 6. 7. 8. Unidad III 1. Introducción. 2. Breve historia del C. 3. Lenguajes de programación de alto nivel, bajo nivel y nivel medio. 4. Compiladores e intérpretes. 5. Compilación, enlace y generación de un programa

Más detalles

Capítulo 0. Introducción.

Capítulo 0. Introducción. Capítulo 0. Introducción. Bueno, por fin está aquí el esperado (espero!!) Capítulo Cero del Tutorial de Assembler. En él estableceremos algunos conceptos que nos serán de utilidad a lo largo del Tutorial.

Más detalles

SOLUCION EXAMEN junio 2006

SOLUCION EXAMEN junio 2006 SOLUCION EXAMEN junio 2006 1. Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: I) (1 p) En UNIX únicamente se distinguen dos tipos de procesos: los procesos de usuario y los

Más detalles

JUGANDO CON C, ASM Y SYSCALLS Alejandro Hernández - @nitr0usmx

JUGANDO CON C, ASM Y SYSCALLS Alejandro Hernández - @nitr0usmx JUGANDO CON C, ASM Y SYSCALLS Alejandro Hernández - @nitr0usmx Tabla de Contenidos 1.-ASM. 1.1.-Definición de ASM. 1.2.-Arquitectura de computadoras. 1.3.-Instrucciones básicas. 2.-SYSCALLS. 2.1.-Definición

Más detalles

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor. Sesión 03: Lenguajes web del servidor Competencias a Conseguir: - Conocer el entorno de trabajo a nivel de servidores web. - Instalación del localhost (Servidor Local). - Repaso general de PHP y ejercicios

Más detalles

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por

Más detalles

Sistemas Operativos Práctica 3

Sistemas Operativos Práctica 3 Sistemas Operativos Práctica 3 Ing. Andrés Bustamante afbustamanteg@unal.edu.co Ingeniería de Sistemas Facultad de Ingeniería Universidad de la Amazonia 2009 1. Objetivo El objetivo de la práctica es que

Más detalles

Fundamentos de Arquitectura y Código Máquina

Fundamentos de Arquitectura y Código Máquina Fundamentos de Arquitectura y Código Máquina Lección 3 Ing. Jorge Castro-Godínez MT7003 Microprocesadores y Microcontroladores Área de Ingeniería Mecatrónica Instituto Tecnológico de Costa Rica I Semestre

Más detalles

PRÁCTICA 5. SENTENCIAS DE CONTROL REPETITIVAS.

PRÁCTICA 5. SENTENCIAS DE CONTROL REPETITIVAS. PRÁCTICA 5. SENTENCIAS DE CONTROL REPETITIVAS. 1. Introducción. En esta práctica veremos todos los conceptos explicados en la segunda parte del Tema 5 de teoría: las Sentencias de Control Repetitivas,

Más detalles

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1. Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1. Anjuta es un entorno de desarrollo de C que podemos encontrar en cualquier distribución de GNU/Linux. Si nuestra distribución no dispone de ella,

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Prácticas de C++ Practica Nº 10 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante INDICE 1.1 EJERCICIO 1: MI PRIMER FICHERO EN BINARIO... 1 1.2 EJERCICIO 2: LEYENDO MI PRIMER FICHERO

Más detalles

Programando por primera vez

Programando por primera vez Programando por primera vez Antes de comenzar a programar es necesario ubicar un entorno que disponga de un compilador para el lenguaje en el que queremos programar. Un compilador es un programa que se

Más detalles

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS Por Andrés Raúl Bruno Saravia Entrega Nº 5. Cómo declaramos una variable en Lenguaje C? En C siempre se deben declarar las variables.

Más detalles

Autores: Salazar Ramírez Norman Francisco Cota Ortiz Maria de Gudalupe Flores Pérez Pedro

Autores: Salazar Ramírez Norman Francisco Cota Ortiz Maria de Gudalupe Flores Pérez Pedro Autores: Salazar Ramírez Norman Francisco Cota Ortiz Maria de Gudalupe Flores Pérez Pedro Hermosillo, Sonora, 2010 I N D I C E Página Presentación.... Dinámic Link Libraries... Registro manual de una dll,

Más detalles

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK. Introducción Java surgió en 1991 dentro de la empresa Sun Microsystems como un lenguaje de programación sencillo y universal destinado a electrodomésticos. La reducida potencia de cálculo y memoria de

Más detalles

INSTALAR UBUNTU DESDE WINDOWS

INSTALAR UBUNTU DESDE WINDOWS INSTALAR UBUNTU DESDE WINDOWS Índice de contenido 1.Descargar Ubuntu 10.04 Lucid Lynx...3 2.Grabar la imagen descargada en un CD...3 2.1.Grabación de una imagen iso con Nero...3 2.2.Grabación de una imagen

Más detalles

Tema 9. Vectores y Matrices

Tema 9. Vectores y Matrices Tema 9. Vectores y Matrices OBJETIVO En temas anteriores hemos declarado variables simples de tipo int, float, o de cualquier otro tipo simple. A menudo necesitaremos declarar una colección de variables,

Más detalles

PRÁCTICA MANEJO INTERNO DE DATOS

PRÁCTICA MANEJO INTERNO DE DATOS Objetivos PRÁCTICA 1. El alumno conocerá la representación de datos en el sistema binario y hexadecimal 2. El alumno conocerá como definir un programa en el entorno de desarrollo del lenguaje C Introducción

Más detalles

Explotación de Overflow en memoria heap en Windows Explotación de memoria heap personalizada en Windows 7

Explotación de Overflow en memoria heap en Windows Explotación de memoria heap personalizada en Windows 7 Explotación de Overflow en memoria heap en Windows Explotación de memoria heap personalizada en Windows 7 Autor: Souhail Hammou Traducción al Español (Latinoamericano,México): Christian Guzmán Blog: http://rce4fun.blogspot.com/

Más detalles

Si el fichero hashes existe, el script debe notificar el error y salir como corresponde. A continuación se muestra un ejemplo:

Si el fichero hashes existe, el script debe notificar el error y salir como corresponde. A continuación se muestra un ejemplo: Examen de Sistemas Operativos ITIS Fuenlabrada Junio 2009 Tiempo total: 3 horas. Problema: Llamadas al sistema (5 puntos) Escriba en C para Plan 9 un programa llamado catsha1 cuyo propósito es crear un

Más detalles

Objetivos. El alumno conocerá los elementos indispensables de un ambiente de programación y será capaz de realizar programas básicos en lenguaje C.

Objetivos. El alumno conocerá los elementos indispensables de un ambiente de programación y será capaz de realizar programas básicos en lenguaje C. Objetivos El alumno conocerá los elementos indispensables de un ambiente de programación y será capaz de realizar programas básicos en lenguaje C. Al final de esta práctica el alumno podrá: 1. Decir cuáles

Más detalles

Informática I. Código 2547100 Semestre 2014-2. Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza

Informática I. Código 2547100 Semestre 2014-2. Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza Informática I Código 2547100 Semestre 2014-2 Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza Programming tools Editor de texto (gedit, kate, vim, wordpad, etc):

Más detalles

Asignatura: Laboratorio de Computadores. Curso 2007-08. 5º Semestre, 3er. Curso. Ingeniería Informática. Práctica de SOCKETS

Asignatura: Laboratorio de Computadores. Curso 2007-08. 5º Semestre, 3er. Curso. Ingeniería Informática. Práctica de SOCKETS Asignatura: Laboratorio de Computadores. Curso 2007-08. 5º Semestre, 3er. Curso. Ingeniería Informática. Práctica de SOCKETS Especificación de la práctica: Un protocolo sencillo para transferencia de ficheros

Más detalles

4 o Ingeniería Informática

4 o Ingeniería Informática Esquema del tema 1. Introducción 4 o Ingeniería Informática II26 Procesadores de lenguaje Estructura de los compiladores e intérpretes 2. Etapas del proceso de traducción 3. La interpretación 4. La arquitectura

Más detalles

Aprendiendo el uso de CmapTools Primera parte

Aprendiendo el uso de CmapTools Primera parte Aprendiendo el uso de CmapTools Primera parte La ventaja de usar un software específico para dibujar los mapas conceptuales, es que permite mover los conceptos, flechas y enlaces a través del espacio de

Más detalles

Arquitectura de Computadores: Exámenes y Controles

Arquitectura de Computadores: Exámenes y Controles 2º curso / 2º cuatr. Grado en Ing. Informática Doble Grado en Ing. Informática y Matemáticas Arquitectura de Computadores: Exámenes y Controles Examen de Prácticas AC 05/07/2013 resuelto Material elaborado

Más detalles

PROGRAMACIÓN BÁSICA DE LA COMPUTADORA. 1 Introducción. Tabla 1: Instrucciones MIPS

PROGRAMACIÓN BÁSICA DE LA COMPUTADORA. 1 Introducción. Tabla 1: Instrucciones MIPS PROGRAMACIÓN BÁSICA DE LA COMPUTADORA 1 Introducción Un sistema de computadora total incluye tanto circuitería (hardware) como programación (software). El hardware consta de los componentes físicos y todo

Más detalles

Examen de Arquitectura de Computadores 2 22 de febrero del 2011

Examen de Arquitectura de Computadores 2 22 de febrero del 2011 Examen de Arquitectura de Computadores 2 22 de febrero del 2011 Indique su nombre completo y número de cédula en cada hoja. Numere todas las hojas e indique el total de hojas en la primera. Escriba las

Más detalles

Mi primer proyecto en Dev-C++

Mi primer proyecto en Dev-C++ Mi primer proyecto en Dev-C++ Para realizar esta actividad deberás disponer de un ordenador en el que esté instalado el Dev-C++. Debes ir realizando cada uno de los pasos indicados, en el mismo orden en

Más detalles

Secuenciador de Luces

Secuenciador de Luces Basic para Pics Ing. Wilfrido González Bonilla www.electronicaestudio.com Muchos aficionados a la electrónica aun no se animan a aprender a manejar los microcontroladores PIC debido a la creencia de que

Más detalles

Lenguaje C. Tipos de Datos Simples y Estructuras de Control

Lenguaje C. Tipos de Datos Simples y Estructuras de Control Lenguaje C Tipos de Datos Simples y Estructuras de Control Lenguaje C C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje

Más detalles

Programación 2 Curso 2013 2014. Guía de desarrollo C/C++ con Eclipse

Programación 2 Curso 2013 2014. Guía de desarrollo C/C++ con Eclipse Programación 2 Curso 2013 2014 Introducción Guía de desarrollo C/C++ con Eclipse Eclipse 1 es un entorno de programación que permite el desarrollo de aplicaciones en diferentes lenguajes. Consta de un

Más detalles

EL EMU8086 Y EL MICROPROCESADOR 8086.

EL EMU8086 Y EL MICROPROCESADOR 8086. 1 Facultad: Ingeniería. Escuela: Electrónica. Asignatura: Microprocesadores. Lugar de ejecución: Microprocesadores (Edificio 3, 2da planta). EL EMU8086 Y EL MICROPROCESADOR 8086. Objetivos específicos

Más detalles

FACULTAD DE INGENIERÍA

FACULTAD DE INGENIERÍA NOMBRE DEL PROFESOR: Ing. Héctor Manuel Quej Cosgaya NOMBRE DE LA PRÁCTICA: Variables y Tipos de Datos PRÁCTICA NÚM. [ 1 ] LABORATORIO: MATERIA: UNIDAD: TIEMPO: Centro de Ingeniería Computacional Lenguaje

Más detalles

MÓDULO III PROGRAMACIÓN DEL MICROPROCESADOR

MÓDULO III PROGRAMACIÓN DEL MICROPROCESADOR 85 MÓDULO III PROGRAMACIÓN DEL MICROPROCESADOR El módulo III está conformado por las unidades 7 y 8. El estudio de estas unidades, permite desarrollar en el estudiante las competencias necesarias en la

Más detalles

Visión general. Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile. http://informatica.uv.cl

Visión general. Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile. http://informatica.uv.cl Visión general Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http:// 1 Visión general C: Java: auto *a = malloc(sizeof(auto)); a->kilometraje = 100; a->litros_bencina = 17;

Más detalles

Práctica 3: Programación con subrutinas

Práctica 3: Programación con subrutinas Práctica 3: Programación con subrutinas 3.1 Objetivos El objetivo de esta práctica es estudiar el soporte del ensamblador del ARM para la gestión de subrutinas, para lo que resulta necesario familiarizarse

Más detalles

Intel 8086. Arquitectura. Programación en Ensamblador Ing. Marcelo Tosini - 2001

Intel 8086. Arquitectura. Programación en Ensamblador Ing. Marcelo Tosini - 2001 Intel 8086 Arquitectura Características generales Procesador de 16 bits Bus de direcciones de 20 bits : 1 Mbyte Bus de datos interno de 16 bits Bus de datos externo de 16 bits en el 8086 8 bits en el 8088

Más detalles

Programando en C a Bajo Nivel

Programando en C a Bajo Nivel Universidad de Buenos Aires Facultad De Ingeniería Programando en C a Bajo Nivel [75.40] Algoritmos y Programación I 1er Cuatrimestre 011 Cátedra: Ing. Pablo Guarna Autor: Bernardo Ortega Moncada Versión

Más detalles

Flex a la rápida. José Ignacio Medina

Flex a la rápida. José Ignacio Medina Flex a la rápida José Ignacio Medina Octubre, 2008 Este documento se distribuye bajo una licencia Creative Commons bync-sa 2.0. Usted es libre de copiar, distribuir, comunicar y ejecutar públicamente este

Más detalles

Sistemas Operativos: Programación de Sistemas. Curso 2006-07. Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Sistemas Operativos: Programación de Sistemas. Curso 2006-07. Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J. Tema 2 : entorno programación linux Sistemas Operativos: Programación de Sistemas Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J. Santana Pérez Curso 2006-07 Francisco J. Santana 1 Programación

Más detalles

Internet Explorer 5.0

Internet Explorer 5.0 Internet Explorer 5.0 Trucos para la suite de comunicaciones de Microsoft 1 Actualizaciones Es importante tener siempre actualizado el navegador, sea cual sea la versión que se emplee, por lo que conviene

Más detalles

Funcionamiento del sistema de autentificación en PHP

Funcionamiento del sistema de autentificación en PHP Sistema de autentificación PHP Cómo realizar un sistema de autentificación en PHP, en el que los usuarios deban introducir nombre y contraseña para que puedan visualizar las páginas de una aplicación con

Más detalles

Ilustrar el mecanismo de llamadas al sistema para solicitar servicios al sistema operativo.

Ilustrar el mecanismo de llamadas al sistema para solicitar servicios al sistema operativo. Práctica 1: introducción al simulador SPIM 1. Motivación Seguro que a estas alturas de la carrera sabe ya manejar un ordenador perfectamente. Incluso debe saber cómo programarlos en un lenguaje de alto

Más detalles

movl $var, %eax movl $0xf02, %ebx movb var, %ah movw %bx, %ax mov ebx, eax movl %ebx, %eax movl 3(%ebx), %eax

movl $var, %eax movl $0xf02, %ebx movb var, %ah movw %bx, %ax mov ebx, eax movl %ebx, %eax movl 3(%ebx), %eax ENSAMBLADOR EN LÍNEA CON EL gcc APÉNDICE 2 1. Herramientas Los programas se desarrollarán en C y en ensamblador. El ensamblador se utilizará básicamente para realizar ciertas optimizaciones en el código

Más detalles

Práctica 2. Registros y posiciones de memoria

Práctica 2. Registros y posiciones de memoria Enunciados de prácticas Práctica 2. Registros y posiciones de memoria Estructura y Organización de Computadores Grados en Ingeniería Informática e Ingeniería de Computadores Curso 2012-2013 Práctica 2:

Más detalles

FUNDAMENTOS DE PROGRAMACIÓN Asignatura correspondiente al plan de estudios de la carrera de Ingeniería Informática

FUNDAMENTOS DE PROGRAMACIÓN Asignatura correspondiente al plan de estudios de la carrera de Ingeniería Informática Página 1/12 Universidad Nacional del Litoral Facultad de Ingeniería y Ciencias Hídricas Departamento de Informática FUNDAMENTOS DE PROGRAMACIÓN Asignatura correspondiente al plan de estudios de la carrera

Más detalles

ESTRUCTURA DE COMPUTADORES I (Capítulo 14: DIRECTIVAS) 1/32 14-DIRECTIVAS

ESTRUCTURA DE COMPUTADORES I (Capítulo 14: DIRECTIVAS) 1/32 14-DIRECTIVAS ESTRUCTURA DE COMPUTADORES I (Capítulo 14: DIRECTIVAS) 1/32 14-DIRECTIVAS 14.1 INTRODUCCIÓN: Las directivas o pseudooperaciones se pueden dividir en cuatro grupos funcionales:! Directivas de datos.! Directivas

Más detalles

LLAMADAS AL SISTEMA SISTEMAS OPERATIVOS

LLAMADAS AL SISTEMA SISTEMAS OPERATIVOS LLAMADAS AL SISTEMA SISTEMAS OPERATIVOS 26/05/2013 eduar14_cr@hotmail.com cilred_tlapa@hotmail.com LLAMADAS AL SISTEMA Las llamadas al sistema proporcionan la interfaz entre un proceso y el sistema operativo,

Más detalles

La arquitectura CISCA

La arquitectura CISCA La arquitectura CISCA Miquel Albert Orenga Gerard Enrique Manonellas PID_00181526 CC-BY-SA PID_00181526 La arquitectura CISCA Los textos e imágenes publicados en esta obra están sujetos excepto que se

Más detalles

Tema 1: Computadores y Programas

Tema 1: Computadores y Programas Tema 1: Computadores y Programas Ingeniería Informática Ingeniería Técnica en Informática de Sistemas Ingeniería Técnica en Informática de Gestión Departamento de Ciencia de la Computación e I.A. Universidad

Más detalles

Una introducción al compilador C de GNU

Una introducción al compilador C de GNU Una introducción al compilador C de GNU Héctor Adrián Valdecantos Departamento de Ciencias de Computación Facultad de Ciencias Exactas y Tecnología - UNT Materia: Programación Carrera: Programador Universitario

Más detalles

Figura 1.- Ejemplos de tableros electrónicos pasamensajes.

Figura 1.- Ejemplos de tableros electrónicos pasamensajes. -=[ CONTROLANDO TABLEROS ELECTRÓNICOS (PASAMENSAJES) -=[ nitr0us < nitrousenador@gmail.com > -=[ http://www.genexx.org/nitrous/ -=[ 26/Agosto/2007 -=[ México Este documento no explica como controlar algún

Más detalles

Demo de permisos. Hola! Taller de Protección y Seguridad

Demo de permisos. Hola! Taller de Protección y Seguridad Hola! Taller de Protección y Seguridad Sistemas Operativos Alejandro Deymonnaz 1 1 Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Hola! Soy Alejandro Deymonnaz.

Más detalles

Guía Laboratorio Número 1

Guía Laboratorio Número 1 Guía Laboratorio Número 1 Página 1 de 5 Arquitectura de Computadoras 06/04/2014 Repaso lenguaje ensamblador Escribir códigos en lenguaje ensamblador es bastante sencillo, por lo que no es necesario el

Más detalles

DNS: Domain Name System

DNS: Domain Name System DNS: Domain Name System Introducción DNS: Domain Name System Propósito básico: Traducir números IP en nombres textuales más amigables para los usuarios humanos de la red. Propósitos adicionales: Soporte

Más detalles

1 Estructura básica de un programa C++

1 Estructura básica de un programa C++ Elementos básicos de un lenguaje de alto nivel: C++ CONTENIDOS 1. Estructura básica de un programa C++. 2. Tipos de datos simples. 3. Constantes y variables en C++. Declaración. 4. Operadores y expresiones.

Más detalles

Departamento de Sistemas e Informática

Departamento de Sistemas e Informática Departamento de Sistemas e Informática Programación en Assembler - Clase 1 Digital II Presentación de Docentes y Material Docentes: Ing. Andrés Capalbo Ing. Diego Alegrechi Ing. Esteban Almirón Material

Más detalles

Programación en C++/Funciones

Programación en C++/Funciones Programación en C++/Funciones 1 Programación en C++/Funciones Estructuras Streams Funciones Definiendo una función Una función es un conjunto de líneas de código que realizan una tarea específica y puede

Más detalles

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos. Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos. Qué es PHP? PHP (Hypertext Preprocessor). Es un lenguaje de programación: De código

Más detalles

Práctica 4. Introducción a la programación en lenguaje ensamblador

Práctica 4. Introducción a la programación en lenguaje ensamblador Enunciados de prácticas Práctica 4. Introducción a la programación en lenguaje ensamblador Laboratorio de Estructura de Computadores I. T. Informática de Gestión / Sistemas Curso 2008-2009 Práctica 4:

Más detalles

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

TEMA 3: EL LENGUAJE C: PRESENTACIÓN TEMA 3: EL LENGUAJE C: PRESENTACIÓN Historia del lenguaje C Características del lenguaje C Estructura de un programa en C El editor de textos: elementos Funciones: de usuario y de librería Librerías de

Más detalles

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador. ORGANIZACIÓN DE LA MEMORIA EN TIEMPO DE EJECUCIÓN Compilador Tiempo de Compilación Programa fuente Secuencia de caracteres Scanner Secuencia de símbolos Parser Árbol sintáctico Analizador semántico Generador

Más detalles

TEMA 4. ELEMENTOS BÁSICOS DE PROGRAMACIÓN

TEMA 4. ELEMENTOS BÁSICOS DE PROGRAMACIÓN TEMA 4. ELEMENTOS BÁSICOS DE PROGRAMACIÓN 4.1 Definiciones y palabras reservadas básicas del C El lenguaje C++ está compuesto por: 32 palabras clave (estándar ANSI), comunes a todos los compiladores de

Más detalles

Introducción al lenguaje de programación java

Introducción al lenguaje de programación java Introducción al lenguaje de programación java Algoritmia y Programación Slide 1 LENGUAJES DE PROGRAMACION Un lenguaje de programación es un idioma artificial diseñado y creado para expresar algoritmos

Más detalles

gcc = (GNU C compiler). gdb = (GNU DeBugger).

gcc = (GNU C compiler). gdb = (GNU DeBugger). Capítulo 4b.- El debugador. Aunque un programa este sintácticamente bien escrito, es decir, el compilar lo comprende y es capaz de construir un binario a partir de él, puede ocurrir que el código no funcione

Más detalles

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8 TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 1.1 VECTORES O ARRAYS UNIDIMENSIONALES 2 1.2 ARRAYS MULTIDIMENSIONALES 3 1.3 INICIALIZACIÓN DE ARRAYS 4 1.3.1 INICIALIZACIÓN DE ARRAYS SIN

Más detalles

C.F.G.S. DESARROLLO DE APLICACIONES INFORMÁTICAS. MÓDULO: Diseño y realización de servicios de presentación en entornos gráficos.

C.F.G.S. DESARROLLO DE APLICACIONES INFORMÁTICAS. MÓDULO: Diseño y realización de servicios de presentación en entornos gráficos. C.F.G.S. DESARROLLO DE APLICACIONES INFORMÁTICAS MÓDULO: Diseño y realización de servicios de presentación en entornos gráficos Unidad 1 Introducción Visual Basic.NET El objetivo de la unidad es conocer

Más detalles

Tema 7 Vectores y cadenas de caracteres. Fundamentos de Informática

Tema 7 Vectores y cadenas de caracteres. Fundamentos de Informática Tema 7 Fundamentos de Informática Índice 1. Qué es un vector? 2. Vectores unidimensionales 3. Cadenas de caracteres 4. Paso de vectores unidimensionales a funciones. 5. Vectores multidimensionales: matrices

Más detalles

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C Directivas del procesador Main() { Declaraciones Definiciones proposiciones }

Más detalles

SISTEMAS BASADOS EN MICROPROCESADOR 2º Grado Ingeniería Informática (EPS UAM) EXAMEN FINAL EXTRAORDINARIO JULIO 2013 ENUNCIADO DEL PROBLEMA

SISTEMAS BASADOS EN MICROPROCESADOR 2º Grado Ingeniería Informática (EPS UAM) EXAMEN FINAL EXTRAORDINARIO JULIO 2013 ENUNCIADO DEL PROBLEMA SISTEMAS BASADOS EN MICROPROCESADOR 2º Grado Ingeniería Informática (EPS UAM) EXAMEN FINAL EXTRAORDINARIO JULIO 2013 ENUNCIADO DEL PROBLEMA IMPLEMENTACIÓN DE UN DRIVER DOS INTERFAZ CON UN SISTEMA DE RADIO

Más detalles

Introducción al NASM. Convenciones de colores

Introducción al NASM. Convenciones de colores Introducción al NASM The Netwide Assembler MIA J. Rafael Rojano C. 1 Convenciones de colores Rojo= Directivas propias del nasm sin traducción directa a ensamblador Morado= Directivas del ensamblador En

Más detalles

Estándares de codificación Java

Estándares de codificación Java Estándares de codificación Java Ingeniería de Software Mtr. Ing. Nancy López Por qué convenciones de código El 80% del coste del código de un programa va a su mantenimiento. Casi ningún software lo mantiene

Más detalles

- length(str) retorna el largo de un string en bytes. Ejemplo: "SELECT LENGTH('ITFreek')", nos devuelve 7.

- length(str) retorna el largo de un string en bytes. Ejemplo: SELECT LENGTH('ITFreek'), nos devuelve 7. 1 Inyecciones SQL V 1.0 Sentencias a necesitar: - database() devuelve el nombre de la base de datos actualmente seleccionada, o NULL si no hay ninguna seleccionada. Ejemplo: "SELECT DATABASE()" en el código

Más detalles

Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL

Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL Clase No. 5: Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL MAT 251 Dr. Alonso Ramírez Manzanares CIMAT, A.C. e-mail: alram@ cimat.mx

Más detalles