1

作成した DNS サーバーでカミンスキー攻撃をシミュレートする必要がある課題に取り組んでいます。現在、偽の dns 応答パケット ペイロードを生成しようとしています。dnslib を使用してパケットを生成し、その結果を pack() します。これにより、16進リテラルが得られます。

'\xcf\x90\x85\x80\x00\x01\x00\x01\x00\x00\x00\x00\x03abc\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\ x01\x00\x00\x00\x00\x00\x04\x01\x02\x03\x04'

これがペイロード データの正しい形式であるとは思えません。具体的には、すべての「\ x」を捨てる必要があると思うので、ストリームは cf 90 85 80 ... になります。

残念ながら、私はこれを行うことができないようです。文字列操作ツールはリテラルでは機能しないようで、通常のリテラルから文字列への変換 (literal_eval) はエラーで失敗します。

TypeError: compile() expected string without null bytes

私が試した他の変換 (int(packet,0)) は、リテラルの一部がテキストであるため失敗します (奇数の長さにつながります)。

おそらく非常に簡単な解決策があります。

4

1 に答える 1

2

そのコンテキストで「\ x」の意味を見逃しているようです。'\x' は、 \xhh がhhの 16 進値を持つ文字を表すようなpython 文字列リテラルで使用可能なエスケープ シーケンスです。

その文字列をファイルにダンプして、その内容を 16 進数として出力してみてください。

yoni@gaga:~ python -c "file('payload','wb').write('\xcf\x90\x85\x80\x00\x01')"
yoni@gaga:~ hexdump payload 
0000000 cf 90 85 80 00 01                              
0000006

それはまさにあなたが探していた動作だと思います。先に進んでその文字列を使用してください。ただし、何らかの理由で「人間が読める」16進文字列に変換したい場合は、次を使用できます。

''.join(['%x' % ord(x) for x in packet])
于 2013-02-25T20:13:13.070 に答える