Chuỗi phụ Python 2.7

Nhiều lần khi làm việc với python cho các giao thức tự động hóa công nghiệp nơi dữ liệu được trao đổi giữa các tập lệnh python của bạn trên PC và mục tiêu của bạn ở dạng mảng byte thập lục phân

Đối với các tình huống như vậy khi dữ liệu của bạn trong tập lệnh python ở định dạng int hoặc long và thư viện trình điều khiển cơ bản được sử dụng bởi python chỉ nhận được mảng byte. Đối với các kịch bản như vậy, không thể tránh khỏi việc chuyển đổi dữ liệu int hoặc long thành mảng byte thập lục phân

Trăn 3

Trong python 3, trong đó tất cả các số đều là kiểu int bất kể kích thước của số và may mắn thay, phương thức i được tích hợp sẵn. e. int. to_bytes[] để chuyển đổi các số đó thành mảng byte

Dưới đây là ví dụ chuyển đổi mảng 32 bit thành byte, địa chỉ ip 192. 168. 1. 1 được lưu dưới dạng int 3232235777 hoặc 0xC0A80101 trong tập lệnh python

con trăn 3. mảng int thành byte

và đầu ra là

con trăn 3. đầu ra

Trăn 2

Trong python 2, nơi các số có thể thuộc loại int hoặc long và việc chuyển đổi các số đó mà không cần sự trợ giúp của phương thức xây dựng cần một số thao tác

Khi thực hiện một cuộc tấn công lật bit hoặc làm việc với mã hóa XOR, bạn muốn thay đổi các bit và byte trong một chuỗi byte. Cách thực hiện điều này khác nhau giữa Python 2 và 3 và bài viết này giải thích cách thực hiện

Giới thiệu

Trong một cuộc tấn công lật bit, bạn thường muốn thay đổi một bit trong một thông báo được xác định trước. Ví dụ, chúng tôi lấy thông báo “tấn công lúc bình minh”. Hãy tưởng tượng chúng ta muốn thay đổi phần ít quan trọng nhất của một chữ cái, chẳng hạn như “att`ck at Dawn”

Để lật một chút, chúng tôi sẽ XOR nó với 1. Thao tác XOR được thực hiện bằng cách sử dụng mũ

>>> message[3]
'a'
>>> message[0:3]
'att'
5

>>> 97 ^ 1
96 

Phổ biến cho Python 2 và 3

Tìm các phần của chuỗi

Chúng ta có thể đề cập đến một chữ cái cụ thể trong tin nhắn bằng cách sử dụng lập chỉ mục chuỗi. Tương tự, chúng ta có thể tham chiếu đến một phần của tải trọng bằng cách sử dụng ký hiệu lát cắt

>>> message[3]
'a'
>>> message[0:3]
'att'

Điều này hữu ích khi chúng ta chỉ muốn thay đổi một chữ cái hoặc sao chép một phần của chuỗi không thay đổi

Chuyển đổi sang nhị phân

Chúng tôi chỉ có thể lật bit trên nội dung nhị phân. Thay vào đó, nếu chúng tôi được chuyển một chuỗi văn bản, trước tiên chúng tôi phải chuyển đổi tin nhắn văn bản thành byte. Điều này được thực hiện bằng cách sử dụng hàm

>>> message[3]
'a'
>>> message[0:3]
'att'
6, hàm này nhận tham số là mã hóa để sử dụng để chuyển đổi văn bản thành byte

>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"

Như bạn có thể thấy các chữ cái của chúng tôi đã được chuyển đổi thành byte theo bảng mã UTF-8

Ngoài ra, chúng tôi có thể cung cấp thông báo theo byte để bắt đầu bằng. Bằng cách đặt một chút

>>> message[3]
'a'
>>> message[0:3]
'att'
7 trước chuỗi ký tự của chúng tôi, chúng tôi xác định rằng đó là chuỗi byte trái ngược với chuỗi văn bản

>>> message = b"Attack at dawn"

Để dễ dàng lấy dữ liệu nhị phân vào và ra khỏi Python, bạn có thể sử dụng base64. b64encode thành base64-mã hóa nó hoặc binascii. hexlify để chuyển đổi nó thành hex

Các loại có thể thay đổi và không thay đổi

Các loại chuỗi và byte là bất biến

>>> message = "attack at dawn"
>>> message[3] = "x"
Traceback [most recent call last]:
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

Chúng ta không thể chỉ gán một chữ cái khác cho tin nhắn, vì nó là bất biến. Đối tượng bất biến không thể thay đổi. Có hai cách để khắc phục vấn đề này

  • Tạo một chuỗi mới chứa giá trị chúng tôi muốn
  • Sao chép chuỗi sang một đối tượng có thể thay đổi khác và làm việc trên đó

Để tạo một chuỗi mới, chúng tôi chỉ cần sao chép các phần chúng tôi muốn giữ lại và đưa ký tự đã thay đổi của chúng tôi vào đó

________số 8

Ngoài ra, chúng ta có thể sử dụng bytearray làm đối tượng có thể thay đổi của mình. Chúng tôi sao chép tin nhắn của mình vào một mảng phụ và thay đổi điều đó

>>> message = "attack at dawn"
>>> message_array = bytearray[message]
>>> message_array[3] = "x"
>>> str[message_array]
'attxck at dawn'

Bây giờ, ví dụ này sẽ chỉ hoạt động trong Python 2 chứ không phải trong Python 3. Hãy đi vào sự khác biệt

Trăn 2

Sử dụng chuỗi

Loại

>>> message[3]
'a'
>>> message[0:3]
'att'
8 trong Python 2 là một chuỗi byte. Nếu bạn lập chỉ mục cho nó, bạn sẽ nhận được một
>>> message[3]
'a'
>>> message[0:3]
'att'
8 khác chỉ chứa một byte

>>> 97 ^ 1
96 
2

Chúng ta không thể chỉ lật các bit trong chuỗi một byte này. Chúng ta cần chuyển đổi nó thành một số và ngược lại bằng cách sử dụng chr và ord. Hàm

>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"
0 [đối với “thứ tự”] chuyển đổi chữ cái thành số. Chúng tôi có thể sửa đổi số đó theo ý muốn và chuyển đổi lại bằng cách sử dụng
>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"
1

>>> 97 ^ 1
96 
5

Bây giờ chúng ta đã thay đổi chữ cái ở chỉ số 3, chúng ta có thể nối phần còn lại của chuỗi với nó

>>> 97 ^ 1
96 
6

Sử dụng một mảng phụ

Một cách khác là sao chép chuỗi vào một mảng phụ và thay đổi trực tiếp một chữ cái

>>> message[3]
'a'
>>> message[0:3]
'att'
0

Ngay cả trong Python 2, các phần tử của bytearray là các số. Lập chỉ mục một mảng phụ sẽ cho một số. Điều đó nói rằng, vẫn có thể gán các chuỗi ký tự đơn cho các vị trí trong một mảng phụ

>>> message[3]
'a'
>>> message[0:3]
'att'
1

Trăn 3

Sử dụng byte

Trong Python 3,

>>> message[3]
'a'
>>> message[0:3]
'att'
8 là loại cho một chuỗi văn bản và
>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"
3 là loại cho một chuỗi byte. Nếu bạn lập chỉ mục một
>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"
3, bạn sẽ nhận được một số

>>> message[3]
'a'
>>> message[0:3]
'att'
2

Sau khi chúng tôi sửa đổi số, chúng tôi muốn đặt lại số đó trong tin nhắn của mình. Chúng ta phải chuyển đổi nó thành byte một lần nữa. Trong Python 2, chúng tôi đã sử dụng

>>> message = u"Thanks for the tête-à-tête about our coup d'état in Zaïre"
>>> message.encode["utf-8"]
b"Thanks for the t\xc3\xaate-\xc3\xa0-t\xc3\xaate about our coup d'\xc3\xa9tat in Za\xc3\xafre"
1 cho việc này, nhưng điều này sẽ không hoạt động trong Python 3. nó sẽ chuyển đổi số thành một chuỗi thay vì một byte. Thay vào đó, chúng tôi sẽ sử dụng hàm tạo byte

>>> message[3]
'a'
>>> message[0:3]
'att'
3

Sử dụng một mảng phụ

Ví dụ được đưa ra cho Python 2 vẫn hoạt động trong Python 3. Tuy nhiên, không còn có thể gán các chữ cái cho các chỉ số bytearray. Bạn chỉ có thể gán số

>>> message[3]
'a'
>>> message[0:3]
'att'
4

Cái nào để chọn?

Sử dụng Python 3 với bytearray. Python 3 chặt chẽ hơn với các kiểu dữ liệu so với Python 2. Lúc đầu, việc sử dụng Python 2 có vẻ dễ dàng hơn vì bạn có thể xử lý các chuỗi và byte giống nhau, nhưng điều này có thể che giấu các lỗi tinh vi. Python 3 rõ ràng hơn với các loại và cảnh báo bạn cố gắng làm điều gì đó có thể không phải là điều bạn muốn

Một mảng phụ Python là gì?

Trăn. hàm bytearray[] . Nó đưa ra một chuỗi các số nguyên có thể thay đổi trong phạm vi 0

Chủ Đề