2016-03-07 271 views
-4

我想創建一個緩衝區溢出。函數中有三個變量 - 一個int和兩個數組。兩個陣列的長度都是14個字符。 int在函數中初始化爲0,但我試圖將其更改爲1.我從終端運行程序,並將一些輸入分配給第二個數組。緩衝區溢出

因此,當我運行該程序,我做這樣的事情:

./a.out 11111111111111111111111111111 

這是29 1的。因此,這兩個數組溢出使它們都只是1,我想將第29個「1」放入int中,但由於某種原因它被轉換成了「49」的十進制數。我怎麼能夠把一個「1」到這個int使用緩衝區溢出沒有它轉換?

我不能把1的小數版本,因爲它是一個不可打印的ASCII字符。

+1

發表你寫的代碼 – chqrlie

+0

我想你需要了解[ASCII編碼](http://en.cppreference.com/w/cpp/language/ascii)。 –

+0

Whay有很多關於創建緩衝區溢出的文章,幾乎沒有關於避免它們的文章? –

回答

2

字符1的ASCII值是0x31,它是十進制的49。你在正確的軌道上。

無論如何,你在做什麼都會調用未定義的行爲,但預期的行爲是未定義行爲的一種形式。

要嘗試改變,以1整數,你可以運行

./a.out 1111111111111111111111111111^A 

^A是按控制一個鍵獲得,但外殼的行編輯器通常會解釋說作爲將光標移動到行首的命令...所以你可以試試這個:

./a.out $(printf '1111111111111111111111111111\001') 
+0

這正是我所期待的。我試着做一些非常相似的事情,但我沒有放置printf,所以它只是像以前一樣被編碼回十進制。謝謝! – winsticknova

+1

@winsticknova:更確切地說,'printf'外部命令解釋'\ 001'並將其轉換爲ASCII字符'0x01',其中外殼單獨不包含,並且您的程序將收到字符串'「1111111111111111111111111111 \\ 001」'與其中的實際'\\'。 – chqrlie