2013-02-09 102 views
1

我發現喬恩·埃裏克森的書,Hacking: The Art of Exploitation這個來源,C,寫系統調用,寫INT

userid = getuid(); // get the real user ID 
// Writing data 
if(write(fd, &userid, 4) == -1) // write user ID before note data 
    fatal("in main() while writing userid to file"); 
write(fd, "\n", 1); // terminate line 

我試圖編譯這段代碼,並發現,我寫的文件,用戶ID(這是什麼我在上面的代碼中寫)是不正確的;他們只是寫了奇怪的字符(我認爲寫在這裏並不重要)。所以問題是我想通過一個int函數需要char *,因爲我想寫的文件的結果是false。

所以這是一個錯誤,對吧?

+3

'write(fd,&userid,4)'將二進制表示寫入文件。你的文本編輯器不會理解它。 – 2013-02-09 16:00:10

+0

使用'人寫'(或谷歌它)。 'write'系統調用需要一個'const void *',而不是'char *'。這是二進制表示的問題(即您的整數不是編碼爲char的)而不是整數。 – RageD 2013-02-09 16:00:37

回答

5

write()函數期望其緩衝區爲void *;它寫入任意的二進制數據。如果您需要轉換爲字符串,請使用printf()

你沒有表現的userid聲明,但write()線應寫爲:

if (write(fd, &userid, sizeof(userid)) != sizeof(userid)) 

這將檢測短寫(不太可能是一個問題一個整數型)和其它問題,並且無論userid的類型如何都能正常工作。因此,這條線的原始版本可能是錯誤的。否則,該錯誤似乎符合您的期望,而不是代碼本身。

2

不,這不是一個錯誤,而是你的錯誤理解。調用write將只寫內存中的內容,即二進制表示。你需要像fprintf這樣的東西來獲得可讀的版本。

例如,7的二進制表示可以是四個字節0​​,0,0和7,它們不可能看起來像文本表示,單個字節55(假設爲ASCII)。

硬編碼類型長度像4是一個整數,因爲這不是可移植的也是一個壞主意。最好是使用類似sizeof(userid)的東西。

+0

謝謝,我明白了。 這些源代碼沒有錯誤,只是寫出內存中的內容。這是4位(正常大小的integer 2013-02-10 00:04:30