STATUS_STACK_BUFFER_OVERRUN不一定是棧緩沖區溢出


STATUS_STACK_BUFFER_OVERRUN異常一般是指棧緩沖區溢出的溢出,代碼為0xC0000409,消息提示一般為“Security check failure or stack buffer overrun”。微軟給出的解釋如下:系統在應用程序中檢測到基於堆棧的緩沖區溢出。此溢出可能允許惡意用戶獲得此應用程序的控制權。/GS編譯器開關允許創建堆棧“cookie”值,該值用作檢測堆棧緩沖區溢出的金絲雀。如果cookie已損壞,則進程會立即終止自身,狀態代碼為STATUS_STACK_BUFFER_OVERRUN。

在做如上描述的時后,STATUS_STACK_BUFFER_OVERRUN是一個好名字。但是,隨着時間的推移,隨着我們遇到和處理問題越來越多,我們會發現其他立即終止進程的原因。其中一些與安全有關其他的沒有。比如在遇到更糟糕的情況下希望在進程終止前立即停止,用fail fast這個詞是用來形容這種情況的就非常好。甚至還有一個編譯器內部函數來終止使用這個特殊狀態代碼的當前進程

似乎人們無法就是fail fast還是fast fail達成一致,所以在實踐中,你可以看到這兩種變化。這意味着現在當你得到一個STATUS_STACK_BUFFER_OVERRUN時,實際上並不意味着存在堆棧緩沖區溢出。這只意味着應用程序決定以極快的速度自行終止。

如果你查看winnt.h文件,您將看到各種快速失敗代碼的列表。這些代碼指示發生了哪種類型的快速故障。

#define FAST_FAIL_LEGACY_GS_VIOLATION         0
#define FAST_FAIL_VTGUARD_CHECK_FAILURE       1
#define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE  2
#define FAST_FAIL_CORRUPT_LIST_ENTRY          3
#define FAST_FAIL_INCORRECT_STACK             4
#define FAST_FAIL_INVALID_ARG                 5
#define FAST_FAIL_GS_COOKIE_INIT              6
#define FAST_FAIL_FATAL_APP_EXIT              7
從上面的列表中,有點意思的是FAST_FAIL_FATAL_APP_退出代碼。此代碼在調用C運行時函數abort()時使用。 std::terminate()調用abort()。對於從noexcept函數中拋出異常或拋出的異常未經處理的情況,將自動調用std::terminate()。當一個內部斷言失敗時,或者當一個錯誤發生並且程序只是想放棄而不是試圖恢復時,它也被一些模塊使用。這些不一定是安全問題。只是程序說,“嗯,我有麻煩了。我想我就在這里停一下。”
這樣的情況,我最近就遇到一次,具體表現時進程退出時崩潰了,報的錯誤就是STATUS_STACK_BUFFER_OVERRUN。
0:000> .exr -1
ExceptionAddress: 528a7666 (msvcr120!abort+0x00000028)
   ExceptionCode: c0000409 (Security check failure or stack buffer overrun)
  ExceptionFlags: 00000001
NumberParameters: 1
   Parameter[0]: 00000007
Subcode: 0x7 FAST_FAIL_FATAL_APP_EXIT
具體參考《記一次在父類析構里調用純虛函數而引發的異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM