Ir para conteúdo

Bit Masking em flags TCP - análise de pacote


Visitante gnoo

Posts Recomendados

Saudações,

este post segue com o intuito de perceber como funciona a análise dos bits ( bit masking ) que indicam que flag TCP está presente no pacote, que recebemos.

Eu não percebo muito de bit masking nem de análise de pacotes, se este conteúdo tem erros na explicação deixa o erro nos comentários para que seja feita a sua correção.

Anteriormente fiz um post sobre análise de pacotes TCP com python que podes ver aqui:

E vou usar código que apresentei lá como exemplo.

 

flags = tupla_dados_tcp[5]
    
    flag_FIN = flags & 1
    flag_SYN = (flags >> 1) & 1
    flag_RST = (flags >> 2) & 1
    flag_PSH = (flags >> 3) & 1
    flag_ACK = (flags >> 4) & 1
    flag_URG = (flags >> 5) & 1
    flag_ECE = (flags >> 6) & 1
    flag_CWR = (flags >> 7) & 1

Para iniciar temos que ver o que são operadores bitwise e como utilizá-los, aqui vou dar apenas o exemplo de dois operadores necessários para executar esta tarefa.

Operador & (AND)

O operador & (AND) compara dois valores com representação binária em que cada bit destes valores é comparado.

Para perceber como essa comparação é feita vamos ver a tabela da verdade.

Vamos considerar que valor 0 é negativo e valor 1 é positivo.

Quando utilizado o operador & (AND), o valor retornado da comparação entre dois bits só é 1 quando os dois valores são positivos, ou seja quando os dois valores presentes são 1.

2019-12-15_18-01.png.03540b42f882c80b1a73ace57707c45c.png

Operador Right Shift

Com o operador Right Shift ( >> )deslocamos um determinado número de bits para a direita.

2019-12-15_13-39.png.f74f4a6be1d2cfe2c0772ca80ad1bbd8.png

Vamos usar um valor binário aleatório para exemplo:

00010100

Imaginando que queremos mover este valor 4 bits para direita

2019-12-15_14-06.png.63e92ac3a919c6ab6faa7f21c55abd1b.png

Resultado

2019-12-15_14-17.thumb.png.e92f97dd2ef73c7e0cb632415362d10a.png

Como funciona com python

Se analisarmos esta linha :

tupla_dados_tcp = struct.unpack('! HHLLBBHHH', carga[:20])

Eu obtenho uma tupla com o valor dos campos, feito no desempacotamento.

Nesta linha:

flags = tupla_dados_tcp[5]

Eu armazeno o valor que está no index 5 da tupla na variavel flags, este é o valor que contém os bits que representam as flags que queremos ver se estão presentes ou não.

2019-12-15_16-41.png.d1ea9768d5c2e4d09f820b6dc160f9b2.png

Então uma vez que eu já tenho os 8 bits das flags na variável flags, eu tenho que ter um valor para comparar o bit mais à direta das flags com o bit mais à direita desse mesmo valor usando o operador & ( AND ).

Caso o valor do bit mais à direita das flags seja 1, e o valor bit mais à direita do valor a comparar for 1 então a flag está definida então o valor armazenado na variável é 1, se o valor do bit mais à direita das flag for 0 então o valor armazenado na variável é 0, porque como nós vimos na tabela da verdade o valor só é 1 (positivo) quando duas condições são verdadeiras.

O valor utilizado para fazer a comparação é o 1 ( decimal ), a sua representação em binário é 00000001, é escolhido este número porque o bit mais à direita é 1, e é esse bit que é utilizado para fazer comparação com o bit mais à direita da flag.

Nesta linha temos a flag FIN

flag_FIN = flags & 1

2019-12-15_17-14.thumb.png.6ea1e04eb09d4dc5ce91379385106c81.png


 
flag_SYN = (flags >> 1) & 1

2019-12-15_17-25.thumb.png.d6b5c67e1648663f0e028d6b1479695e.png


 
flag_RST = (flags >> 2) & 1

2019-12-15_17-32.thumb.png.86c590a438f2746867874bc548f2a1e8.png


 
flag_PSH = (flags >> 3) & 1

2019-12-15_17-40.png.193fccefe0bfb228bf61d2d0bc7560d9.png

 


 
flag_ACK = (flags >> 4) & 1

2019-12-15_17-43.thumb.png.5b52dcbc634c3ae5e75ef72548ce3721.png

 


 
flag_URG = (flags >> 5) & 1

 

2019-12-29_16-04.thumb.png.0f057f1c1337a9e2c595dac162894b6e.png


 
flag_ECE = (flags >> 6) & 1

 

2019-12-29_16-09.thumb.png.ea2efe9652861b19d1f0f81dff36396d.png

Nesta linha temos a flag CWR

 

flag_CWR = (flags >> 7) & 1

 

2019-12-29_16-15.thumb.png.9c7881af683b97929528b883183b1490.png

 

Acho que é isto, se me enganei, espero que não seja por muito.

Abraço.

 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...