elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 ... 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 ... 235
691  Programación / Programación C/C++ / Re: terminar programa si no hay mas datos en: 27 Agosto 2017, 16:32 pm
Espero que te sirviera, te soy sincero aunque se que es mas facil, no me gusta trabajar con C++, Encontre esto en stackoverflow

Código
  1. string line;
  2.  
  3. while (getline(cin, line)) {
  4.    // do something with the line
  5. }
692  Programación / Programación C/C++ / Re: terminar programa si no hay mas datos en: 27 Agosto 2017, 16:27 pm
Bueno dado que estas trabajando con C++ y no con C, hay que buscar una funcion en C++ que lea una linea completa al princio del ciclo y ver si la linea que lee SI tiene dados, si los tiene hay que separarlos a numeros individuales y si no los tiene entonces terminamos el programa.

Saludos!
693  Programación / Programación C/C++ / Re: terminar programa si no hay mas datos en: 27 Agosto 2017, 16:20 pm
De nada, claro que si
694  Seguridad Informática / Wireless en Linux / Re: Problema en la versión del Wifislax64-1.1 final en la herramienta Reaver en: 27 Agosto 2017, 16:10 pm
No hace nada? ni marca error?
695  Foros Generales / Foro Libre / Re: Foro de Criptomonedas en: 27 Agosto 2017, 16:09 pm
+1

Tengo bastantes cosas que discutir ahi, en lo referente a la criptografia interna de las criptomonedas xD
696  Programación / Programación C/C++ / Re: terminar programa si no hay mas datos en: 27 Agosto 2017, 16:07 pm
Código
  1. entrar = true;
  2. do{
  3. fgets(buffer,1000,stdin);
  4. if(strlen(buffer) > X) { // O numero de tokens segun sea el caso
  5. //Hacer Ciclo
  6. }
  7. else{
  8. entrar = false;
  9. }
  10. }while(entrar)
697  Programación / Programación C/C++ / Dejen de usar rand() en C/C++ o los van a Hackear en: 27 Agosto 2017, 15:37 pm
Dejen de usar rand() en C/C++ o los van a HACKEAR  :silbar:

Obviamente nadie usa la funcion rand() en programas del mundo real, ¿o si?

No se si colocar esto aqui o en criptografia o hacking. El tema trata de atacar una implementacion DEBIL de numeros random.

El ataque no es complejo, para el ejemplo mostrado pero muestra el peligro de las aplicaciones que usan numeros aleatorios debiles o predecibles.

Hace mas de una año en el foro publique un pequeño codigo del Juego Piedra Papel y Tijera: [Aporte] Piedra Pape y Tijera - Mini-Autómata + Ejercicio [1]

En ese ejemplo como originalmente lo hice para un video tutorial use por comodidad la funcion rand() que viene por defecto en las librerias estandar de muchas implementaciones y para no meter a los que se estan iniciando en temas de seguridad complejos, decidi usar esa funcion sabiendo que no es tan segura. Sin embargo no me habia dado cuenta de la gravedad de los numeros arrojados por rand aun inicializando con la semilla del tiempo. En cualquier caso lo numeros que arroja se pueden calcular usando la misma funcion rand()  :xD

En un entorno donde no se tiene acceso al codigo fuente de un programa, es posible (dependiendo de lo que el programa realize) tratar de adivinar que procesos internos realiza el programa en especial cuando involucra numeros aleatorios.

Veamos el ejemplo del piedra papel y tijera:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #include<time.h>
  5.  
  6. char *cadenas[] = {"Piedra","Papel","Tijera"};
  7.  
  8. //0 empate
  9. //1 Pierde Usuario
  10. //2 Gana Usuario
  11. //Filas Computadora
  12. //Columas Usuario
  13.  
  14. char tabla_resultados[3][3] =
  15. {
  16. {0,2,1},
  17. {1,0,2},
  18. {2,1,0}
  19. };
  20.  
  21. char *resultado[] = {"Empate","Gana la COMPUTADORA","Gana el USUARIO"};
  22.  
  23. int main() {
  24. char buffer[10];
  25. char *error = NULL;
  26. bool entrar = true;
  27. bool jugado = false;
  28. int usuario = 0;
  29. int computadora = 0;
  30. srand(time(NULL));
  31. do {
  32. computadora = rand() % 3;
  33. do { //Entramos en este ciclo hasta que el usuario juege o decida salir para no afectar el valor rand del ejemplo
  34. printf("1) Piedra\n");
  35. printf("2) Papel\n");
  36. printf("3) Tijera\n\n");
  37. printf("S) Salir\n\n");
  38. printf("Seleccione una opcion:");
  39. fgets(buffer,5,stdin);
  40. usuario = (int) strtol(buffer,&error,10);
  41. if(error[0] == 's' || error[0] == 'S') {
  42. entrar = false;
  43. jugado = true;
  44. }
  45. else{
  46. if(usuario <=3 && usuario >= 1){
  47. usuario--; //Le restamos uno al input para poder usarlo en una tabla de estados con index 0
  48. jugado = true;
  49. printf("Usuario %s vs Computadora %s\n",cadenas[usuario],cadenas[computadora]);
  50. printf("Resultado: %s\n",resultado[tabla_resultados[computadora][usuario]]);
  51. }
  52. else {
  53. printf("Seleccione una opcion correcta\n");
  54. jugado = false;
  55. }
  56. }
  57. }while(!jugado);
  58. }while(entrar);
  59. }
  60.  


Veamos las partes importantes:

Código
  1. srand(time(NULL));

Se inicializa el random con la semilla del tiempo como lo haria cual quier persona que esta aprendiendo a programar con numeros aleatorios.
El codigo mostrado lo escribi para compilarlo con GCC pero deberia de funcionar en otros compiladores de C sin muchos cambios.

Código
  1. computadora = rand() % 3;

La computadora usa funcion rand() y le aplica modulo al resultado para obtener valores validos del 0 al 2.

Pues bien para ejemplo es todo lo que necesitamos saber. Bajo la premisa de que el/los programas usan la semilla del tiempo actual en Segundos desde el primero de enero de 1970 [2]

Entonces en otro programa de C podemos buscar todas las semillas de tiempo en un rango determinado y obtener primeras salida de cada una de ellas.

Ejemplo tomemos la fecha de hoy en el formato devuelto por la funcion time(), desde [3] lo podemos obtener para hoy es:

1503838078

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #include<time.h>
  5.  
  6. int main() {
  7. int i = 0;
  8. int resultado = 0;
  9. srand(1503838078);
  10. while(i < 10) {
  11. resultado = rand() % 3;
  12. printf("Resultado: %i\n",resultado);
  13. i++;
  14. }
  15. }


Salida

Código:
% ./testrand
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1
Resultado: 1
Resultado: 1
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1

% ./testrand
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1
Resultado: 1
Resultado: 1
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1

Como vemos la salida del programa es la misma en ambas ocasiones aunque se ejecuta con segundos de diferencia, posiblemente esto le paso a alguien que uso rand sin inicializar el srand, pero no le dio importancia.

¿Ahora que?

El hecho es que podemos reinicializar srand en cualqueir momento del codigo y la salida de rand va a ser la correspondiente a cada semilla ejemplo:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #include<time.h>
  5.  
  6. int main() {
  7. int i = 0;
  8. int resultado = 0;
  9. srand(1503838078);
  10. while(i < 5) {
  11. resultado = rand() % 3;
  12. printf("Resultado: %i\n",resultado);
  13. i++;
  14. }
  15. srand(1503838079);
  16. i = 0;
  17. while(i < 5) {
  18. resultado = rand() % 3;
  19. printf("Resultado: %i\n",resultado);
  20. i++;
  21. }
  22. srand(1503838078);
  23. i = 0;
  24. while(i < 5) {
  25. resultado = rand() % 3;
  26. printf("Resultado: %i\n",resultado);
  27. i++;
  28. }
  29. }


Noten el cambio de srand de 1503838078 -> 1503838079 -> 1503838078 por lo cual la primeras 5 salidas van a ser iguales a las 15 ultimas


Salida

Código:
% ./hackrand
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1
Resultado: 1
Resultado: 0
Resultado: 2
Resultado: 0
Resultado: 2
Resultado: 1
Resultado: 2
Resultado: 0
Resultado: 0
Resultado: 1
Resultado: 1

Ya con esta salida sabemos que podemos calcular cualquier salida de rand() en cualquier momento conociendo o calculando la semilla inicial

Pues bien es momento de ganarle al Piedra papel y tijera perdiendo  solo los primeros 2 o 3 juegos y en base a estos tratar de calcular cual fue la semilla utilizada.

Hice un programa que que te muestra las salidas de rand ya con X modulo de las semillas +/- 10 al tiempo actual y apartir de ahi elijes cual semilla continuar viendo Y asi sabremos que jugada va a hacer la computadora  antes de tiempo y poderle ganar:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #include<time.h>
  5.  
  6.  
  7. int main(int argc, char **argv) {
  8. bool entrar,continuar,seleccione;
  9. char buffer[10];
  10. char *error = NULL;
  11. unsigned int tiempo = 0;
  12. unsigned int base = 0;
  13. int numero = 0;
  14. int resultado = 0,i = 0,j = 0;
  15. int divisor = 0;
  16. if(argc == 2) {
  17. divisor = (int )strtol(argv[1],&error,10);
  18. if(error[0] == 0) {
  19. tiempo = time(NULL);
  20. printf("Valor actual del tiempo %u\n",tiempo);
  21. printf("Calculando modulos en +/- 10\n");
  22. base = tiempo -10;
  23. j = 0;
  24. while( ( base + j) < (tiempo +10)) {
  25. srand(base + j);
  26. printf("Opcion %i:",j+1);
  27. i = 0;
  28. while(i < 10) {
  29. resultado = rand() % divisor;
  30. printf(" %i,",resultado);
  31. i++;
  32. }
  33. printf("\n");
  34. j++;
  35. }
  36. printf("Opcion S: Salir\n");
  37. do {
  38. seleccione = false;
  39. printf("Seleccione una opcion:");
  40. fgets(buffer,5,stdin);
  41. numero = (int)strtol(buffer,&error,10);
  42. if(error[0] == 's' || error[0] == 'S') {
  43. entrar = false;
  44. }
  45. else {
  46. if(numero >= 1 && numero <= 20) {
  47. continuar = true;
  48. numero--; //Restamos para compensar el +1 en el menu
  49. srand(base + numero);
  50. i = 0;
  51. while(i < 10) {
  52. resultado = rand();
  53. i++;
  54. }
  55. printf("Numeros siguientes en la secuencia seleccionada\n");
  56. do {
  57. i = 0;
  58. while(i < 5) {
  59. resultado = rand() % divisor;
  60. printf("%i, ",resultado);
  61. i++;
  62. }
  63. printf("\n");
  64. printf("+) Imprimir mas numeros\n");
  65. printf("S) Salir\n\n");
  66. printf("Seleccione: ");
  67. fgets(buffer,5,stdin);
  68. switch(buffer[0]) {
  69. case 's':
  70. case 'S':
  71. continuar = false;
  72. break;
  73. case '+':
  74. continuar = true;
  75. break;
  76. }
  77. }while(continuar);
  78. }
  79. else {
  80. seleccione = true;
  81. }
  82. }
  83. }while(seleccione);
  84. }
  85. }
  86. else {
  87. printf("Usar: %s <divisor>\n",argv[0]);
  88. }
  89. }
  90.  

Ejecitamos el programa para forcebrutear el srand con el parametro del modulo que estan aplicando:

Código:
% ./crack_rand.exe 3
Valor actual del tiempo 1503839464
Calculando modulos en +/- 10
Opcion 1: 2, 0, 0, 0, 0, 1, 2, 1, 0, 1,
Opcion 2: 2, 0, 0, 1, 1, 1, 0, 2, 1, 0,
Opcion 3: 2, 0, 1, 2, 2, 0, 2, 0, 0, 2,
Opcion 4: 0, 2, 0, 0, 0, 0, 1, 1, 1, 1,
Opcion 5: 0, 2, 0, 1, 1, 0, 0, 1, 1, 2,
Opcion 6: 0, 2, 2, 2, 2, 0, 1, 2, 1, 1,
Opcion 7: 0, 2, 2, 0, 0, 2, 2, 0, 1, 0,
Opcion 8: 1, 1, 1, 1, 0, 2, 1, 1, 1, 2,
Opcion 9: 1, 1, 2, 2, 2, 0, 2, 0, 2, 1,
Opcion 10: 1, 1, 1, 0, 2, 0, 1, 1, 2, 2,
Opcion 11: 1, 0, 1, 1, 0, 2, 2, 2, 2, 1,
Opcion 12: 2, 1, 0, 0, 1, 2, 1, 2, 2, 0,
Opcion 13: 2, 0, 0, 0, 2, 2, 2, 0, 2, 2,
Opcion 14: 2, 2, 0, 1, 0, 1, 1, 1, 2, 0,
Opcion 15: 2, 0, 0, 0, 0, 1, 0, 2, 0, 1,
Opcion 16: 0, 2, 0, 1, 2, 1, 2, 2, 2, 0,
Opcion 17: 0, 2, 2, 1, 2, 2, 0, 0, 0, 2,
Opcion 18: 0, 2, 2, 0, 0, 1, 1, 1, 2, 1,
Opcion 19: 1, 1, 1, 1, 2, 1, 0, 2, 0, 0,
Opcion 20: 1, 1, 2, 1, 2, 1, 1, 1, 2, 2,
Opcion S: Salir
Seleccione una opcion:

Ejecutamos el progrma de priedra papel o tijera y si bien muchas veces no tenemos acceso al codigo fuente, hay cosas que se pueden determinar  con un poco de imaginacion y conocimientos de programacion.

Código:
% ./ppt
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:1
Usuario Piedra vs Computadora Piedra
Resultado: Empate
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:1
Usuario Piedra vs Computadora Tijera
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:1
Usuario Piedra vs Computadora Tijera
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:1
Usuario Piedra vs Computadora Piedra
Resultado: Empate
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:2
Usuario Papel vs Computadora Piedra
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:3
Usuario Tijera vs Computadora Papel
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:3
Usuario Tijera vs Computadora Papel
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:3
Usuario Tijera vs Computadora Papel
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:1
Usuario Piedra vs Computadora Tijera
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:3
Usuario Tijera vs Computadora Papel
Resultado: Gana el USUARIO
1) Piedra
2) Papel
3) Tijera

S) Salir

Seleccione una opcion:


Despues de los primeros intentos del programa: podemos darnos cuenta que la secuencia que se esta jugando es la 7 o la 18 del ejemplo

Código:
Opcion 7: 0, 2, 2, 0, 0, 2, 2, 0, 1, 0,
Opcion 18: 0, 2, 2, 0, 0, 1, 1, 1, 2, 1,

Y vemos que en los ultimos juegos Gane todos los piedra papel tijera que jugue.

Si bien es cierto que sin el codigo fuente o binario decompilado no es podible saber la cantidad de veces que se llama a la funcion rand antes de que realmente inicie el programa, si es posible calcular  incluso darnos cuenta de que podemos tener una base de datos o programa que calcule los modulos adecuados y tarde o temprano sabremos que semilla se utilizo para el caso de srand

Espero que dejen de usar srand y rand, buscando alguna funcion mas segura, si estan en Linux o un sistema libre, tendran siempre un /dev/random con bastantes numeros aleatorios muy dificiles de predecir.


¿Que alcance tiene esto?

Existen maquinas de juego electronico (bingo,loteria, balckjack) que utilizan funciones aleatorias y podria ser posible que alguna utilize rand() % X para algunos de sus calculos. Digo estas maquinas por que es probable que sus programadores se preocupen menos por la calidad de numeros generado, en maquinas de azar solo importa que los numeros sean uniformes (Todos con la misma probabilidad de salir) esto con el objetivo de calcular tablas de pagos adecuadas para la probabilidad de cada maquina.

Y pues temas se seguridad informatica como la generacion de passwords y otros usos de los numeros PseudoAlearorios, es recomendable buscar fuentes no predecibles de estos.

[1] https://foro.elhacker.net/programacion_cc/aporte_piedra_pape_y_tijera_miniautomata_ejercicio-t454850.0.html
[2] https://www.freebsd.org/cgi/man.cgi?query=time&sektion=3
[3] https://www.epochconverter.com/
698  Comunicaciones / Redes / Re: ayuda urgente. modem tp-link td-8816 en: 27 Agosto 2017, 14:26 pm
Hace tiempo unos 10 años mas o menos, me tope con algo similar el router no hacia su trabajo. En ese tiempo era culpa del firmware, lo actualize y funciono. Prueba actualiar o el firmware o si ya esta actaulizado bajar a una version mas baja.

Que pruebas has realizado?

Intenta hacer un tracer a 192.168.1.1 a ver donde se para el paquete.

Saludos
699  Comunicaciones / Redes / Re: ayuda urgente. modem tp-link td-8816 en: 27 Agosto 2017, 07:16 am
Tienes la oportunidad de colocar alguna pantalla de la configuracion de tu router tp-link

Posiblemente esta mal configurado, el firmware no funciona o algun otro desperfecto.

El router TP link tiene un puerto de color distinto que sea exclusivo para internet?

Saludos!
700  Comunicaciones / Redes / Re: ayuda urgente. modem tp-link td-8816 en: 27 Agosto 2017, 04:03 am
Debe de existir algun conflicto con las direccion IP.

Que ip tiene tu router y que IP tiene el Modem que te instalo el ISP?

Salduos!
Páginas: 1 ... 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines