Berikut kodenya:

def flip_bytes(binary_f):
    i = random.randint(0, len(binary_f))
    c = chr(random.randint(0, 0xFF))
    return binary_f[:i] + c + binary_f[i+1:]

def copy_binary():
    with open("license", "rb") as orig_f, open("license_fuzz", "wb") as fuzz_f:
        fuzz_f.write(flip_bytes(orig_f.read()))

license adalah ELF yang dapat dieksekusi, ketika saya menjalankan skrip saya mendapatkan kesalahan ini:

Traceback (most recent call last):
  File "parse.py", line 30, in <module>
    copy_binary()
  File "parse.py", line 11, in copy_binary
    fuzz_f.write(flip_bytes(orig_f.read()))
  File "parse.py", line 7, in flip_bytes
    return binary_f[:i] + c + binary_f[i+1:]
TypeError: can't concat bytes to str

Bagaimana cara memperbaikinya?

(Inilah seluruh skrip untuk berjaga-jaga)

0
うちわ 密か 31 Desember 2017, 20:31

1 menjawab

Jawaban Terbaik

Perubahan:

c = chr(random.randint(0, 0xFF))

Untuk:

c = bytes([random.randint(0, 0xFF)])

Python 3 memiliki tipe byte dan str yang terpisah. Menurut dokumentasi, byte adalah versi bytearray yang tidak dapat diubah:

https://docs.python.org/3.1/library/functions.html#bytes

https://docs.python.org/3.1/library/functions.html#bytearray

Jika Anda meneruskan angka ke konstruktor byte/bytearray, itu akan menafsirkannya sebagai ukuran buffer awal dan bukan nilai awal dari satu byte. Inilah sebabnya mengapa Anda harus memberikannya daftar yang berisi nilai numerik yang ditafsirkan sebagai byte (mereka harus menyertakan 0-255 atau akan mengeluarkan pengecualian).

2
Forest Darling 31 Desember 2017, 17:50