2011-05-07 30 views
4

我對python很陌生,試圖移植一個我爲堆棧溢出(只是一個nop sled,shell代碼和返回地址)而寫的簡單漏洞。這不是爲了惡意的目的,而是爲了在大學進行安全講座。在Python中的漏洞 - 操縱十六進制字符串

給出一個十六進制字符串(DEADBEEF),什麼是最好的方式:

  • 其表示爲一系列字節
  • 加或減的值
  • 顛倒順序(用於x86內存佈局,即efbeadde)

任何提示和技巧關於利用python寫作的常見任務也非常感激。

回答

4

在Python 2.6及以上版本,可以使用內置的bytearray類。

要創建bytearray對象:

b = bytearray.fromhex('deadbeef') 

要改變一個字節,則可以使用數組符號引用它:

b[2] += 7 

爲了扭轉到位bytearray,使用b.reverse()。要創建一個以相反順序遍歷它的迭代器,可以使用reversed函數:reversed(b)

您可能還對Python 3中的新類bytes類感興趣,它類似bytearray但是不可變。

+3

bytearray也可在Python 2.6+ – zeekay 2011-05-07 01:31:59

+0

@zeekay:太棒了。我認爲這只是一個Python 3的東西。我會編輯我的答案。 – 2011-05-07 10:49:44

0

不知道這是最好的方式......

hex_str = "deadbeef" 
bytes = "".join(chr(int(hex_str[i:i+2],16)) for i in xrange(0,len(hex_str),2)) 
rev_bytes = bytes[::-1] 

或者可能比較簡單:

bytes = "\xde\xad\xbe\xef" 
rev_bytes = bytes[::-1] 
0

在Python 2.x中,常規str值是二進制安全的。您可以使用binascii模塊的b2a_hexa2b_hex函數將其轉換爲和從十六進制轉換。

您可以使用普通字符串方法來反轉或重新排列字節。但是,執行任何類型的算術都需要使用ord函數來獲取單個字節的數值,然後使用chr將結果轉換回來,然後通過串聯重新組合修改後的字符串。

對於易於計算的易變序列,請使用array模塊,並輸入代碼'B'。如果您從十六進制開始,可以從a2b_hex的結果初始化這些值。

相關問題