簡體   English   中英

Python3 打印()與 Python2 打印

[英]Python3 print() Vs Python2 print

在處理緩沖區溢出漏洞時,我發現了一些非常奇怪的事情。 我已經成功地發現我需要在要跳轉到的正確地址之前提供 32 個字符,並且正確的地址是0x08048a37 當我執行

python -c "print '-'*32+'\x37\x8a\x04\x08'" | ./MyExecutable

該漏洞利用取得了成功。 但是,當我嘗試時:

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" | ./MyExecutable

它沒有。 可執行文件只是導致分段錯誤,而沒有跳轉到所需的地址。 事實上,執行

python -c "print '-'*32+'\x37\x8a\x04\x08'"

python3 -c "print('-'*32+'\x37\x8a\x04\x08')" 

在控制台上產生兩種不同的輸出。 當然,這些字符是不可讀的,但它們在視覺上是不同的。

我想知道為什么會這樣?

Python 2 代碼寫入bytes ,Python 3 代碼寫入文本,然后將其編碼為 bytes 。 后者因此不會寫入相同的輸出; 這取決於為您的管道配置的編解碼器。

在 Python 3 中,改為將字節寫入sys.stdout.buffer對象:

python3 -c "import sys; sys.stdout.buffer.write(b'-'*32+b'\x37\x8a\x04\x08')"

您可能希望手動添加print將添加的\\n換行符。

sys.stdout是一個io.TextIOBase對象,將寫入它的數據編碼到給定的編解碼器(通常基於您的語言環境,但在使用管道時,通常默認為 ASCII),然后再將其傳遞給底層緩沖區對象。 TextIOBase.buffer屬性使您可以直接訪問底層的BufferedIOBase對象

暫無
暫無

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

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