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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6
41  Programación / Programación C/C++ / Re: contador de palabras, con funcion que devuelve valor erroneo en: 4 Marzo 2017, 15:10 pm
Código
  1. include <stdio.h>
  2. [..]code[..]
  3.  

lo que intentas es contar las palabras de la frase de esta forma?

"asdas asdasda asdsadas asdsad asdasd" retornaria 5?

en ese caso, podrias hacer algo asi:

Código
  1. int contar_palabras(char *frase)
  2. {
  3. int palabras = 0;
  4. char ultimo = 0x00;
  5.    while(*frase)
  6.    {
  7. if((*frase == ' ') && (ultimo != ' '))
  8.                {
  9. palabras++;
  10.                }
  11. ultimo = *frase;
  12. *frase++;
  13. }
  14. if(ultimo == ' ') return palabras;
  15. else return palabras+1;
  16. }
  17.  

lo que hace esta funcion es recorrer caracter por caracter la cadena. si encuentra un espacio, significa que es el fin de una palabra. entonces suma 1 a la cuenta de palabras y sigue buscando.
tambien compara el caracter que esta analizando con el ultimo caracter analizado, y si es un espacio lo ignora. esto es para ignorar multiples espacios, de modo que "asd asd asd asd" devuelva el mismo numero de palabras que "asd            asd      asd              asd".

a lo ultimo, compara el ultimo caracter leido con un espacio.
si es un espacio, retorna el numero de palabras contadas.
si no es un espacio retorna el numero de palabras contadas mas uno.

por que? porque dijimos que un espacio significaba el final de una palabra. entonces la cadena "asd asd asd" nos daria como resultado 2 palabras, ya que la ultima no tiene ningun espacio que nos haga saber que ahi terminaba una palabra. entonces sumamos uno.
en caso de que la cadena termina en un espacio, devolvemos el valor de la cuenta y listo.
42  Programación / Programación C/C++ / Re: Ayuda con un codigo en: 4 Marzo 2017, 14:41 pm
creo que lo mejor seria usar un ciclo:

Código
  1. int quit = 0;
  2. int v = 0;
  3. while(!quit)
  4. {
  5.       system("clear"); // limpias la pantalla
  6.       mostrar_menu(); // en esta funcion imprimis el menu
  7.       cin >> v;
  8.  
  9.       switch(v)
  10.       {
  11.             case 1:
  12.                   func_opcion_1();
  13.                break;
  14.             case 2:
  15.                   func_opcion_2();
  16.                break;
  17.             [...] [...] // todas las opciones que necesites
  18.             case 6:
  19.                    quit = 1;
  20.                break;
  21.       }
  22. }
  23.  

o bien:

Código
  1.     int v = 0;
  2.  
  3.     do
  4.     {
  5.            system("clear");
  6.            mostrar_menu();
  7.            cin >> v;
  8.            switch(v)
  9.            {
  10.                   case 1:
  11.                      break;
  12.                   case 2:
  13.                      break;
  14.                   case [...]
  15.                   case 6:
  16.                           // si la opcion es 6 no hacemos nada, para la proxima iteracion del ciclo v ya valdria 6 y el bucle se romperia
  17.                        break;
  18.            }
  19.     } while(v != 6);
  20.  
43  Programación / Programación C/C++ / Re: enteros de 12 bits en: 4 Marzo 2017, 14:30 pm
Código
  1. #include <stdio.h>
  2.  
  3. // Enteros de 12 bit
  4. // 000111001001
  5. // 000111001010
  6. // 000111001011
  7. // 000111001100
  8. // 000111001101
  9. // 000111001110
  10.  
  11. // 457 458 459 460 461 462
  12.  
  13. unsigned char a[9] = {
  14. 0b00011100,
  15. 0b10010001,
  16. 0b11001010,
  17. 0b00011100,
  18. 0b10110001,
  19. 0b11001100,
  20. 0b00011100,
  21. 0b11010001,
  22. 0b11001110
  23. };
  24.  
  25. int main()
  26. {
  27.  
  28.  
  29. for(int i=0; i<9; i++)
  30. {
  31. if(i % 2){
  32. short y = 0;
  33. y = ((a[i] & 0xF) << 8);
  34. y |= ((a[i+1] & 0xFF));
  35. printf("%d\n", y);
  36.  
  37. } else {
  38.  
  39. short x = 0;
  40. x = (a[i] << 4) | ((a[i+1] >> 4) & 0xF);
  41. printf("%d\n", x);
  42. }
  43. }
  44. }
  45.  

dejo mi codigo a ver si me podes ayudar.
si te fijas arriba del todo, hay una lista de enteros de 12 bits. abajo su valor en decimal.
luego tenemos un array de bytes que contiene estos enteros de 12 bits en enteros de 8 bits.
es decir, cada elemento par del array contiene 2 tercios del entero que representa, y cada elemento impar contiene 1 tercio del entero representado por el elemento anterior y 1 tercio del entero que representa el elemento siguiente.

para verlo con mas claridad:
Citar
unsigned char a[9] = {
 0b00011100,
 0b10010001,
 0b11001010,
 0b00011100,
 0b10110001,
 0b11001100,
 0b00011100,
 0b11010001,
 0b11001110
};

en el codigo lo que hago es ir elemento por elemento y chequear si es par o impar. si es par, shifteo a la izquierda 4 bits y tomo los primeros  4 bits del elemento siguiente. si es impar, elimino los primeros 4 bits, shifteo a la izquierda 8 bits, y copio el contenido del elemento siguiente.
ese codigo funciona bien, lo pruebo y me devuelve el valor decimal que tiene que devolver.

sin embargo, falla en algunos elementos.
que puede estar causando el problema?

output:

Código:
457
458
3233
3249
2844
3100
461
462
3296
44  Programación / Programación C/C++ / Re: enteros de 12 bits en: 4 Marzo 2017, 14:19 pm
Hola no entiendo esto.
A ver tu tienes un array ejemplo:
int arr [2];

Y le asignas dos valores:
arr[0] = 0110 1010
arr[1] = 1100 0001

Código:
((short)arr[0])    //casteando a short nos quedaria el byte dentro de 2 bytes, es asi?

Eso quiere decir que tu cadena se alarga en 16 bits.
 
en realidad no estamos hablando de una cadena, si no de numeros enteros. lo que sucede al castear es que el compilador va a tratar ese numero como si fuesen 2 bytes. no se alarga en 16 bits, si no que en 8.
es como el siguiente ejemplo en decimal (es ilustrativo, nada que ver con programacion):
15 // el 15 expresado en un supuesto tipo de datos de 2 digitos
0015 // el 15 expresado en un supuesto tipo de datos de 4 digitos. mismo numero, mayor cantidad de digitos disponibles
Citar
Pero porqué este valor?
Código:
0000 0000 0110 1010 // quedando este valor
queda ese valor porque los tipos de datos que yo manejo al principio son CHAR, o sea, 1 byte (8 bits). al castearlo a short (2 bytes, 16 bits), me queda un numero de 16 digitos, como el valor es el mismo que antes los 8 nuevos digitos quedan en 0
Citar
Aqui dices esto:
Código:
"<< 4" desplazaria los bits 4 veces hacia la izquierda, correcto?
0000 1010 0110 0000 // quedando este valor

Pero lo correcto seria¿Porque este número de donde lo sacaron?:
Código:
0000 1100 0000 0000
si tengo este numero: 0000 0000 1010 0110, y muevo 4 posiciones a la izq, queda 0000 1010 0110 0000, el numero que pusiste ahi le estan faltando 4 bits, 0110
Citar
Lo usastes en la posicion 1¿?
Código:
arr[1] >> 4 

Y porque devuelve este valor?:
Código:
0000 1100 0000 0000

Aplicando esto:
Código:
0000 0000 0110 1010 | 0000 1100 0000 0000 
esto no es una division, es el operador OR. lo que hace, si miramos la tabla:

INPUT    OUTPUT
A    B    A OR B
0    0    0
0    1    1
1    0    1
1    1    1

devuelve 1 si alguno de los 2 digitos es 1, caso contrario devuelve 0. entonces se puede usar para copiar un conjunto de bits.
ejemplo:

  1101
  0001
=1101 (uno y cero da 1, 0 y 0 da 0, 1 y 1 da 1)
Citar
Cuanto devolvería y porque? A vale es una division ok.
En cuanto esto sería una simple suma es correcto?
   1101 1001 1100 1000
   0000 0000 1111 1111
= 0000 0000 1100 1000

Hace tiempo que no repasaba las operaciones en binario tendré que repasarlas si me podeis aclarar alguno de estos puntos me seria util gracias.

Por otro lado porque
 0xFF valdria 0000 0000 1111 1111 ?



0xFF tiene ese valor porque la F en hexadecimal vale 15. si hacemos la cuenta:


Código:
0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5
110 = 6
111 = 7
1000 = 8
1001 = 9
1010 = 10
1011 = 11
1100 = 12
1101 = 13
1110 = 14
1111 = 15

entonces teniendo 0xFF nos quedaria el siguiente valor

1111 1111

el grupo del ceros al principio es porque estamos hablando de un short, o sea 2 bytes o 16 bits. quedando:

0000 0000 1111 1111.

espero se haya entendido.
45  Programación / Programación C/C++ / Re: Ejecutar shellcode en C en: 4 Marzo 2017, 13:51 pm
Hola.

Estoy intentando ejecutar una shellcode que genero con el programa xxd de esta manera:
Código:
xxd -i executable >> some.c

Una vez tengo la shell generada en el fichero some.c intento ejecutarlo de esta manera:
Código:
unsigned char shell[] = { ... };

void (*sh)();

sh = (void (*)())shell;
(void)(*sh)();

Al compilar el programa no da ningún error. Cuando lo ejecuto me da violacion de segmento.

También he probado cargando en memoria el programa de esta manera:
Código:
void *f = mmap ( 0, sizeof ( shell ), PROT_READ|PROT_WRITE|PROT_EXEC,
                               MAP_PRIVATE|MAP_ANON, -1, 0 );

memcpy ( f, shell, sizeof ( shell );

void (*sh)() = (void (*)())f;
(void)(*sh)();

Y me pasa lo mismo xd. ¿Cómo puedo ejecutar codigo en hexadecimal en C? Es decir, lo que viene a ser coger el codigo en lenguaje máquina codificado en hex y ejecutarlo en otro programa en C.

Yo creo que lo que tengo que hacer es cargarlo en memoria y ejecutar esa posicion de memoria, pero no sé qué hago mal en este proceso ni el por qué de la violación de segmento.

Gracias de antemano.

eso sucede porque el compilador proteje por defecto la stack para que no sea ejecutable en caso de buffers overflow, etc...

compila con las siguientes flags:

 gcc ejecutar-shellcode.c -o ejecutar-shellcode -fno-stack-protector -x execstack

EDIT: tambien puede ser que tu shellcode contenga instrucciones invalidas, podrias mostrar el codigo asm del shellcode y como lo extraes?
46  Programación / Programación C/C++ / Re: enteros de 12 bits en: 2 Marzo 2017, 15:07 pm
Correcto.
Como detalle extra, en vez de (x << 8) >> 8, puedes hacer x & 0xFFFF.

mmm, eso no me quedo muy claro.

digamos que el short vale 1101 1001 1100 1000.

si desplazo 8 hacia la derecha, obtengo el primer byte:
0000 0000 1100 1000

para obtener el segundo, vos decis que haga and con 0xFFFF, que en binario sera 1111 1111 1111 1111, resultando:

  1101 1001 1100 1000
  1111 1111 1111 1111
=1101 1001 1100 1000

es decir, el mismo numero.
no habras querido decir 0xFF?
en ese caso, 0xFF valdria 0000 0000 1111 1111
y el resultado del and seria

   1101 1001 1100 1000
   0000 0000 1111 1111
= 0000 0000 1100 1000
dando el ultimo byte.

o quizas me equivoco.

gracias por tu ayuda, ya voy entendiendo como se opera con bits.
 

47  Programación / Programación C/C++ / Re: enteros de 12 bits en: 2 Marzo 2017, 13:21 pm
Am casi pero:
arr[1] >> 4 // desplazaria los bits 4 veces hacia la derecha, quedando este valor:
0000 1100 0000 0000

Eso no es así. 1100 0001, desplazando a la derecha, queda: 0000 1100
Con lo cual, 0000 1010 0110 0000 | 0000 1100 == 0000 1010 0110 1100

ya veo, gracias.

para tratar de entender un poco mejor esto, si quiero partir  un short en 2 bytes, seria correcto hacer esto?

short a = X; // digamos que vale: 1101 1110 0101 1010
char b[2];
b[0] = (a >> 8); // quedaria 0000 0000 1101 1110
b[1] = (a << 8) >> 8; // primero quedaria:  0101 1010 0000 0000
// y despues se convierte a: 0000 0000 0101 1010

es correcto?

gracias por tu ayuda



48  Programación / Programación C/C++ / Re: enteros de 12 bits en: 2 Marzo 2017, 12:43 pm
Los únicos operadores que necesitarás, en principio, son los de desplazamiento de bits (<<, >>) y and (&).

Suponiendo que tengas los 24 bits en un array de 3 chars:

Código
  1. char arr[3]; // 2 enteros de 12 bits
  2. short a, b; // Salida
  3.  
  4. // Suponiendo que 'a' sea el primer byte y mitad del segundo, pues:
  5.  
  6. a = (((short)arr[0]) << 4) | (arr[1] >> 4);

Y el resto, más de lo mismo.

que tal amigo, gracias por tu respuesta.
a ver si me ayudas un poco a entender el codigo.

suponiendo que:
arr[0] = 0110 1010
arr[1] = 1100 0001

((short)arr[0])    //casteando a short nos quedaria el byte dentro de 2 bytes, es asi?
0000 0000 0110 1010 // quedando este valor
"<< 4" desplazaria los bits 4 veces hacia la izquierda, correcto?
0000 1010 0110 0000 // quedando este valor

arr[1] >> 4 // desplazaria los bits 4 veces hacia la derecha, quedando este valor:
0000 1100 0000 0000

aplicando '|' entre los dos valores:

0000 0000 0110 1010
0000 1100 0000 0000
//resultado:
0000 1100 0110 1010

entendi bien? si no es asi, podrias explicarme paso a paso como funcionan estas operaciones?
49  Programación / Programación C/C++ / enteros de 12 bits en: 2 Marzo 2017, 08:05 am
hola que tal. a ver si me pueden dar una mano con esto...

resulta que estoy programando una especie de driver para sistemas de archivos FAT12, basicamente es un programa en C al que le pasamos como parametro la imagen de un floppy y este se encarga de leer y escribir datos en el utilizando el formato FAT12.

como sabran, este formato cuenta con 2 FATS (File Allocation Table) donde se guarda la informacion de todos los clusters presentes en el disco, vendria a ser un array de digitos de 12 bits que puede representar los siguientes valores: cluster sin uso - cluster da;ado - siguiente cluster del archivo - ultimo cluster del archivo.

para leer la FAT lo que hago es calcular el inicio de esta y ir leyendo de a pedazos de 3 bytes (24 bits, 2 entradas de 12 bits). la idea ahroa es partir esos 3 bytes en 2 enteros de 12 bits que me van a dar la informacion de los 2 clusters que se guarda en esos 3 bytes. no hay ningun tipo de datos de 12 bit en C, asi que se me ocurrio usar dos enteros de 16 bits (uint16_t).

lo que necesito hacer es: en el primer entero, copiar la segunda mitad del segundo byte + todo el contenido del primero. en el segundo entero, copiar todo el contenido del tercer byte + la segunda mitad del segundo. esto me daria como resultado las 2 entradas que necesito leer de la FAT.

algo asi:
// (pongo una letra al inicio cada 4 bits para poder apreciar bien lo que neceisto hacer
a110 b011   // byte 0
c100 d100   //  byte 1
e101 f101   // byte 2

esos 3 bytes son los que leo de la fat, ahora neceisto partirlos en 2 enteros de 16 bits, quedando:

c100 a110 b011 0000 // primer entero
d100 e101 f101 0000 // segundo entero

la pregunta es, como puedo realizar esta operacion?

es decir, que operaciones binarias debo realizar?



50  Programación / Programación C/C++ / Re: matriz imprime basura en: 24 Febrero 2017, 22:53 pm
ayuda por favor no se por que la matriz me imprime lo que debe de ser pero tambien me imprime basura :( soy nuevo en esto de programacion por favor ayuda :(

Código
  1. [...] code[...]
  2.  

inicializa todos los elementos de la matriz a 0 antes de trabajar con ella

#include <string.h>
memset(matriz, 0, sizeof(matriz[0][0]) * 100 * 100);
Páginas: 1 2 3 4 [5] 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines