簡體   English   中英

python3在十六進制中的奇怪行為

[英]Strange behaviour of python3 in hex

我正在嘗試利用緩沖區,我的代碼與python 3看起來像這樣:

python3 -c "print ('A' * 44 + '\xcb\x85\x04\x08')" | ./vuln

或者2.7的另一種方式:

python2.7 -c "print 'A' * 44 + '\xcb\x85\x04\x08'" | ./vuln

但在這種情況下只有2.7工作正常,所以我試圖檢查十六進制:

python2.7 -c“print'A'* 44 +'\\ xcb \\ x85 \\ x04 \\ x08'”| hexdump都
0000020 4141 4141 4141 4141 4141 4141 85cb 0804
0000030 000a

python3 -c“print('A'* 44 +'\\ xcb \\ x85 \\ x04 \\ x08')”| hexdump都
0000020 4141 4141 4141 4141 4141 4141 8bc3 85c2
0000030 0804 000a

它不依賴於系統(我試過ubuntu和arch),不依賴於終端(也試過不同的)
看起來python 3增加了一些內容並改變了內存,但為什么這是真的正常呢?

在Python 2中,字符串和字節范圍是同一個。 這給非ASCII字符串帶來了問題,所以他們在Python 3中改變了它。在Python 3中有一個bytes類型,這是你想要的。 構造字節字符串的最簡單方法是在文字前加上b

b'A' * 44 + b'\xcb\x85\x04\x08'

但是,你不能像在Python 2中那樣直接打印bytes .Python 3將很好地表示你的字節,如下所示:

b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xcb\x85\x04\x08'

顯然這是所有ASCII而不是你想要的字節。 要將字節直接寫入stdout,請使用sys.stdout.buffer.write:

python3 -c "import sys;sys.stdout.buffer.write(b'A' * 44 + b'\xcb\x85\x04\x08')"

請注意,這不會在最后寫入換行符:

0000020 41 41 41 41 41 41 41 41 41 41 41 41 cb 85 04 08

這對於輸出一些字節來說似乎有點麻煩,特別是與Python 2相比。這是因為Python 3真正改善了人類可讀文本的輸出方式。 這樣做的一個結果是在沒有任何編碼的情況下打印字節更加困難,因為在輸出文本時這通常是不正確的。

我的猜測是000a和0804 000a是字符串結尾和回車字符。 我在ASCII表中查找了它們。

ASCII descriptions of the following hex values:
0a = LF -> Newline.
00 = NULL
08 = backspace
04 = end of transmission

為什么Python引入這些退格和EOT字符對我來說還不清楚。 嘗試使用python格式函數將其格式化為字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM