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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18
71  Programación / Programación C/C++ / Mejor forma de procesar una cadena de formato [Cantidad de memoria] en: 16 Septiembre 2016, 00:12 am
Buenas!!

Estoy haciendo un pequeño servidor WEB en C, algo basico y como ejercicio, ya que este algo pulido dejare el link al codigo por aqui.


El detalle que me encuentro es que quiero crear una función de argumentos variables asi como el printf donde le ahorre al usuario "final" ( :rolleyes: :rolleyes:) el reservar memoria para el buffer de respuesta al cliente. para ello solo creare una función llamada "server_print" donde el usuario colocara su formato de cadena y las variables que el quiera. Y que la función haga el trabajo duro...

session es un contenedor de variables auxiliares y ese de momento, se puede obviar...

Código
  1. void server_print(struct peticion *session,char *format,...) {
  2. char *buffer = NULL;
  3. int X;
  4. va_list args;
  5. va_start(args, format);
  6. buffer =malloc(X);
  7. vsnprintf(buffer,X,format, args);
  8.  
  9. //realizar operaciones sobre session...
  10.  
  11.  
  12. va_end(args);
  13. }
  14.  

Lo que me interesa saber es el cuando debe de valer X para reservar esa cantidad de memoria exacta.. el detalles esta en que puedo ahórrame el "pensar" y asignar MUCHA memoria por cada argumento del programa, pero el detalle esta en que:

¿Que pasa si no alcanza?

Quiero tener un programa eficiente que no malgaste memoria y sea rápido...

Se me ocurre buscar en la cadena de formato por cada % que se encuentre y por ejemplo si es un Entero reservar solo 12 bytes mas, si es cadena sacar el strlen del argumento en cuestion, si es %l dejar sobre 30 bytes mas y asi...

¿Como procederían ustedes?

Saludos!
72  Foros Generales / Foro Libre / ¿Cuantos trackers puede tener un torrent? en: 15 Septiembre 2016, 00:24 am
Estoy desarrollando una app y ahora tengo que poner un limite al numero de trackers que puede tener un torrent.

En teoria no debería de tener limite lo se, pero si vemos la mayoria de los links magnet en TPB solo vienen con unos 3 o 5 trackers

Pero no encuentro ningun documento que especifique un limite claro.

En mi caso he optado por 16 trackers esto solo lo pregunto para optimizar el tamaño de almacenamiento, ya en ejecucion puede crecer lo que sea necesario.

Saludos
73  Programación / Programación C/C++ / Validando peticion GET manualmente en: 13 Septiembre 2016, 20:36 pm
Buen dia estoy desarrollando un pequeño servidor en C para un proyecto que tengo.

Ya tengo buena parte trabajado, pero me gustaria consultarles si existen mas cosas que deba de validar en una peticion GET  el ejemplo que mas o menos tengo del codigo es el siguiente:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define KB 1024
  6.  
  7. int main() {
  8. char *type,*resource,*protocol,*extra,*hasQuery,**values = NULL,*key,*value,*aux;
  9. int values_count= 0,i;
  10. char *temp = malloc(KB);
  11. strcpy(temp,"GET /LALALA/xD.txt?q=xD&XD HTTP/1.1");
  12. type = strtok(temp," ");
  13. resource = strtok(NULL," ");
  14. protocol = strtok(NULL," ");
  15. extra = strtok(NULL," ");
  16. printf("type = %p: %s\n",type,type);
  17. printf("resource = %p: %s\n",resource,resource);
  18. printf("protocol = %p: %s\n",protocol,protocol);
  19. printf("extra = %p\n",extra);
  20. hasQuery = strstr(resource,"?");
  21. if(hasQuery) {
  22. printf("query = %p: %s\n",hasQuery,hasQuery);
  23. aux =  strtok(hasQuery+1,"&");
  24. do {
  25. if(aux) {
  26. values = realloc(values,sizeof(char*)*(values_count+1));
  27. values[values_count] = aux;
  28. printf("values: %s\n",values[values_count]);
  29. values_count++;
  30. }
  31. aux =  strtok(NULL,"&");
  32. }while(aux);
  33. i = 0;
  34. while(i < values_count) {
  35. key = strtok(values[i],"=");
  36. value = strtok(NULL,"");
  37. //Aqui salvo los valores key y value para su posterior uso
  38. printf("Key: %s\nValue: %s\n",key,value);
  39. i++;
  40. }
  41. }
  42. else
  43. printf("query = %p\n",hasQuery);
  44. if(values)
  45. free(values);
  46. if(temp) {
  47. free(temp);
  48. }
  49. }
  50.  
  51.  

Estoy releyendo el protocolo del HTTP y estoy validando de momento solo la primera LINEA de la peticion.

Saludos!
74  Seguridad Informática / Criptografía / I lost my OPENBSD FDE Password en: 31 Agosto 2016, 15:42 pm
Demostracion de como recuperan el block key material para descifrar el Disco Duro


Código
  1. func main() {  
  2.    scmKey := decode(scmKey)
  3.    salt := decode(salt)
  4.  
  5.    maskkey := pbkdf2.Key([]byte("password"), salt, rounds, 32, sha1.New)
  6.  
  7.    // AES-ECB-256_decrypt(k=maskkey, scm_key) = scr_key
  8.    a, err := aes.NewCipher(maskkey)
  9.    if err != nil {
  10.        log.Fatal(err)
  11.    }
  12.    for i := 0; i < len(scmKey); i += a.BlockSize() {
  13.        a.Decrypt(scmKey[i:i+a.BlockSize()], scmKey[i:i+a.BlockSize()])
  14.    }
  15.  
  16.    // HMAC-SHA1(k=maskkey, scm_key) == sch_mac
  17.    h := sha1.Sum(maskkey)
  18.    mac := hmac.New(sha1.New, h[:])
  19.    mac.Write(scmKey)
  20.    expectedMAC := mac.Sum(nil)
  21.  
  22.    fmt.Print(hex.Dump(expectedMAC))
  23. }

El link con la lectura completa en Ingles:

https://blog.filippo.io/so-i-lost-my-openbsd-fde-password/
75  Foros Generales / Foro Libre / ¿Algoritmo? de Sistema de Votación en: 30 Agosto 2016, 16:40 pm
Hola que tal estoy desarrollando una plataforma, donde se requiere cierta moderación de contenido,  asi como el foro, con moderadores de distintos Rangos y privilegios....

El detalle es que esta plataforma es semi-automata, entonces estoy buscando si existe algún sistema de votación o similar para realizar ciertas Acciones.

Por ejemplo si quiero aprobar cierto contenido y/o eliminarlo o lo que fuese, la idea seria que lo moderadores votaran por realizar X acción, pero como NO siempre van a estar todos los moderadores en linea, la idea es que el sistema tenga un ALGORITMO que con determinado numero de votos y variables, determinara si realizar la acción o no.

Puedo realizar mi propio algoritmo con los parámetros que necesito, pero la idea es ver si existe algo parecido.

Es como una especie de Democracia Ateniense

Saludos!
76  Programación / Programación C/C++ / Sorteo/Loteria Simulaciones y cambios de Variable en: 29 Agosto 2016, 18:36 pm
El siguiente codigo simula un Sorteo/Loteria 10 Millones de veces tomando 30 muestras de estas simulaciones obtenemos un Valor de veces que se gano el sorteo.

El jugador elige un numero y en cada ciclo se sortean otro Numero si el numero es igual al del jugador este GANA.


Se realizan 2 Tipos de Sorteos:

  • Uno donde el jugador conserva el MISMO numero todas las simulaciones.
  • El otro donde el jugador CAMBIA el numero en cada simulación

Salida Obtenida en 4 ejecuciones:

Código:
Total de veces ganador CON cambio de Variable 30636/(300000000 Sorteos)
Total de veces ganador SIN cambio de Variable 27675/(300000000 Sorteos)
Total de veces ganador CON cambio de Variable 30396/(300000000 Sorteos)
Total de veces ganador SIN cambio de Variable 36592/(300000000 Sorteos)
Total de veces ganador CON cambio de Variable 30700/(300000000 Sorteos)
Total de veces ganador SIN cambio de Variable 36890/(300000000 Sorteos)
Total de veces ganador CON cambio de Variable 30635/(300000000 Sorteos)
Total de veces ganador SIN cambio de Variable 27460/(300000000 Sorteos)

Si Observamos en total son 300 Millones de simulaciones 2 veces en cada ejecución, si vemos el "promedio" se mantiene mas o menos constante cuando SI CAMBIA la variable.

y el "promedio" se varia entre ejecuciones cuando NO CAMBIA la variable.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. #define MUESTRAS 30
  6. #define SIMULACIONES 10000000
  7. #define MAX 60000
  8.  
  9. int main() {
  10. register int i = 0,j = 0;
  11.  
  12. int elegido,premio, contador = 0;
  13. srand(time(NULL));
  14.  
  15. //Sorteos con cambio de Variable
  16. j = 0;
  17. while(j < MUESTRAS){
  18. i = 0;
  19. while(i < SIMULACIONES) {
  20. elegido = rand() % MAX; // La variable elegida cambia en cada sorteo
  21. premio = rand() % MAX;
  22. if(elegido == premio) {
  23. contador++;
  24. }
  25. i++;
  26. }
  27. j++;
  28. }
  29. printf("Total de veces ganador CON cambio de Variable %i/(%i Sorteos)\n",contador,MUESTRAS*SIMULACIONES);
  30.  
  31.  
  32. //Sorteos SIN cambio de Variable
  33. j = 0;
  34. elegido = rand() % MAX; // La variable no cambia
  35. contador = 0;
  36. while(j < MUESTRAS){
  37. i = 0;
  38. while(i < SIMULACIONES) {
  39. premio = rand() % MAX;
  40. if(elegido == premio) {
  41. contador++;
  42. }
  43. i++;
  44. }
  45. j++;
  46. }
  47. printf("Total de veces ganador SIN cambio de Variable %i/(%i Sorteos)\n",contador,MUESTRAS*SIMULACIONES);
  48. return 0;
  49. }

Esto va de la mano con la siguiente pregunta:

¿Es bueno cambiar siempre de variable?

Tema relacionado:

Demostracion del problema de Monty Hall

Saludos
77  Programación / Programación C/C++ / Optimizar evaluación de juego de TATETI en: 29 Agosto 2016, 14:56 pm
Siguiendo con el tema de :

[C] Duda TATETI

en ese tema puse un codigo para Generar un Arbol de N niveles apartir de una jugada inicial

Ahora toca evaluar todos los nodos (Juegos) para asi poder decidir el mejor movimiento

Dada las siguientes definiciones y estructuras:

Código
  1. #define UNKNOW 0 //Nobody win yet
  2. #define O_WIN 1
  3. #define X_WIN 2
  4. #define DRAW 3
  5. #define ERROR 4
  6.  
  7. struct tablero {
  8. uint8_t juego[3][3];
  9. };
  10.  

Hice esta funcion que evalua las 3 Filas , 3 Columnas y 2 Diagonales. Adicional evaluar si es empate, si todavia nadie gana y si existe alguna discrepancia en el tablero

La pregunta aqui es, ¿Existe una forma mas eficiente de hacer esto?

Me refiero a que se me hace bastante pesado evaluar todas las lineas xD..

NOTA: No he compilado el codigo por lo que puedw tener errores.

Código
  1. uint8_t estatus_juego(struct tablero *t) {
  2. uint8_t e;  //Estatus a devolver
  3. register uint8_t i = 0,j = 0;
  4. uint8_t contador_X,contador_O,casilla;
  5. bool continuar = true;
  6. //Procedemos a validar las 3 Lineas horizontales
  7. i = 0;
  8. while(continuar && i < 3) {
  9. j = 0;
  10. casilla = t->juego[i][j];
  11. j++;
  12. while(continuar && j < 3 && ) {
  13. if(casilla != t->juego[i][j] || !t->juego[i][j]) {
  14. continuar = false;
  15. }
  16. j++;
  17. }
  18. if(continuar){
  19. //si continuar sigue siendo true en este punto el jugador casilla Gana y ya no es necesario evaluar los otros casos
  20. continuar = false; // Establemos continuar como false para que ya no entre al ciclo siguiente
  21. }
  22. else {
  23. //En caso de que continuar sea false, significa que debemos seguir evaluando las lineas restantes
  24. continuar = true // Establemos continuar como true para que si entre al ciclo siguiente
  25. }
  26. i++;
  27. }
  28. if(continuar) {
  29. //Continuamos la evaluacion de las lineas Verticales
  30. i = 0;
  31. while(continuar && i < 3) {
  32. j = 0;
  33. casilla = t->juego[j][i];
  34. j++;
  35. while(continuar && j < 3) {
  36. if(casilla != t->juego[j][i] || !t->juego[j][i] ) {
  37. continuar = false;
  38. }
  39. j++;
  40. }
  41. if(continuar){
  42. //si continuar sigue siendo true en este punto el jugador casilla Gana y ya no es necesario evaluar los otros casos
  43. continuar = false; // Establemos continuar como false para que ya no entre al ciclo siguiente
  44. }
  45. else {
  46. //En caso de que continuar sea false, significa que debemos seguir evaluando las lineas restantes
  47. continuar = true // Establemos continuar como true para que si entre al ciclo siguiente
  48. }
  49. i++;
  50. }
  51. if(continuar) { //Evaluamos las lineas Diagonales
  52. casilla = t->juego[0][0];
  53. if(casilla == t->juego[1][1] && casilla == t->juego[2][2] && casilla != 0) {
  54. if(casilla == 'X') {
  55. e = X_WIN;
  56. }
  57. else {
  58. e = O_WIN;
  59. }
  60.  
  61. }
  62. else {
  63. casilla = t->juego[0][2];
  64. if(casilla == t->juego[1][1] && casilla == t->juego[2][0]  && casilla != 0) {
  65. if(casilla == 'X') {
  66. e = X_WIN;
  67. }
  68. else {
  69. e = O_WIN;
  70. }
  71. }
  72. else {
  73. //Todavia nadie gana o es empate en caso de que ya no queden casillas libres
  74. contador_X = 0;
  75. contador_O = 0;
  76. i = 0;
  77. while(i < 3) {
  78. j = 0;
  79. while(j < 3) {
  80. if(t->juego[i][j] == 'X') {
  81. contador_X++;
  82. }
  83. else {
  84. if(t->juego[i][j] == 'O') {
  85. contador_O++;
  86. }
  87. }
  88. j++;
  89. }
  90. i++;
  91. }
  92. if(abs(contador_O-contador_X) > 1) {
  93. //ERROR de Tablero, no es posible que un jugador tenga 2 o mas 'fichas' que el otro en el tablero
  94. e = ERROR;
  95. }
  96. else {
  97. if(contador_X+contador_O < 9) {
  98. e = UNKNOW;
  99. }
  100. else {
  101. e = DRAW;
  102. }
  103. }
  104. }
  105. }
  106. }
  107. else {
  108. //En este punto evaluamos quien gano
  109. if(casilla == 'X') {
  110. e = X_WIN;
  111. }
  112. else {
  113. e = O_WIN;
  114. }
  115. }
  116. }
  117. else {
  118. //En este punto evaluamos quien gano
  119. if(casilla == 'X') {
  120. e = X_WIN;
  121. }
  122. else {
  123. e = O_WIN;
  124. }
  125. }
  126. return e;
  127. }
  128.  

Saludos
78  Programación / Desarrollo Web / Acceso asincrono a Variables en: 25 Agosto 2016, 20:20 pm
Hola que tal estoy programando una pequeña interfaz y me encuentro con el siguiente problema:

Tengo una varible Array en javascript:

Código
  1. var sucursales = new Array;

Dicha variable se actualiza en tiempo de ejecución mediante la siguiente función:

Código
  1. function lista_sucursal() {
  2. $.ajax({
  3. url: '/get_sucursales.aspx',
  4. type: 'POST',
  5. success: function(data) {
  6. var r = JSON.parse(data);
  7. if(r.ok == true) {
  8. var i = 0;
  9. while (i < r.data.length) {
  10.    sucursales[r.data[i].id] = r.data[i].nombre;
  11.    //Mas codigo irrelevante aqui
  12. i++;
  13. }
  14. }
  15. else {
  16. //Error aqui
  17. }
  18. }
  19. });
  20. }

Dicha funcion se llama al momento de cargar la pagina primero que otras funciones...

Posteriormente tengo otro parte del codigo que hace mas o menos esto:

Código
  1. function maquinas_sucursales_tabla() {
  2. $("#tabla_body").html("");
  3. $.ajax({
  4. url: '/get_maquinas_sucursales.aspx',
  5. type: 'POST',
  6. success: function(data) {
  7. var r = JSON.parse(data);
  8. if(r.ok == true) {
  9. var i = 0;
  10. while(i < r.data.length) {
  11.    $("#tabla_body").append('<tr><td>' + sucursales[r.data[i].sucursal] + '</td></tr>');
  12. i++;
  13. }
  14. }
  15. else {
  16. //ERROR
  17. }
  18. }
  19. });
  20. }

El detalle esta en que hay veces que pone el dato correctamente y otras veces aparece "undefined" y esto es debido a que el codigo del jquery se ejecuta de forma asincrona...

Que recomiendan para solucionar esto, estaba pensando en usar un semaforo como "sucursales_ready" para solo cargar los otros datos cuando la variable ya este lista....

Pero no se, tal vez existe otro metodo mas rapido y/o sencillo.


Saludos!
79  Seguridad Informática / Hacking / Respuesta HTTP Extraña en: 24 Agosto 2016, 01:15 am
Bueno actualmente estoy testeando un servidor que me esta tratando de hackear... (Eso o estoy paranoico  :rolleyes:)

El detalle que he empezado a recibir un par de correos de una pagina legitima, pero la direccion final de destino esta en un IP dinamica, la pagina tiene el puerto 81 Abierto y he hecho un par de peticiones manualmente mediante netcat

Código:
GET / HTTP/1.1
Host: <IP>



y la respuesta siempre es la mismasimilar:

Código:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 2463
Content-Type: text/html
Server: Microsoft-IIS/7.5
Set-Cookie: ASPSESSIONIDSSDQCRCR=SUPERCOOKIE; path=/
X-Powered-By: ASP.NET
Date: Fri, 20 Aug 2016 00:00:0 GMT

ÿØÿà J.............<OMITIDO>

El contenido nunca cambia a pesar de ser siempre los 2463 y la salida dice ser text/html

Creen que sea información comprimida o alguna idea del formato, por seguridad y un poco de paranoia colocare la información aqui despues de realizarle algunos cuantos test (Muestreos estadísticos)

Saludos!
80  Programación / Programación C/C++ / Creacion de SWAP y acceso a los datos almacenados en la misma en: 19 Agosto 2016, 20:14 pm
Hace tiempo vi un post, donde preguntaban sobre como crear una "partición" de swap o intercambio entre memoria y Disco Duro, solo que no logro encontrar el tema.

Bien estos dias estoy trabajando en un proyecto similar, donde tengo un archivo de X cantidad de Gigabytes desde 2, 4, 8, ... o mas

El detalle que cuando quieres trabajar con estas "particiones" para aprender como los sistemas operativos administran la falta de memoria con un espacio de intercambio en Disco te encuentras con el problema de que debes de administrar "optima-mente" ese espacio, y no significa que debas de ahorrar cada byte, pero es comun que las cosas que almacenas en ese espacio en disco cambien de tamaño o sean borradas poco después de escribirlas.. y por optima-mente me refiero a no perder de vista donde dejas cada cosa y a donde se movió, y que espacios quedan libres.

El codigo para escribir un archivo en Blanco de 4 Gigabytes es el siguiente:

Código
  1. #define KB 1024
  2. #define MB 1048576
  3.  
  4. register int i = 0;
  5. char *buffer = NULL;
  6. FILE *archivo = NULL;
  7. archivo = fopen("cache.bin","wb");
  8. buffer = calloc(MB,sizeof(char));
  9. while(i < 4*KB) {
  10. fwrite(buffer,MB,1,archivo);
  11. i++;
  12. }
  13. fclose(archivo);
  14. return 0;

Con eso ya tenemos nuestro espacio para "intercambio", ahora necesitamos tener otro archivo o estructura donde recordemos donde dejamos cada cosa...

Código
  1. struct map_item {
  2. uint64_t start;
  3. uint64_t end;
  4. uint8_t name[80];
  5. };
  6.  

Suponiendo que esa sea nuestra estructura de donde dejamos las cosas, podríamos tener la siguiente función para recuperar X catidad de bytes desde el archivo.

Código
  1. uint8_t *get_data_from_swap(uint64_t s,uint64_t e) {
  2. FILE *swap_file = NULL;
  3. uint8_t *data = NULL;
  4. uint64_t l,r;
  5. l = e-s;
  6. swap_file = fopen("cache.bin","rb");
  7. if(swap_file) {
  8. data = malloc(l+1);
  9. fseek(swap_file,s,SEEK_SET);
  10. r = fread(data,1,l,swap_file);
  11. if(l != r) {
  12. fprintf("Error al leer archivo de SWAP",stderr);
  13. }
  14. data[l] = 0;
  15. fclose(swap_file);
  16. }
  17. else {
  18. fprintf("Error al leer archivo de SWAP",stderr);
  19. }
  20. return data;
  21. }

Asi solo pedimos el inicio y el final y la función  se encarga de leer el archivo y devolvernos un apuntador con los datos solicitados + 1 byte de Caracter NULO

Y esto NO SOLO sirve para "Contenido de memoria", simplemente puede ser una archivo de configuración, con X cantidad de parámetros por ejemplo si estamos haciendo un juego podemos guardar Datos ahi, como récords de los usuarios, nombres, items de juego y una larga lista de etceteras...

Solo tenemos que identificarlos bien y tener las rutinas adecuadas para guardar valores nuevos y "Reacomodar" los items existentes para no dejar huecos libres.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines