Program received signal SIGSEGV, Segmentation fault. 0x0098735e in vfprintf () from /lib/libc.so.6 #1 0x0098e3cf in fprintf () from /lib/libc.so.6
將 fprintf 改為 printf 即正常,初步懷疑緩衝區或檔案指標問題,實際為格式字串漏洞。
格式字串中包含 %20(URL 編碼空格),被 vfprintf 解析為:
%:格式指示符開頭20:最小寬度 20s、d 等 → 期望對應引數實際呼叫未提供足夠引數,導致 va_arg 讀取亂碼指標,觸發段錯誤。
char *url = "path%20to%20file"; fprintf(fp, "URL: %s\n", url); // 正常 // 危險:格式字串來自外部輸入 char *fmt = get_user_format(); // 可能包含 "%20s" fprintf(fp, fmt, arg1); // 崩潰或資訊洩漏
// 錯誤 fprintf(fp, user_string); // 正確 fprintf(fp, "%s", user_string);
snprintf 組合:char safe_fmt[64]; snprintf(safe_fmt, sizeof(safe_fmt), "%%%ds", width); // 產生 "%20s" fprintf(fp, safe_fmt, str);
printf、sprintf、snprintf、vprintf、vsprintf、vsnprintfsyslog、err、warn 等系統日誌函數gcc -Wformat -Wformat-security -Werror=format-security
-Wformat:檢查格式字串與引數匹配-Wformat-security:警告非字面常數格式字串-D_FORTIFY_SOURCE=2:執行期緩衝區檢查printf 族函數呼叫點