![](/img/trans.png)
[英]regex (vim) for print … to print(…) for python2 to python3
[英]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.