Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - grep

#101
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Cuando invocamos el nodo 89 entonces raiz referenciara solamente 89?

raiz referenciará a una instacia de tipo Nodo con campo info igual a 89.

raiz no puede referenciar a un número. Observa el tipo de variable que es raiz.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
De ser asi asi el metodo Imprimir solamente imprimira 89. Es asi esto?

No. Imprimir() imprime todos los nodos insertados, separados por un guion, y en el orden inverso.

Saludos
#102
Dudas y pedidos generales / Re:Sniffering forzoso arp?
Agosto 18, 2016, 08:27:15 PM
Para agregar,

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Para hacer sniffer siempre es necesario hacer antes mitm arp envenamiento o no tiene porqué ?

"sniffer" se entiende por "packet sniffer", "network analyzer", "protocol analyzer" o "packet analyzer", no es un verbo. Un sniffer es un programa o un hardware que intercepta el tráfico.

Un sniffer no necesariamente va a interceptar todo el tráfico de una red.


You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Por qué siempre se habla de hacer sniffering con wireshark, pero wireshark no vale para hacer arp por si solo no?

Con lo dicho anteriormente, Wireshark es un sniffer.

El ataque con un software MITM (el cual realiza ARP Poisoning), como bien lo explica @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, lo utilizas para que todo tráfico difigido a una IP, que no es la del atacante, sea enviada al atacante, valga la redundancia.

Saludos
#103
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Tiene raiz un campo sig? Porque raiz es null.

La afirmación de que `raiz es null` no es del todo correcta. ¿En qué momento raiz referencia a null? es la pregunta que debes plantearte. En las respuestas anteriores he intentado aclarar que raiz no referencia a null.


You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Si tu invocas esta linea:
lg.Borrar (1);

Se ejecutara esta condición:
Código: text

if (pos == 1)
{
    raiz = raiz.sig;
}


Pero si raiz es null entonces no tendra un campo sig. O como es posible esto?

En tu código tienes un solo caso en donde raiz referencia a null, y es cuando creas la instancia de ListaGenerica. Pero las sentencias siguientes insertan nodos, lo cual hace que raiz referencie siempre al primer nodo, entonces raiz no referencia a null.


El caso que planteas se puede reproducir, por ejemplo, de la siguiente manera:

Código: csharp
static void Main(string[] args)
{
    ListaGenerica lg = new ListaGenerica();
    lg.Borrar(1);
}


Aquí raiz referencia a null y al ejecutar la sentencia raiz = raiz.sig; la máquina virtual del framework .NET produce una excepción de tipo System.NullReferenceException ya que null no tiene campo sig y al no existir código para el manejo de dicha excepción se finaliza la ejecución del programa.

Saludos
#104
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
reco.sig = nuevo;

El campo sig del nodo [3, 30] apunta a [2, 15].

reco referencia al nodo [1, 10].


En main tienes lo siguiente

Código: csharp

ListaGenerica lg = new ListaGenerica();
lg.Insertar (1, 10);
lg.Insertar (2, 20);
lg.Insertar (3, 30);
lg.Insertar (2, 15);
.
.
.


La instancia de tipo ListaGenerica almacenará los nodos de la siguiente forma

Código: text

          +------------+    +-------------+     +------------+
          |            |    |             |     |            |
null<-----+nodo [3, 30]<----+ nodo [2, 20]<-----+nodo [1, 10]|
          |            |    |             |     |            |
          +------------+    +-------------+  ^  +------------+
                                             |
                                             |
                                             |
                                             |
                                             +
                                             campo sig



Al ejecutar lg.Insertar(2, 15);, se crea un nuevo nodo y el mismo se coloca entre el nodo [1, 10] y el nodo [2, 20]. Observa como se ejecuta el siguiente bloque:

Código: csharp

         {
             Nodo reco = raiz;                     // (1)

             for (int f = 1; f <= pos - 2; f++)    // (2)
                 reco = reco.sig;

             Nodo siguiente = reco.sig;            // (3)
             reco.sig = nuevo;                     // (4)
             nuevo.sig = siguiente;                // (5)
         }


(1) reco referencia a la misma instancia a la que referencia raiz. En este punto la instancia es el nodo [1, 10] el cual en su campo sig referencia al nodo [2, 20].

(2) la sentencia asociada al bucle no se ejecuta

(3) siguiente referencia a la misma instancia a la que referencia el campo sig de la instancia referenciada por reco. En este momento sig referencia al nodo [2, 20].

(4) ahora el campo sig del nodo [1, 10] referencia al nuevo nodo, osea el nodo [2, 15].

(5) ahora el campo sig del nuevo nodo [2, 15] referencia al nodo [2, 20].

Saludos
#105
Por favor intenta leer atentamente y despacio, quizás te parezca un trabalenguas,

Código: csharp

Nodo reco = raiz;


reco es una variable de referencia a instancias de tipo Nodo la cual es automáticamente inicializada para referenciar a la misma instancia a la que referencia raiz en ese momento.


Código: csharp

Nodo siguiente = reco.sig;


siguiente es una variable de referencia a instancias de tipo Nodo (igual que reco) que es automáticamente inicializada para referenciar a la misma instancia a la que referencia el campo sig de la instancia referenciada por reco en ese momento.

Saludos
#106
Dudas y pedidos generales / Re:Sniffing con Wireshark
Agosto 17, 2016, 03:53:26 PM
Además debes realizar la captura en "promicuous mode" o "monitor mode". Si tu adaptador de red es reconocido por wireshark entonces obtendrás estas opciones en la ventana "Capture Options"(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login). Si ese no es el caso y tu tarjeta o driver lo soporta, debes habilitarlo por tu propia cuenta:

Promicuous mode:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Monitor mode:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Saludos
#107
Analiza el contexto entero del método Insertar():

Código: csharp

void Insertar(int pos, int x)
{
    if (pos <= Cantidad() + 1)              // Condicion primaria
    {
         Nodo nuevo = new Nodo();
         nuevo.info = x;

         if (pos == 1)                      // Condicion 1
         {
         ...
         }
         else if (pos == Cantidad() + 1)    // Condicion 2
         {
         ...
         }
         else                               // Condicion 3
         {
             Nodo reco = raiz;

             for (int f = 1; f <= pos - 2; f++)
                 reco = reco.sig;

             Nodo siguiente = reco.sig;
             reco.sig = nuevo;
             nuevo.sig = siguiente;
         }
    }
}


Si ejecutas lg.Insertar (2, 15); sin antes haber insertado un nodo en la posición 1, entonces la Condición primaria no será verdadera por lo que no se insertará ningún nodo. Si raiz es null entonces esto es lo que sucede.

Pero si ejecutas lg.Insertar (2, 15); habiendo insertado antes un nodo en la posición 1, entonces la Condición primaria es verdadera y se ejecuta el bloque de la Condición 2.

Finalmente, si ejecutas lg.Insertar (2, 15); habiendo insertado antes más de un nodo, entonces se ejecuta el bloque de la Condición 3.

Saludos
#108
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
de acuerdo con el codigo estamos en la posición tres. Pero si pos es dos entonces la estructura repetitiva for se veria asi:
for (int f = 1; f <= 2 - 2; f++)

Como ves, cambie el pos por un dos ya que pos es dos. F es uno. Entonces esta estructura repetitiva me quiere decir mientras 1 se menor a 0 se ejecutara esta estructura repetitiva. Pero 1 no es menor a 0; asi que estamos de acuerdo que esta estructura repetitiva no dara ni una sola vuelta?

Es correcto,

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Y que esto, a su vez provocara que el nodo [2, 15] no se colocara en la posición dos?

El nodo SI será colocado en la posición dos, osea después del nodo raiz, porque se ejecutará las sentencias que siguen.

Sabiendo que reco referencia al mismo lugar que raiz y que nuevo es el nuevo nodo con valor 15, entonces:

Código: csharp

Nodo siguiente = reco.sig;
reco.sig = nuevo;
nuevo.sig = siguiente;


dá a entender que ya existía un nodo en la posición dos, pero ahora se desplazará a la posición tres mientras que el nuevo nodo estará en la posición dos.

Saludos
#109
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Citar¿Y que pasa con los opcode "Cero" que si son necesarios?
Bueno aquí no está del todo bien lo que te dice el compañero @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login , realmente no pasa nada en el shellcode porque contenga null bytes (\x00). Cada escenario es un mundo paralelo, normalmente se trata de evitar dichos null bytes por el tema de que en determinadas situaciones la gente se enfrenta a una función la cual interpreta un conjunto de bytes para su propio funcionamiento interno.
Un ejemplo sería strcpy la cual interpreta dicho null byte como un terminador de cadenas y a partir del mismo cesa la ejecución de los op codes consecutivos, como consecuencia tendremos una ejecución de código arbitrario fallida. Pero no necesariamente hay que temer a dichos null bytes a diferencia de strcpy, gets() te permitiría ejecutar tu shellcode con los tan odiados null bytes.
Con esto me reitero, cada escenario es un mundo.

Correcto, mi respuesta sólo sirve en el contexto de funciones que interpretan el null byte como terminador de cadenas. Gracias @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Saludos
#110
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
La primera, es saber si, ¿cada vez que haga una shell y quiera sacar los opcode es necesario usar push y guardar en el stack todo?, ya que hice dos formas de ejecutar execv; una que es la que ronda por internet y otra hecha por mi. La que ronda por internet usan bastante push ya sea para /bin/sh como para los argumentos de execv, yo intenté usar una variable en section .data, lo que me di cuenta que necesito reemplazar las dirección que me da de section .data por /bin/sh en hexadecimal

entonces acabo haciendo lo mismo que usar directamente push /bin/sh

Pero recordé un código de una shell TCP y me di cuenta que también pushean todo, algo así

push 0x1
pop ebx
push 0x2
pop ecx

en vez de meterlo directamente

mov ebx, 0x1
mov ecx, 0x2

¿entonces es necesario meter en el stack todo en casos de shellcodes o será simplemente una coincidencia o una forma diferente de programar?

Solo es una forma de llegar al objetivo, no existe una regla con respecto a usar push/pop en lugar de mov. Las diferencias que puedes encontrar es en el tamaño de opcode de cada instrucción y en la inserción de bytes necesarios para el correcto funcionamiento de la instrucción.

Por otro lado, las instrucciones que especificas como alternativas no son válidas para el shellcode ya que existen bytes 0x00. En el siguiente ejemplo de stackoverflow puedes ver la diferencia en los opcodes:

Código: asm

B8 01000000    MOV EAX,1          ; Set the register EAX to 0x000000001 To make the above instruction null free

; they've re-written it as follows

33C0           XOR EAX,EAX        ; Set the register EAX to 0x000000000
40             INC EAX           ; Increase EAX to 0x00000001

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

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
¿Y que pasa con los opcode "Cero" que si son necesarios?

por ejemplo, IP - 192.167.0.56

en hex quedaria C0A70038, pero si se dan cuenta hay cero "00", según en la shellcode no puede haber nulls y se deben quitar los ceros, y aunque en la ip no usa NULL sino es mas un cero de integer, objdump me lo quita al ser 0x00, entonces queda incompleto, en este caso se lo agregue manualmente y me funcionó, ¿pero que pasaría si hay más instrucciones con 00?, ¿tendría que buscarlos y agregarlos directamente en caso de que objdump me los elimine?, y ¿eso no perjudicaría la shellcode al tener que agregarle algún 0x00? porque tener que buscar en la shellcode byte por byte a ver si no me falto algo, creo no es muy optimo pero no se si sea normal.

No puedes tener el caracter '\0' (null) en el string del shellcode porque las funciones que procesan strings en C interpretan este byte como un fin de la cadena. Para el caso de valores de argumentos, existen operaciones aritméticas y lógicas entre números (cuya representación hexadecimal no contenga el byte 0x00) para evitar esto, te cuento algunas:

-- Operación xor entre dos números, por ejemplo:
Código: asm

mov ax, 0x5101
xor ax, 0x0101
push ax            ; 0x5101 xor 0x0101 = 0x5000 (el puerto 80 en network byte order)

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

-- Resta de 0xfffffffff la cantidad que sea necesaria para obtener el número deseado.

Para el caso de las instrucciones, si algún opcode tiene el byte 0x00 debes buscar otra instrucción (o conjunto de instrucciones) equivalente para evitarlo. Esto se explica muy bien en "Smashing The Stack For Fun And Profit" (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login) y el libro "Hacking: The Art of Exploitation". Por ejemplo mov $0, %eax produce b8 00 00 00 00 pero esto se puede cambiar por xor %eax, %eax que produce 31 c0.


You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Lo cual me llevó a otra duda; cuando busque el código de la shell, quise verificar su funcionamiento y saque los opcode, pero me di cuenta que objdump no me dio correctamente todo, el puerto solo me dio 1 byte de los 2

0x7968

y en la shellcode me dejo solamente

0x79

y de igual manera la shell de /bin/sh no me dio todo, le hizo falta 1

/x68/x73/x2f/x6e/x69/x62/x2f/x2f -- así debería quedar, pero me dio lo siguiente

/x68/x73/x2f/x69/x62/x2f/x2f

¿será algún detalle de que sea en 64 bits o algo parecido?, porque usé el comando de la página You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

cuando uso objdump -d me muestra bien todo, pero con el comando de commandlinefu me falló como les mencioné

Por simple deducción supongo que el comando que utilizas no funciona correctamente.


Saludos
#111
Algunos diagramas utilizan íconos que encuentras en Microsoft Visio y otros son diagramas hechos con smartdraw. Además algunos íconos (o shapes) son copia o modificaciones de los packs que vende ArtistsValley (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login) y de los íconos creados por Michael Mcdonald (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Específicamente la imagen que muestras utiliza íconos de smartdraw (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login) que forma parte de los legacy symbols de la colección.

Saludos
#112
No se que distribución usas, ni tampoco si deseas utilizar los drivers propios de AMD, pero te puedes guiar del stacktrace del X server al fallar. Si usas ubuntu, nada mejor que el procedimiento de la guía oficial en donde se instalan incluso las dependencias y builds packages necesarios:

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Saludos
#113
Este error es porque no tienes la extensión mysqli (MySQL Improved extension) en tu PHP build, debes seguir los pasos indicados arriba o como lo muestra esta guía:

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Saludos
#114
Tengo entendido que no deberías poder escribir nada al ejecutar Apache como una aplicación de consola y no como un servicio. Si no puedes acceder al servidor a través del navegador, entonces debes analizar el contenido del archivo "error.log" que se encuentra en el directorio "logs" dentro del directorio de instalación de apache.

Por otro lado, si quieres cambiar la intermitencia del cursor (blinking cursor) del prompt, esto lo puedes hacer entrando a las propiedades del teclado en el panel de control. En la pestaña Velocidad (o Speed) tienes la sección llamada Velocidad de intermitencia del cursor (o Cursor Blink Rate).

También puedes cambiar el cursor estandar a un block cursor accediendo a las propiedades de la consola (o command prompt), o de todas las consolas, haciendo click derecho en la barra del título de la ventana y seleccionando "Propiedades" para la actual ventana o "Predeterminados" para todas las consolas. En la pestaña de opciones, en la sección Tamaño del cursor, seleccionas "Grande".

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

Saludos
#115
Dudas y pedidos generales / Re:Duda reto seguridad
Agosto 07, 2016, 12:57:53 PM
Solo comento a modo de referencia porque ya tienes la respuesta,

esta es una aplicación explotable con el ataque llamado stack buffer overflow (o stack smashing).

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Hasta ahora he obtenido que se produce segmentation fault al introducir una cadena de longitud 133.

El segmentation fault se produce porque en el código de la función main() al intentar ejecutar func(), donde func es una variable puntero a función que retorna void, lo hace de la siguiente forma:

Código: asm

mov eax, DWORD PTR [esp+0x9c]
call eax


en el offset/desplazamiento esp+0x9c se tiene el valor 0x41414141 (una dirección de una arquitectura de 32bits) que es una dirección de memoria fuera del segmento de código. Esto es porque el valor contenido en esp+0x9c, que anteriormente era 0x08048478, ha sido sebreescrito con el código hexadecimal de A (que es 0x41).

Para poder obtener la shell, que es el código de la función shell(), debes ingresar 128 A's (o lo que sea) más la dirección de memoria de esa función en LSB byte order (0x08048464 en little endian byte ordering es 0x64840408) ya que de esta forma se sobreescribe el valor de la variable func, que era la dirección de memoria de sup() (que es 0x08048478) con la dirección de memoria de shell().


Para agregar,

¿Por qué 128 A's?:
Si se observa el código assembly de main, vemos que la variable func se encuentra en el offset ESP + 0x9C, mientras que buf (la variable a la que se ingresan los caracteres) se encuetra en el offset ESP + 0x1C. Entonces: ESP + 0x9C - ESP + 0x1C = 156 - 28 = 128.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
... has encontrado la dirección del buffer donde cargas tu fruta, al obtener esa dirección únicamente podrías colocar una shellcode y redirigir el flujo del programa a dicha shellcode de modo que sabiendo la dirección de inicio sería fácil, aunque en esta ocasión no es tan fácil porque está compilado con NX activado lo cual no permite escribir en la memora (stack/heap) nuestro shellcode, aun así sería bypasseable mediante rop o ret2libc.

El bit NX es una característica del MMU (Memory Management Unit) del CPU de la cual se vale el kernel de Linux para habilitar o deshabilitar la ejecución de código en ciertas páginas de memoria. De esta forma se proteje la ejecución de código en el stack.


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

from struct import pack
payload = "A"*133
payload += pack("<L", 0xdirección_de_shell)


Esto es una porción de código en python para insertar el payload como entrada al programa explotable.


Saludos
#116
El servicio solo identifia el IP y geolocaliza la posición, no puede brindarte la información histórica de la verdadera máquina que envió el mail. Puedes probar esto agregando una cabecera X-Originating-IP: <ip address> y variando el valor de IP.

El header X-Originating-IP no suele ser utilizado actualmente.

Saludos
#117
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
File "dns2proxy.py", line 21, in <module>
     import dns.message
ImportError: No module named dns.message

dns.message es un submódulo del paquete dnspython (un DNS toolkit, You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login). Debes instalar esta dependencia para poder continuar. Por ejemplo, en debian este paquete lo encuentras como python-dnspython.


Saludos
#118
Si un archivo es creado y eliminado inmediatamente entonces el registro correspondiente al mismo en la tabla MFT se encuentra disponible para cualquier nueva creación de un archivo (Cuando un archivo es creado se usa el primer registro disponible, en orden ascendente, del MFT). Pueden existir muchas actividades en el sistema que lleven a la creación de un archivo entonces es posible que la sesión que estaba abierta anteriormente tenía procesos que creaban nuevos archivos, sobreescribiendo los registros que deseabas obtener del MFT.

Saludos
#119
Dudas y pedidos generales / Re:Banco en C
Agosto 04, 2016, 12:32:44 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Entonces, no entiendo por que me "Combina" los vectores y me arroja información erronea, más alla de querer resolver la duda, quiero saber el por que sucede esto. Cabe destacar que me he pasado todo el dia intentando multiples cosas y aún sigo sin obtener un resultado.

No se si debería usar punteros, no lo veo necesario, lo que asumo que esta pasando es que me esta tomando la posición del vector correspodiente y me lo combina con la posición del vector que le sigue ¿Por que? no tengo la más remota idea.

Espero alguien me pueda ayudar un poco, no les pido hacerlo, no, simplemente ayudarme con el por que pasa esto y el tema a tratar, estaria bastante agradecido!

Esto sucede porque los arrays que has declarado no tienen tamaño alguno. Teniendo en cuenta que las variables son de tamaño estático y que el valor de tu variable n es cero entonces el compilador crea variables array de tamaño cero:

Código: c

int n,cli,rangeced,cont;
n=0;

char Nom[n][20];
char Ape[n][20];
char Ced[n][20];
char Deb[n][20];
char Cred[n][20];
float Sal[n];


Esto no tiene sentido y por ello el resultado depende del compilador. Al iterar sobre n, que cambia de valor por la entrada del usuario, accedes a posiciones en el stack que no corresponden al array e incluso puedes llegar a direccionar fuera del stack frame llegando a un "segmentation fault".

Código: c

for(int i=0;i<n;i++){

.
.
.

    do{
        printf("Introduzca el nombre del cliente: ");
        scanf("%s",&Nom[i]);
    }while(ValLet(Nom[i]));

.
.
.



Saludos
#120
Hola,

voy a remarcar secciones puntuales sólo para que el código funcione.

Comenzando con el cliente,

veo que tienes la siguiente línea:

Código: c
zout = htonl(siz);


No veo necesario ningún byte ordering más que el de tu máquina. Esto me lleva a borrar esta línea y cambiar el código de send:

Código: c

// send(sockfd, (char*)&zout, sizeof(zout), 0);
send(sockfd, &siz, sizeof siz, 0);


Finalmente veo que tienes esta línea que no le veo utilidad alguna:

Código: c

if(flista != NULL) // debes comentar o borrar esta línea



Ahora con el server,

debes corregir tu primer llamada a recv():

Código: c

// recv(sockfd, (char*)bff, sizeof(long), 0);
recv(sockfd, &bff, sizeof(long), 0);


Además no veo necesario realizar el byte ordering, el cual se encuentra en la asignación a la variable bfin:

Código: c
bfin = ntohl(*((long*)bff)); // debes comentar o borrar esta línea


En consecuencia debes cambiar las líneas en donde utilizas bfin:

Código: c

// printf("%d", bfin);
printf("%d", bff);

.
.
.

// while(erecv < bfin){
while(erecv < bff) {



Saludos