Guest gnoo Posted December 15, 2019 Posted December 15, 2019 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. Operador Right Shift Com o operador Right Shift ( >> )deslocamos um determinado número de bits para a direita. Vamos usar um valor binário aleatório para exemplo: 00010100 Imaginando que queremos mover este valor 4 bits para direita Resultado 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. 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 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 Nesta linha temos a flag CWR flag_CWR = (flags >> 7) & 1 Acho que é isto, se me enganei, espero que não seja por muito. Abraço.
Administrators Fernando Mercês Posted December 16, 2019 Administrators Posted December 16, 2019 Parabéns pela paciência e ímpeto de compartilhar, @gnoo!
Recommended Posts
Archived
This topic is now archived and is closed to further replies.