次の関数は、のバイナリ4バイトキーを受け入れますkey
。buf
4バイトキーに対して排他的論理和されるバイナリ入力です。
def four_byte_xor(buf, key):
#key = struct.pack(b">I", key) # removed for binary processing
buf = bytearray(buf)
for offset in range(0, len(buf), 4):
for i, byte in enumerate(key):
buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
return str(buf)
forを介してバイナリデータを指定するためにkey = struct.pack(b">I", key)
から削除しました。これは、長さが4バイトで終わる場合は正常に機能します。そうでない場合は、次のエラーが発生します(以下のテストを参照)。four_byte_xor()
str(p.payload.payload.payload)[:4]
key
これは、00になるキーでxorされた入力で構成されるいくつかのテストで、最初のテストは成功します。
'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD'
'ABCD'
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
'ABCD'
2番目のテストは成功せず、Aまたは1バイト余分に終了します。
'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDA'
'ABCD'
Traceback (most recent call last):
File "./decode.py", line 36, in <module>
process_packets()
File "./decode.py", line 34, in process_packets
out_buf.write(bin_four_byte_xor(pkt_payload, pkt_offset))
File "./decode.py", line 22, in bin_four_byte_xor
buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
IndexError: bytearray index out of range
さまざまな長さfour_byte_xor()
を受け入れるように変更できますか?buf