1. 程式人生 > >編譯器防止棧溢位的策略

編譯器防止棧溢位的策略

棧溢位的原理前面已經說過,為了防止棧溢位增加了一個全域性變數 ___security_cookie ,把它和當前esp做異或後,值放到儲存的eip、ebp得上面(該函式棧空間的第一個變數)

該函式呼叫結束後,再把var_4和esp(兩處的esp值應該是相同的)做異或,值放到ecx裡面,呼叫函式@[email protected]( )(注意:該函式直接使用ecx值)

@[email protected]函式彙編程式碼:

這個函式會檢查ecx是否等於全域性變數___security_cookie,相等直接返回,不做任何事情;不相等就說明在函式呼叫過程中修改了var_4的值,出現了棧溢位,轉到___report_gsfailure處,___report_gsfailure處的彙編程式碼最終呼叫了TerminateProcess( ),退出碼為STATUS_STACK_BUFFER_OVERRUN,彙編程式碼如下:

這種方法只是一定程度上發現棧溢位立刻終止程式,但是對於一些巧妙的人為設計,還是不能很好的預防。

這種防止棧溢位的策略,新增到函式中的原則是什麼?

編譯器就是原則,它認為要加就加,沒有必要加就不加。

以上內容在《軟體除錯》第22章12節有詳細介紹。