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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  La estocada final al TCP checksum
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: La estocada final al TCP checksum  (Leído 2,249 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
La estocada final al TCP checksum
« en: 3 Enero 2016, 19:17 pm »

Bueno tras ponerme esta mañana conseguí hacer el tcp segment len la parte más dificil aunque da mucho asco en su conjunto:

Código
  1. //sumo todo el payload tcp
  2. for (int i = 54; i < _tamaño - 1; i++){
  3. if (i + 1 == _tamaño) break;
  4. sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
  5. controlador = sumando + sumanda;
  6. sumando += sumanda;
  7. if (controlador[16] == 1)
  8. sumando++;
  9. i++;
  10. }
  11.  
  12. if ((_tamaño - 1) % 2 == 0){
  13. sumanda = (u_short)_datos[_tamaño - 1];
  14. controlador = sumando + sumanda;
  15. sumando += sumanda;
  16. if (controlador[16] == 1)
  17. sumando++;
  18. }
  19.  

Pero me falla la parte donde se suman los datos tcp, el payload, tengo que ir de 16 bits en 16 bits. Cambia si es par o impar y en eso estoy, a ver si alguien lo ve a simple vista, no se que ponia tambien que lei de rellenar con ceros.

Igual sumo dos veces el ultimo byte.. ya lo he depurado mentalmente y no enuentro manera no estoy muy freso, una hand pls, QUE YA LO TENGO CASI!!! TRAS MEEEESSES AÑOS LUSTROS.

Edito: sumar del byte 54 hasta el final sea par o impar sin repetir bytes claro y de 16 bits en 16 bits (u_short).

Ejemplos de comparacion final de tcp checksum verdadero y el mio calculado, respectivamente:

Código:
3d10== 1506 3d24
de5e== 190 de72
7527== 396 753b
6fae== 397 79c2
f0c9== 397 fadd
dabd== 396 dad1
9e96== 397 a8aa
f5d== 397 ff21
8c62== 1478 8c76
283e== 309 3252

Lo primero es el checksum verdadero, lo segundo es el tamaño del paquete (notese que si es par con sumar 14 al checksum nuestro ya tendriamos el verdadero siempre) sin embargo cuando es impar se va mas de resultado.

Creo que me falta el padding que no se ni lo que es, pero ya buscaré, este otro codigo que encontré hace tiempo, y está haciendo lo mismo sumar cabecera y datos de 16 en 16, en el ultimo paso no se que hace ni porque eso del padding, pero en ello estoy.

Código
  1.  
  2. // Calculate the sum                                            //
  3.         sum = 0;
  4.         while (len > 1)
  5. {
  6.                 sum += *buf++;
  7.                 if (sum & 0x80000000)
  8.                         sum = (sum & 0xFFFF) + (sum >> 16);
  9.                 len -= 2;
  10.         }
  11.  
  12.         if (len & 1)
  13.                 // Add the padding if the packet lenght is odd          //
  14.                 sum += *((uint8_t *)buf);
  15.  

Edito: HAHAHAH AMIGOS, mucho google traductor ya decia yo que era porque era par o impar, "odd" en ingles es impar, en ese caso "add the padding" que no se que es, pero bueno jajaja poco a poco descifrando. (inverse enginnering) #esduroderoer

Ok se refiere a que si es impar ponga ceros en el final y bien esto ya lo hice, puse ceros delante y detrás del ultimo byte, es decir si terminaba en 0x12 0x14 0x 30 y era impar he probado a dejar 0x3000 y 0x0030 y el resultado malo tambien ojj, bueno ya casi lo tengo, caerá esta semana.

Saludos.


« Última modificación: 3 Enero 2016, 19:34 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: La estocada final al TCP checksum
« Respuesta #1 en: 3 Enero 2016, 19:31 pm »

Que significado tienen las variables?


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: La estocada final al TCP checksum
« Respuesta #2 en: 3 Enero 2016, 19:37 pm »

Wow buena pregunta :""DDD yo es que ya me lo se de memoria de tanto verlo.

Código:
u_short sumando = 0, sumanda = 0;
bitset<17> controlador;

El controlador controla el acarreo de bit esta bien, _datos[] es el vector de bytes que recibo del paquete, y _tamaño el tamaño del mismo.

Me encuentro sumando el payload, que no siempre debería de ir así pero si el header len tcp es de 20 bytes empezaría en el byte 54 como tengo en el code y de ahí tira hasta el final sumando de 16 bits en 16bits, pero algo hago mal con el ultimo byte y cuando es impar.

Casi lo tengogg: izquierda checksum real, derecha calculado.

Código:
6543==6543
4dcb==4dcb
646==646
91c6==91c6
1bf==1bf
3922==3922
37ab==37ab
9069==9069
b262==b262
e928==e928
d76e==d76e
7d==7d
3eb5==3e3d
a84b==a77e
2313==2313
7dea==7dea
1dcb==1d50
6479==6479
506e==506e
5410==539c
Código
  1. //sumo todo el payload tcp
  2. for (int i = 54; i < _tamaño; i++){
  3. if (i + 1 > _tamaño - 1){
  4. sumanda = (u_short)_datos[_tamaño - 1];
  5. controlador = sumando + sumanda;
  6. sumando += sumanda;
  7. if (controlador[16] == 1)
  8. sumando++;
  9. }
  10. sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
  11. controlador = sumando + sumanda;
  12. sumando += sumanda;
  13. if (controlador[16] == 1)
  14. sumando++;
  15. i++;
  16. }
  17.  
« Última modificación: 3 Enero 2016, 21:26 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: La estocada final al TCP checksum
« Respuesta #3 en: 3 Enero 2016, 21:52 pm »

A ver, desconozco el algoritmo de esto, pero veo una cosa que no me cuadra:
En la última iteración, cuándo i valga _tamano - 1, en la linea 10, cuando accedes a _datis [i +  1] ¿no estás fuera del array?
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: La estocada final al TCP checksum
« Respuesta #4 en: 3 Enero 2016, 21:56 pm »

A ver, desconozco el algoritmo de esto, pero veo una cosa que no me cuadra:
En la última iteración, cuándo i valga _tamano - 1, en la linea 10, cuando accedes a _datis [i +  1] ¿no estás fuera del array?

Se me olvido llamar al break.. :/, pero no cambia nada con ni sin break.

Hay algo que no comprendo que es porque cuando es par el checksum que calculo es 20 unidades mas pequeño que el original, y cuando es impar varia mucho de uno a otro. En los pares estoy olvidandome de sumar 20 y en los impares algo hago mal que va más alla que eso supongo.

Eso de odd, de que si son impares hay que añadir padding o no se que, simplemente sería quesumamos los bytes de par en par, y si el ultimo no tiene pareja lo sumamos por separado y salimos del bucle que es lo que hago, ¿NO?.

Código
  1. //sumo todo el payload tcp
  2. for (int i = 54; i < _tamaño; i++){
  3. if (i + 1 == _tamaño){//se desborda entonces copiamos solo el ultimo, pero estará ya copiado??
  4. sumanda = (u_short)_datos[_tamaño - 1];
  5. controlador = sumando + sumanda;
  6. sumando += sumanda;
  7. if (controlador[16] == 1)
  8. sumando++;
  9. break;
  10. }
  11. sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
  12. controlador = sumando + sumanda;
  13. sumando += sumanda;
  14. if (controlador[16] == 1)
  15. sumando++;
  16. i++;
  17. }
  18.  
Saludos.

Bueno bueno, parece que tuve que ir a pedir ayuda al extranjero, aunque no espero ni respuesta, los guiris van de listos pero me parece que npi.

http://stackoverflow.com/questions/34582015/tcp-checksum-3-0-version

Ya esta disponible la nueva versión tcp checsum de kaxperday 3.0, más cerca del checksum real que nunca, delicatesse 3.0.

A ver si para la 4.0 ya la tenemos!!!

« Última modificación: 3 Enero 2016, 22:53 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
checksum (ayuda)
Ingeniería Inversa
abcd-surx 1 2,321 Último mensaje 14 Febrero 2005, 03:19 am
por Rojodos
comprobar md5 Checksum
Dudas Generales
laraula 4 9,934 Último mensaje 26 Noviembre 2010, 18:05 pm
por laraula
Checksum Proceso?
Scripting
ieio 4 4,684 Último mensaje 24 Abril 2011, 00:50 am
por ieio
CheckSum TCP en C
Programación C/C++
soyloqbuskas 0 1,949 Último mensaje 30 Marzo 2012, 15:46 pm
por soyloqbuskas
Las herramientas de seguridad gratuitas dan la estocada a las de pago
Noticias
wolfbcn 0 3,053 Último mensaje 11 Mayo 2014, 21:41 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines