Está en la página 1de 29

1) Teora de Programacin Orientada a Objetos (POO)

1.1) Concepto de Objeto: Atributos y Mtodos

Un objeto es cualquier cosa real o abstracta de la cual nos interesa su comportamiento y que tiene una identidad nica que la distingue de las dems. Un
objeto es una unidad atmica formada por la unin de estado+comportamiento. Un Objeto se compone de: - Atributos (datos o variables): Informacin que posee cada objeto y que identifica su estado. - Mtodos (operaciones o funciones): Conjunto de instrucciones que definen el comportamiento del objeto. Reciben unos argumentos y devuelven un resultado. Slo se puede acceder a los atributos de un objeto a travs de sus mtodos. Imaginemos que nuestro objeto es un exploit y que su plantilla es la siguiente: -----------------------------------------| Dame el lenguaje | | Dame la vulnerabilidad | | --------------| | | Autor | | | | |Dame el autor | | |Vulnerabilidad | | | | | | | | Lenguaje | | | | | | | --------------| | | | Introduzco nuevo offset | | | -----------------------------------------Este diagrama representa la estructura de un objeto. La parte interna del objeto no es accesible y contiene los atributos. La parte externa o interfaz del objeto es

accesible y contiene los mtodos. Citar Para los que no conocen mucho sobre los exploits, les recomiendo que se den una vuelta por http://foro.elhacker.net/index.php/board,32.0 Para poder comprender este ejemplo, slo es necesario saber que un exploit es un cdigo (codificado por un autor) que explota una vulnerabilidad para lograr ejecutar cdigo arbitrario en el sistema comprometido. La codificacin puede haberse hecho en el lenguaje que prefiera el autor: C, C++, Perl... Antes de lanzar un exploit contra un objetivo remoto, por ejemplo, debemos conocer su sistema operativo y a veces es necesario cambiar la direccin offset dentro del cdigo del exploit, en funcin del sistema operativo y la versin de service pack que el objetivo tenga instalada, para ajustar el exploit a las caractersticas del sistema objetivo.

Bien, nuestro objeto-exploit tiene algunos atributos como el autor del exploit (= Lion), la vulnerabilidad que explota (= Serv-U FTPD 3.x/4.x "SITE CHMOD" Command Remote stack buffer overflow) y el lenguaje en que se ha codificado el exploit (= Lenguaje C). Si otro objeto quiere acceder a estos atributos, no lo puede hacer directamente, sino a travs de los mtodos del objeto-exploit. Es decir, si quiere saber el autor que codific el exploit, llamar al mtodo "dame el autor" del objeto-exploit y recibir como resultado el tipo string con el nombre del autor = "Lion". si quiere introducir una nueva direccin offset, llamar al mtodo "introduzco nuevo offset" y le pasar como argumento el tipo string con la direccin offset = "0x7ffa4a1b" a introducir para que el exploit nos funcione. Generalmente, a estos mtodos q "obtienen" o "introducen" se les llama mtodos getters y setters. De esta forma, los mtodos del objeto-exploit pasarn a codificarse bajo los nombres getAutor, getVulnerabilidad, getLenguaje, y setOffset. Continuando con el ejemplo... el prototipo del mtodo getAutor ser: String getAutor ()

String (antes del mtodo), indica que la llamada al mtodo devuelve un tipo String, como es una cadena de caracteres con el nombre del autor. Sin embargo, no hace falta pasarle ningn argumento al mtodo, por lo que dejamos los parntesis () vacos. el prototipo del mtodo setOffset ser: void setOffset (String offset) void (antes del mtodo), indica que la llamada al mtodo no devuelve ningn tipo. Sin embargo, es necesario pasarle un argumento tipo String, como es la cadena de caracteres de la direccin offset para que, por ejemplo, el cdigo del mtodo implemente esa direccin offset y entonces lance el exploit ya ajustado a las caractersticas del sistema objetivo. Si este ejemplo del objeto-exploit te ha resultado demasiado confuso por los tecnicismos empleados, quizs te resulte ms fcil comprender un objeto-reloj. Tiene los atributos Hora (= 19:00), Fecha (= 31/12/2004) y Marca (=Casio) y sus mtodos podran ser getHora (para pedir la hora que marca el reloj), getFecha (para pedir la fecha que marca el reloj), getMarca (para pedir la marca del reloj), setHora (para introducir una nueva hora en el reloj) y setFecha (para introducir una nueva fecha en el reloj). Jejejeje, mejor as??

1.2) Concepto de Clase. Justo antes del dibujo del objeto-exploit, he remarcado que ese diagrama representaba su "plantilla". Es decir, imagina que tenemos una plantilla para crear muchos objetos-exploit, todos ellos con los mismos tipos de atributos y los mismos mtodos, pero cada uno con su identidad propia. Otro ejemplo de objeto-exploit diferente podra contener la siguiente informacin en sus atributos: Autor = fiNis, Vulnerabilidad = Jordan Telnet Server Buffer Overflow, Lenguaje = C y tener los mismos mtodos para acceder a estos atributos, pero como ves, la identidad es distinta. Las clases son una especie de plantilla para los objetos, es decir, si se piensa en una clase como un molde de galletas, los objetos que se crean a partir de esa clase son las galletas. Definimos formalmente clase como la representacin de la estructura (atributos) y

comportamiento (mtodos) de un objeto.

La creacin de un objeto a partir de una clase se denomina "instanciacin". Cualquier objeto que se instancie de una clase crear una copia de la definicin de atributos de la clase y dispondr de los mtodos definidos en ella. Para crear objetos, se invoca al constructor de la clase, que es un mtodo que se llama igual que la clase. Tipos de clases: - Clase abstracta: ningn objeto pertenece directamente a dicha clase. - Clase concreta: exiten objetos que pertenecen directamente a dicha clase.

1.3) Atributos y Mtodos de Objeto/Clase Antes hemos visto que un Objeto se compone de: - Atributos (datos o variables): Informacin que posee cada objeto y que identifica su estado. - Mtodos (operaciones o funciones): Conjunto de instrucciones que definen el comportamiento del objeto. Reciben unos argumentos y devuelven un resultado. Y hemos dicho que la nica manera de acceder a los atributos de los objetos, es a travs de los mtodos.

Los mtodos son un conjunto de instrucciones al cual se le pueden pasar unos argumentos y/o devolver unos resultados.

Existen dos tipos de mtodos: - Mtodos de instancia: invocados en los objetos. - Mtodos de clase: invocados en las clases. Estos atributos y mtodos sern compartidos por todos los objetos creados a partir de una misma clase. Para comprender el concepto de atributo/mtodo de instancia o de clase, volvamos al ejemplo del objeto-reloj: Imaginemos una clase-reloj que crea objetos-reloj, todos de la misma marca = Casio. Estos objetos-reloj implementan los atributos Hora, Fecha y Marca; y los mtodos getHora, getFecha, getMarca, setHora y setFecha. Sin embargo, algunos de estos atributos y mtodos son de clase y otros son de instancia: - Atributos de instancia:

- Mtodos de instancia: getHora getFecha - Atributos de clase: Marca - Mtodos de clase: getMarca Se puede distinguir las diferencias entre unos y otros de manera sencilla: Si le preguntamos a dos objetos (relojA y relojB) con getHora o getFecha, nos pueden contestar un valor diferente para cada objeto. Estos atributos y mtodos sern denominados atributos de instancia y mtodos de instancia. Si le preguntamos a dos objetos (relojA y relojB) con getMarca, ambos contestarn el mismo valor = Casio, ya que la clase-reloj se lo ha asignado forzsamente. Estos atributos y mtodos sern denominados atributos de clase y mtodos de clase. En este caso, por ejemplo, si existiera el mtodo setMarca y modificaramos el atributo Marca de cualquier objeto a travs de l, este atributo se modificara para todos los objetos, pues estamos tratando con mtodos de clase. CONSECUENCIAS Cualquier objeto creado a partir de una clase contendr la definicin de los atributos de clase y dispondr de los mtodo de clase. Por tanto, cuando se modifica un atributo de clase a travs de un objeto, se modifica ese atributo en todos los objetos creados a partir de esa clase.

Hora Fecha

Especificaciones sobre los mtodos:

Un objeto de clase no puede acceder a un mtodo de instancia, porque no sabemos si el objeto al que intenta acceder ha sido ya creado. Sin embargo, el resto de accesos son posibles: mtodo de clase - mtodo de clase

mtodo de instancia - mtodo de instancia mtodo de instancia - mtodo de clase Asimismo, un mtodo de instancia de un objeto A no puede acceder directamente a los atributos (variables) de un objeto B, pero puede hacer referencia a un mtodo de instancia del objeto B, y que sea este el que acceda a los atributos del objeto B.

1.4) Modificadores de acceso. Alcance de los modificadores de acceso prefijos a atributos y mtodos: - public: accesible desde cualquier lugar de la aplicacin (por el resto de clases). - private: slo accesible desde la clase a la que pertenece. - protected: disponible para la clase actual, clases del mismo paquete y subclases derivadas de esa clase.

1.5) Paradigmas de la POO 1.5.1) Abstraccin

Consiste en abstraer conceptualmente los atributos y comportamiento (mtodos) comunes a un determinado conjunto de objetos y almacenarlos en una clase.
1.5.2) Encapsulamiento

El encapsulamiento es el principio por el cual se ocultan los detalles de implementacin al usuario.

Cada clase tiene dos partes: El Interfaz es la parte pblica con la que interacta el usuario (mtodos pblicos) La Implementacin es el cdigo que realiza todas las operaciones de la clase (mtodos privados) 1.5.3) Herencia

La herencia permite crear una clase nueva (subclase o clase derivada) que tenga el mismo comportamiento que otra (superclase o clase base) y adems extienda o adapte ese comportamiento a unas necesidades especficas.
La nueva subclase heredar los atributos y los mtodos de la clase base, los

cuales se aadirn a los definidos en la propia subclase. Continuando con el ejemplo de la clase-exploit, observamos que por Internet circulan bastantes exploits que afectan a vulnerabilidades en servicios de Microsoft Windows. Por qu no agrupar todo este conjunto de objetos-exploit bajo una nueva clase-winexploit?. Esta nueva clase-winexploit hereder los mismos atributos (Autor, Vulnerabilidad y Lenguaje) y los mismos mtodos (getAutor, getVulnerabilidad, getLenguaje y setOffset) de la clase-exploit. A su vez, "extender su comportamiento" implementando otros atributos y otros mtodos especficos como, por ejemplo, el atributo CodigoMS (referente al Codigo Microsoft Security Bulletin asignado a la vulnerabilidad) y el mtodo getCodigoMS. La clase-winexploit quedara as: -----------------------------------------| getLenguaje | | getVulnerabilidad | | --------------| | | Autor | | | | | getAutor | | |Vulnerabilidad | | | | | | | | Lenguaje | | | | CodigoMS | | | --------------| | | | setOffset | | getCodigoMS | -----------------------------------------Un ejemplo de objeto-winexploit podra ser el siguiente: - Atributos: (atributos heredados de la clase-exploit) Autor: Wirepair Vulnerabilidad: Windows Workstation Service WKSSVC.DLL Buffer Overflow Lenguaje: C

(nuevos atributos implementados por la clase-winexploit) CodigoMS: MS03-049 - Metodos: (mtodos heredados de la clase-exploit) getAutor getVulnerabilidad getLenguaje setOffset (nuevos mtodos implementados por la clase-winexploit) getCodigoMS

La sintaxis en Java para indicar que una nueva clase hereda de otra superclase es: Cdigo: class winexploit extends exploit

Especificaciones sobre la Herencia:

Adems de "extender" el comportamiento implementando nuevos atributos y nuevos mtodos, una clase heredada puede "adaptar" el comportamiento sobreescribiendo la funcionalidad de la clase base, esto es, sobreescribiendo la implementacin del algn mtodo heredado de la clase base para que al llamar a ese mtodo desde la nueva clase heredada, en vez de ejecutar el cdigo original del mtodo heredado, se ejecute un nuevo cdigo adaptado al comportamiento de la nueva clase. (Polimorfismo) 1.5.4) Polimorfismo

El Polimorfismo es la respuesta distinta frente a una llamada a un mtodo dependiendo de la naturaleza del objeto.

Consiste en definir mtodos distintos, que comparten el mismo nombre, pero que se aplican a clases diferentes. Por ejemplo, un mtodo llamado breathe puede responder de manera distinta dependiendo de quien lo invoque:

Cdigo class animal { public void breathe() { System.out.println("Respirar..."); } } class pez extends animal { public void breathe() { System.out.println("Burbujear..."); } } Si se invoca el mtodo breathe desde un objeto-perro, imprimir en pantalla "Respirar...", pero si es invocado desde un objeto-trucha, imprimir en pantalla "Burbujear...".

Otra forma de utilizar polimorfismo es mediante la sobrecarga de funciones: Cdigo: char convertir_numero_cadena(int valor, char cadena, int base) char convertir_numero_cadena(long valor, char cadena, int base) En este caso, cuando se invoca la funcin, el compilador debe analizar los argumentos de la llamada y, en funcin de su tipo, deducir cual de las distintas versiones del mtodo con ese nombre debe recibir el control.

2) Soporte para el desarrollo en Java

2.1) JDK (Java Development Kit) Es el entorno de desarrollo para aplicaciones Java. Se define como el conjunto de

herramientas, utilidades, documentacin y ejemplos para desarrollar aplicaciones Java.


Componentes del JDK: 2.1.1) JRE (Java Runtime Enviroment) Es el entorno de ejecucin para aplicaciones Java. Se define como el intrprete en tiempo de ejecucin. Para ejecutar un archivo de clase Java *.class, la sintaxis es la siguiente: Cdigo: java [opciones] clase_a_ejecutar [argumentos] - opciones: se especifican las opciones relacionadas con la forma en que el intrprete Java ejecutar la aplicacin. - clase_a_ejecutar: ser el nombre de la clase *.class principal que contiene el mtodo main(). - argumentos: se especifican los argumentos que recibir el mtodo main(String[] args), por si la aplicacin necesita parmetros de ejecucin. Por supuesto, es necesario haber compilado la aplicacin antes de ejecutarla. 2.1.2) Compilador Permite compilar archivos de cdigo fuente Java *.java en archivos de clases Java ejecutables *.class. Se crea un archivo de clase para cada archivo de cdigo fuente que contiene la aplicacin.

Para compilar un archivo de cdigo fuente Java *.java, la sintaxis es la siguiente: Cdigo: javac [opciones] codigo_fuente_a_compilar - opciones: se especifican las opciones de compilacin - codigo_fuente_a_compilar: ser el nombre del archivo de cdigo fuente *.java a compilar 2.1.3) Visualizador de applets Es una herramienta que permite visualizar los applets tal y como se mostraran el navegador. Al ser llamado, muestra una ventana con el contenido del applet. Para visualizar un applet, la sintaxis es la siguiente: Cdigo: appletviewer [opciones] applet - opciones: se especifican las opciones para ejecutar el applet Java. - applet: especifica la ruta que contiene una pgina HTML con el applet Java empotrado. 2.1.4) Depurador Es una utilidad de comandos que permite depurar aplicaciones Java. Permite encontrar los errores en el cdigo fuente de la aplicacin Java. Para depurar un cdigo fuente Java, la sintaxis es la siguiente: Cdigo: jdb [opciones]

2.1.5) Desensamblador de archivos de clase Permite desensamblar un archivo de clase, mostrando los atributos y mtodos de la clase desensamblada. Es til cuando no se tiene el cdigo fuente de una clase de la que se quiere saber cmo fue codificada.

Para desensamblar un archivo de clase, la sintaxis es la siguiente: Cdigo: javap [opciones] [nombres_de_clases_a_desensamblar] - opciones: se especifica la forma en la que se han de desensamblar las clases. - nombres_de_clases_a_desensamblar: especifica la ruta de las clases a desensamblar, separadas por espacios. 2.1.6) Ms componentes como el Generador de cabecera y archivo de apndice, generador de documentacin, etc.

CICLO DE VIDA DE UNA APLICACIN JAVA BSICA Edicin del cdigo fuente en un editor de textos (notepad, vi...) -> Codigo fuente Java: MiClase.java -> -> Compilacin: javac MiClase -> Codebyte Java: MiClase.class -> -> Ejecucin del programa: java MiClase -> Salida del programa

2.2) Obtener e instalar el JDK Se puede obtener el JDK en http://java.sun.com, concretamente http://java.sun.com/j2se/1.4.2/download.html Necesitamos descargarnos el SDK (Software Developmente Kit), el cual ya incluye el JRE (Java Runtime Environment), as que pinchamos en Download J2SE SDK. Posteriormente, elegiremos la plataforma de sistema operativo que vayamos a utilizar. Aviso: Windows Offline Installation, Multi-language (j2sdk-1_4_2_05-windows-i586p.exe) -> 51.0 MB Para usuarios de Windows, despus de haber instalado el SDK, vamos a agregar la carpeta bin al PATH del sistema de forma que podamos usar todos los comandos del SDK/JRE desde cualquier carpeta del sistema...

Inicio > Panel de Control > Sistema > Opciones Avanzadas > Variables de Entorno. En Variables del Sistema, seleccionamos Path y pinchamos en Modificar. Agregamos -> ;C:\j2sdk1.4.2_05\bin al final del todo y Aceptar, Aceptar, Aceptar. [Nota: adaptad esta linea a vuestra ruta donde habis instalado el SDK]. Ahora, desde cualquier carpeta del sistema, podemos ejecutar los comandos de consola del SDK/JRE como java, javac, etc.

2.3) IDE (Indegrated Development Environment) Mientras que un JDK/SDK ofrece las herramientas para compilar y ejecutar aplicaciones Java, este no ofrece un entorno de trabajo cmodo para proyectos complejos. Los IDEs ofrecen un entorno de trabajo con aspecto grfico en los que se tiene acceso a un mayor nmero de herramientas avanzadas: gestin de workspaces y proyectos para clasificar las aplicaciones, debuggers ms elaborados, check-points durante la compilacin y ejecucin, "wizards" para acelerar el desarrollo, etc. Algunos IDEs: NetBeans Open-Source @ http://www.netbeans.org/ Eclipse Open-Source @ http://www.eclipse.org/ (muy bueno, pero consume muchos recursos) JBuilder de Borland @ http://www.borland.com/jbuilder/ Mi favorito: JCreator @ http://www.jcreator.com/

2.4) Cmo codificar, compilar y ejecutar una aplicacin Java Como no poda ser de otra forma, nuestra primera aplicacin Java mostrar por pantalla "Hola Mundo!". 2.4.1) Cmo codificar, compilar y ejecutar una aplicacin Java de manera clsica. Utilizaremos para ello un editor de texto plano como el notepad y los comandos de

consola del SDK y JRE. Lo primero es abrir el notepad y escribir el siguiente cdigo: Cdigo class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la

contiene
{

public static void main (String[] args) { System.out.println("Hola mundo!"); }

} Guardamos este archivo de cdigo fuente Java como c:\MiClase.java Procedemos a compilar: abrimos consola, vamos a c:\ y tecleamos: Cdigo: javac MiClase.java Con el proceso de compilacin, hemos obtenido el archivo de clase MiClase.class en la misma carpeta. Procedemos a ejecutar la aplicacin tecleando: Cdigo: java MiClase y obtenemos: Cdigo: Hola Mundo! Si obtienes Cdigo: Exception in thread "main" java.lang.NoClassDefFoundError: loquesea es q no lo has hecho exactamente como yo te he dicho!! 2.4.2) Cmo codificar, compilar y ejecutar una aplicacin Java a travs del IDE JCreator Una vez que ya tenemos JCreator listo para utilizar sin restricciones (ya me

entendis...), creamos un nuevo archivo de cdigo fuente Java para codificar nuestra primera aplicacin Java. Pinchamos en File > New > Files > Java File. En Location seleccionamos la carpeta destino donde queremos almacenar nuestra aplicacin. Despus, en la casilla nombre escribimos MiClase y damos a Aceptar. Ante nosotros aparecer la barra de mens, las barras de herramientas y tres ventanas: superior izqda. para la jerarqua de archivos en el workspace; inferior izqda. para la jerarqua de clases y mtodos; ventana grande al centro-dcha. para escribir el cdigo fuente. Por tanto, en esta ltima ventana, escribimos el siguiente cdigo Cdigo class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la

contiene
{

public static void main (String[] args) { System.out.println("Hola mundo!"); }

Procedemos a compilar la aplicacin: Men Build > Compile File y debera aparecer Process completed. en la ventana de abajo (informacin sobre el proceso de compilacin). Para ejecutar la aplicacin: Men Build > Execute File y debera aparecer una nueva ventana de consola con el texto Cdigo: "Hola Mundo!" Tamben podemos utilizar los iconos en las barras de herramientas para compilar y ejecutar.

3) Sintaxis de Java Java utiliza casi la misma sintaxis que C, para ms informacin -> Variables y Tipos

Una variable en Java es un identificador que representa una palabra de memoria que contiene informacin. El tipo de informacin almacenado en una variable slo puede ser del tipo con que se declar esa variable. Una variable se declara usando la misma sintaxis de C. Por ejemplo la siguiente tabla indica una declaracin, el nombre de la variable introducida y el tipo de informacin que almacena la variable: Declaracin identificador int i; String s; int a[]; int[] b; i s a b entero referencia a string referencia a arreglo de enteros referencia a arreglo de enteros tipo

Java posee dos grandes categoras de tipos para las variables: Tipos Primitivos referencias a Objetos

int, short, byte, long Strings char, boolean float, double Arreglos otros objetos

Las variables de tipos primitivos almacenan directamente un valor que siempre pertenece al rango de ese tipo. Por ejemplo una variable int almacena un valor entero como 1, 2, 0, -1, etc. Esto significa que al asignar una variable entera a otra variable entera, se copia el valor de la primera en el espacio que ocupa la segunda variable. Las variables de tipo referencia a objetos en cambio almacenan direcciones y no valores directamente. Una referencia a un objeto es la direccin de un rea en memoria destinada a representar ese objeto. El rea de memoria se solicita con el operador new.

Al asignar una variable de tipo referencia a objeto a otra variable se asigna la direccin y no el objeto referenciado por esa direccin. Esto significa que ambas variables quedan refenciando el mismo objeto. La diferencia entre ambas asignaciones se observa en la siguiente figura:

Esto tiene implicancias mayores ya que si se modifica el objeto referenciado por r, entonces tambin se modifica el objeto referenciado por s, puesto que son el mismo objeto.

En Java una variable no puede almacenar directamente un objeto, como ocurre en C y C++.
Por lo tanto cuando se dice en Java que una variable es un string, lo que se quiere decir en realidad es que la variable es una referencia a un string.

Tipos primitivos En la siguiente tabla se indica para cada tipo primitivo el nmero de bits que se emplea en su representacin y el rango de valores que se puede almacenar en las variables de estos tipos.

Tipo int short byte long

Bits 32 16 8 64

Rango -2**31 .. 2**31-1 -2**15 .. 2**15-1 -2**7 .. 2**7-1

Ejemplos 0, 1, 5, -120, ... 0, 1, 5, -120, ... 0, 1, 5, -120, ...

-2**63 .. 2**63-1 0, 1, 5, -120, ... n/a n/a IEEE IEEE false, true 'a', 'A', '0', '*', ... 1.2 1.2

boolean 1 char float double 16 32 64

Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de B. Esto quiere decir que las variales de tipo B siempre se pueden asignar a variables de tipo A (eventualmente con prdida de significancia). Por ejemplo int es de mayor rango que short, que a su vez es de mayor rango que byte. Float y double son de mayor rango que int. Double es de mayor rango que float. Esto se puede resumir en: double > float > long > int > short > byte Expresiones En Java cada expresin tiene un tipo que se determina durante la compilacin, es decir es independiente del valor durante la ejecucin. Una expresin puede ser:

Una constante: 1, 1.0, true, etc. El tipo de esta expresin es el tipo de la constante. En el ejemplo los tipos son int, double y boolean respectivamente.

Una variable: i, s, a

El tipo de esta expresin es el tipo con que se declar aquella variable. En el ejemplo los tipos son entero, referencia a string y referencia a arreglo.

El resultado de una operacin: i+1, a[1], etc. El tipo se determina en funcin de los tipos de las expresiones que se indican como argumentos de la operacin.

Java tiene prcticamente los mismos operadores de C y C++. Cada operador acepta una, dos o tres expresiones de diversos tipos. A veces un operador no est definido para argumentos de ciertos tipos. Por ejemplo la resta entre strings no esta definida. Pero la suma de strings esta definida como la concatenacin. A continuacin veremos los operadores ms frecuentes en Java. Operadores binarios entre expresiones numricas Smbolo + * / % Operacin Suma Resta Multiplicacin Divisin Resto

Los operandos y el resultado de estos operadores pueden ser: Dominio int*int long*long float*float Rango int long float

double*double double

Al operar con byte y short, estos se convierten implcitamente a int.

Cuando los tipos de los operandos no coinciden, el operando de menor rango se convierte implcitamente al tipo de mayor rango. El resultado de la operacin es del tipo de mayor rango.

Ejemplos: int a=1, b=2; int c= a + b; short s= 1; int d= s + c; // s se convierte a int float f= 1.0 + a; // a se convierte a float

Operadores unarios sobre expresiones numricas Smbolo + exp - exp Operacin nada Argumento int | long | float | double

cambio de signo int | long | float | double

El resultado de estas operaciones es siempre del mismo tipo del operando. Si el operando es byte o short entonces se convierte a int, se realiza la operacin y el resultado es un int. Operadores sobre variables enteras Smbolo ++ var -- var var ++ var -Operacin preincremento predecremento postincremento Argumento int | short | byte | long int | short | byte | long int | short | byte | long

postdecremento int | short | byte | long

El resultado de estas operaciones es siempre del mismo tipo del operando. Ejemplos: int a=1, b=2; int c= +a; int d= -(c+1); b= a++; // b= 1, a=2 a= --b; // a=b= 0 (a+1)++; // error a+1 no es una variable float f= a; f++; // error f no es entero

Operadores binarios relacionales Smbolo Operacin > < >= <= == != mayor menor mayor igual menor igual igual distinto

Los operandos y el resultado de estos operadores pueden ser: Dominio int*int long*long Rango boolean boolean

float*float

boolean

double*double boolean

Operadores entre valores booleanos Operacin Significado exp && exp y-lgico exp || exp ! exp o-lgico negacin

Los operandos y el resultado de estos operadores son siempre booleanos. Los operadores && y || evalan la expresin del lado derecho slo si es necesario. Ejemplos: int a=1, b=2; boolean v= ! a<=b && a==5 || b!=4; boolean w= ((! a<=b) && a==5) || b!=4; boolean w2= a<=b && a; // error a no es boolean

Conversiones: cast

Java realiza conversiones implcitas de menor a mayor rango. Eventualmente hay prdida de significacia al convertir enteros a punto flotante. Todas las conversiones de mayor a menor rango deben ser explcitas por medio del operador de cast: (tipo)expresin

Ejemplos: int i= 1; short s= 2; int j= i+s; s= a; // error short < int s= (short)a; // Ok i= 1.0; // error int < double i= (int)1.0; // Ok f= 1.0; // error float < double f= (float)1.0; // Ok f= 1.0f; // Ok boolean v=(boolean)a; // error no existe conversin

Precedencia de Operadores . () [] unarios: - + (cast) */% +< > <= >= == != ! || &&

4) Ejemplo de Aplicacin Bsica en Java La siguiente aplicacin sirve para mostrar, de forma prctica, los conceptos de clases, objetos, atributos, mtodos, herencia... La aplicacin en s se divide en 3 clases: - La clase Exploit que define los atributos y mtodos de los objetos-Exploit - La clase WinExploit, heredada de la clase Exploit. Hereda los mismos atributos y mtodos que la clase Exploit y, a su vez, define nuevos atributos y mtodos a implementar. - La clase app, que contiene el mtodo Main para la ejecucin de la aplicacin (clase principal). En esta clase se crean 2 objetos-Exploit y 2 objetos-WinExploit invocando a los mtodos Constructores de sus respectivas clases. Tambin accede a los objetos creados a travs de sus mtodos getters y setters.

Clase Exploit Cdigo class Exploit {

//Definimos las variables o atributos


String Autor; String Vulnerabilidad; String Lenguaje;

//Constructor - Construye el objeto-exploit e identifica sus atributos //con los parmetros recibidos.
Exploit(String a, String v, String l) { Autor = a; Vulnerabilidad = v; Lenguaje = l; }

//Mtodos
String getAutor() { return Autor; //Devuelve autor } String getVulnerabilidad() { return Vulnerabilidad; } String getLenguaje() { return Lenguaje; } String getInfoComun() //Devuelve toda la informacin de golpe { return ("\tAutor: " + Autor + "\n\tVulnerabilidad : " + Vulnerabilidad + "\n\tLenguaje: " + Lenguaje); }

int setOffset(String o) {

System.out.println("\n\n[*] Implementando la direccion offset " + o + " en el exploit...\n");

//Se implementa el parmetro offset en la funcin que se quiera

//Un ejemplo de esta implementacin: //Se configura el cdigo del exploit en C para que necesite como // parmetro de entrada la direccion offset. Este mtodo de la // aplicacin Java, realizara una llamada externa al ejecutable

offset

// del exploit y le pasara como parmetro de entrada, este

//Si se ha implementado con exito, el mtodo devuelve 0.


return (0); } }

Clase WinExploit Cdigo class WinExploit extends Exploit {

//Adems de disponer de los atributos heredados de la clase padre... //Definimos las nuevas variables o atributos a aadir
String CodigoMS;

//Constructor - Construye el objeto-exploit e identifica sus atributos con los parmetros recibidos.
WinExploit(String a, String v, String l, String cms) { super(a,v,l); //Estos atributos son implementados por el CodigoMS = cms;

constructor de la clase padre


}

//Adems de disponer de los mtodos heredados de la clase padre... //Definimos los nuevos mtodos

String getCodigoMS() { return CodigoMS; } String getInfoWin() //Devuelve toda la informacin de golpe { String s; s = this.getInfoComun() + "\n\tCogigo MS: " + CodigoMS; return s; }

Clase app Cdigo class app { public static void main (String[] args) {

Exploit e1 = new Exploit ("Lion", "Serv-U FTPD SITE CHMOD Command Stack Buffer Overflow", "C"); Exploit e2 = new Exploit ("fiNis", "Jordan Telnet Server Buffer

//Creamos dos objetos-Exploit llamando al Constructor

Overflow", "C");

WinExploit w1 = new WinExploit ("Wirepair", "Windows Workstation Service WKSSVC.DLL Buffer Overflow", "C", "MS03-049");

//Creamos dos objetos-WinExploit llamando al Constructor

WinExploit w2 = new WinExploit ("HoD", "Lsasrv.dll RPC buffer overflow", "C", "MS04-011");

de dos formas)

//Imprimimos las caractersticas de los objetos (se puede hacer

System.out.println("\nInfo de e1\n"); System.out.println("\tAutor: " + e1.getAutor()); System.out.println("\tVulnerabilidad: " + e1.getVulnerabilidad()); System.out.println("\tLenguaje: " + e1.getLenguaje()); System.out.println("\n\nInfo de e2\n"); System.out.println(e2.getInfoComun());

System.out.println("\nInfo de w1\n"); System.out.println("\tAutor: " + w1.getAutor()); System.out.println("\tVulnerabilidad: " + w1.getVulnerabilidad()); System.out.println("\tLenguaje: " + w1.getLenguaje()); System.out.println("\tCodigo MS: " + w1.getCodigoMS()); System.out.println("\n\nInfo de w2\n"); System.out.println(w2.getInfoWin()); int resultado = w2.setOffset("0x7517123c"); if (resultado == 0) { System.out.println("[!] La direccion offset se implemento } else {

con exito\n");

la direccion offset\n"); } } } herencia y polimorfismo

System.out.println("[!] Error durante la implementacion de

También podría gustarte