0

値4のunsingedlonglongと値8616616の追加のunsignedlonglongをtcpパケットに追加します(2番目の値を覚えていません)。私はubuntu32のcでそれを行うので、unsignedlonglongは8バイトです。

scapyでパケットをスニッフィングし、padding.loadを出力します。出力には、私が理解していない記号とその意味が表示されます-g、| さらに、負荷は16バイトである必要がありますが、16バイトは表示されません。

unsigned long longを1つだけ追加すると、8バイトになり、これらの記号が表示されません。

>>> pkt = sniff(count=2,filter="tcp")
>>> raw  = pkt[1].sprintf('%Padding.load%')
>>> raw
"'\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00g\\xc4|\\x00\\x00\\x00\\x00\\x00'"


>>> print raw
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
4

1 に答える 1

1

の値を出力するときraw、python は 31 より大きい値を持つすべてのバイトを ASCII 文字として解釈します。gそのバイトの値が 103 に等しい場合、124 の ASCII コードも同様です|。127 を超える文字の場合、Python は別の表現を使用するため\xc4、出力にそのバイトの値が 196 となります。

の各バイトの実際の値rawは次のとおりです。

[4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]

これは 16 バイトの長さです。

各バイトの値を文字に戻すことで、これをテストできます。

>>> values = [4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]
>>> as_characters = ''.join(chr(c) for c in values)
>>> as_characters
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
>>> len(as_characters)
16

あなたが持っているものrawは、各バイトがエスケープされていると思います。私の例では、出力するas_charactersとバックスラッシュが 1 つしか表示されませんが、バックスラッシュは 2 つです。pkt[1].sprintf('%Padding.loadr%')エスケープされていないバージョンを取得するには、次のようなものを使用する必要がある場合があります。

于 2012-11-21T21:09:57.473 に答える