2016-12-25 72 views
0

我正在嘗試一些簡單的緩衝區溢出,並且我已經控制了我的EIP,但它似乎僅限於嚴格的字符集。對EIP的有限控制

,比如我有一個Python腳本,執行以下操作

buff = "A" * 128 
buff += struct.pack("<L", 0x42424242) 
sys.stdout.write(buff) 

這正確地覆蓋我的EIP到:0x42424242 我的0x42424242值更改爲0x42434445例如,它仍然可以工作。

但只要我進入雷爾如地址:0x804843b我EIP將變爲無效的地址一樣0x000000處

Basicly每個地址我不是在這裏輸入0x42424242的不解析爲一個字母字符我得到一個無效的地址EIP:

作品:

buff += struct.pack("<L", 0x42424242) 
buff += struct.pack("<L", 0x45454545) 
buff += struct.pack("<L", 0x41424344) 

也所有這些上述將導致爲字母字符時印刷等 AAAA EEEE ABCD

不起作用:

buff += struct.pack("<L", 0x804843b) 

當印刷這也說明像我們字符: ;

+0

你想添加'x42424242'或'0x42424242'嗎?你的代碼拋出一個錯誤。 –

+0

你是什麼意思? –

+0

'struct.pack(「

回答

0

struct.pack( 「< L」,< some_numeric_value>)返回的數值以小端格式。 0x41414141的小尾數格式是\ x41 \ x41 \ x41 \ x41。但是,當它在控制檯或終端中打印出來時,每個十六進制值都會被轉換爲相應的ASCII字符。也就是\ x41被轉換爲'A'等等。所以

打印struct.pack( 「< L」,0x41414141)

打印 'AAAA'。

0x804843b的小端格式爲\ x3b \ x84 \ x04 \ x08。 0x3b是';'的ASCII值。 0x84,0x04和0x08是不可打印的字符。 因此

打印struct.pack( 「< L」,0x804843b)

打印出;其中,是站在爲不可打印的字符。