2012-04-11 52 views
1

我正在做一個家庭作業,我們要利用一個易受緩衝區溢出攻擊的程序。我們通過創建一個大型的char陣列來完成這個工作,首先完全沒有操作說明。如何修復多字符常量警告

我相信我應該做的是將惡意代碼複製到緩衝區中的某個位置(這部分我可以很好地執行),然後修改可利用函數的返回地址,以便它指向惡意代碼的位置是。

我知道我想設置的地址(比方說½¾¿º),但我發現了一些警告,不知道他們所造成。

這是代碼(本質),導致該警告:

int start_of_return_address = 10; 
chars[start_of_return_address + 0] = '½'; 
chars[start_of_return_address + 1] = '¾'; 
chars[start_of_return_address + 2] = '¿'; 
chars[start_of_return_address + 3] = 'º'; 

的警告,我得到每項任務有:

warning: overflow in implicit constant conversion 
warning: multi-character character constant 

我通過轉換bdbebfba(地址得到了地址惡意代碼)轉換成字符(產生½¾¿º)。

任何想法,什麼可能導致的警告,或另一種方法可以讓我的地址複製到一個字符數組?

請記住,這是家庭作業。

+0

你是如何將'bdbebfba'轉換成'characters'的? – ArjunShankar 2012-04-11 10:55:04

回答

4

我覺得你的轉化率從bdbebfba字符的嫌疑。

如果是這樣的地址,如果我想將其存儲在一個字符數組,我會做:

chars[start_of_return_address + 0] = 0xbd; 
chars[start_of_return_address + 1] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 3] = 0xba; 

這是一個4字節的值,所以它嵌入4個字符。

我覺得endian-ness也很重要。如果系統是小端(x86),那麼最低有效字節會進入較低地址(並且您將反轉賦值順序)。

chars[start_of_return_address + 4] = 0xbd; 
chars[start_of_return_address + 3] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 1] = 0xba; 
+0

就是這樣!謝謝!這種端到端的確是一個重要的因素(第二套代碼作品),所以還要感謝你進行編輯。 – Fred 2012-04-11 11:10:40

1

你向我們展示的字符文字('½''¾''¿''º')不應該被解釋爲多字符常量。就像它們一樣,我的猜測是這是一個編碼問題:例如,它們可能在源代碼中編碼爲UTF-8(因此爲兩個字節),但編譯器需要另一種編碼(表示您假設的拉丁文-1 - - 如果我是正確的,他們被視爲'½''¾''¿''º'),因此認爲有在不斷的兩個字符。