2017-06-12 30 views
0

我編寫了一個易受緩衝區溢出影響的小C程序。一切工作正常,但我現在跨越了一點問題就來了:在bash中使用NULL字節(用於緩衝區溢出)

我想打電話給其位於地址0x00007ffff7a79450函數,因爲我傳遞的參數爲緩衝區溢出通過bash的終端(像這樣:

./a "$(python -c 'print "aaaaaaaaaaaaaaaaaaaaaa\x50\x94\xA7\xF7\xFF\x7F\x00\x00"')") 

我得到一個錯誤的bash的是忽略了nullbytes。

/bin/bash: warning: command substitution: ignored null byte in input 

結果我結束了在內存中的地址錯誤(的0x7ffff7a79450代替0x00007ffff7a79450)。

現在我的問題是:我如何產生領先的0,並將它們作爲我的程序的參數?

+2

with * another * program ... –

+0

NULL是帶有_null指針constant_的宏。切勿將它用於'char'。你的代碼沒有問題。你故意調用未定義的行爲,這正是你得到的。案件結案。 – Olaf

+0

請參閱[本答案](https://stackoverflow.com/a/19229243/8051589)以及[This one](https://stackoverflow.com/a/10770953/8051589)。 bash將空字節作爲空間處理。 –

回答

1

由於傳遞參數的方式,我會採取一個大膽的舉動並斷言你想做的事在POSIX環境中是不可能的。

程序使用系統調用execve運行。

int execve(const char *filename, char *const argv[], char *const envp[]); 

還有一些其他的功能,但所有的人都包裹的execve到底或使用擴展的系統調用下面的屬性:

  • 程序參數使用NUL-的數組傳遞終止字符串。

這意味着,當內核將你的參數放到一邊,供新程序使用時,它將只讀取它們到第一個NUL字符,並丟棄任何後面的內容。

因此,如果必須包含nul個字符,則無法讓您的示例工作。這就是爲什麼我建議從標準代替,它沒有這樣的限制閱讀:

char buf[256]; 
read(STDIN_FILENO, buf, 2*sizeof(buf)); 

你通常需要檢查的read返回值。對於玩具問題,您應該足以觸發您的利用。只需將您的惡意輸入傳送到您的程序中。

+0

感謝您的詳細解釋! – user7981924