簡體   English   中英

C - 程序僅在與GDB一起運行時才能獲取文件描述符

[英]C - Program fails to get file descriptor only when running with GDB

我不是專業的C程序員。 我在使用GDB調試程序時遇到問題。 (我試圖修復的錯誤與我在這里詢問的問題無關。)我的問題是程序在我直接從shell運行二進制文件時運行正常,但是當我使用GDB運行它時程序崩潰了。

以下是一些可能有用的程序信息:它是一個20多年歷史的數據庫軟件,最初是為Solaris編寫的(我認為)但是從移植到Linux,這是setuid(但不是root,感謝上帝) 。

嘗試打開文件進行寫入時,程序在GDB中崩潰。 使用GDB,我能夠確定發生崩潰,因為以下系統調用失敗:

fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);

為了澄清: path存在的lockfile的路徑。 如果存在鎖定文件,則程序在進入此系統調用之前會干凈地關閉。

我不明白為什么這個系統調用會失敗,因為1)該程序運行的用戶對包含path的目錄具有rwx權限(我通過檢查存儲在path中的變量的值來驗證這一點),以及2)程序當我沒有使用GDB進行調試時,成功打開文件進行寫入。

有什么理由我不能

關鍵是這一點:

...是setuid(但不是root,感謝上帝)。

當您在(任何)調試器下運行程序(使用任何stop-and-inspect / modify程序工具)時,內核會禁用setuid-ness,即使對於非root setuid也是如此。

如果你考慮一下這有點意義。 考慮一個保持“高分”文件的游戲,並使用“setuid游戲”來執行此操作,其中:

fd = open(GAME_SCORE_FILE, open_mode, file_mode);
score_data = read_scores(fd);
/* set breakpoint here or so */
if (check_for_new_high_score(current_score, score_data)) {
    printf("congratulations, you've entered the High Scores records!\n");
    save_scores(fd, score_data);
}
close(fd);

對“高分”文件的訪問受文件權限的保護:只有“游戲”用戶才能寫入。

但是,如果您在調試器下運行游戲,則可以在標記的行處設置斷點,並將current_score數據設置為某個超高值,然后恢復該程序。

為了避免允許調試器破壞setuid程序的內部數據,內核只在運行啟用了調試工具的代碼時禁用setuid-ness。 如果您可以向用戶提供su (或sudo或其他),表示您無論是否進行任何調試都擁有權限,那么您可以以該用戶身份運行gdb本身,以便程序以“將擁有”setuid-ed的用戶身份運行至。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM