【深入淺出】分析strcpy導致棧溢出的具體原因

                     (a)IDA看到的僞代碼                                                           (b)c語言的代碼

                                                                     (c)sub_401020()的彙編指令

 

                                                                                (d)OllyDbg調試過程中

如圖(a)[bp-XXh]、(c)ss:[ebp-0xXX]、(d)棧空間所示,在當前函數中,所有局部變量都存儲在棧內。

       如圖(d)當前函數ebp=0018FAEC;

     (a)中的v4(即圖(b)的authenticated)位於ebp-4h位置(即圖(d)的0018FAE8);

     (a)的v3(即(b)的buffer[8])位於ebp-ch位置,給了他8個字節的空間,v3的地址&v3即是圖(d)的0018FAE0;

        如圖(d)所示,棧上18FA90-18FA88的位置記錄了strcpy函數在棧內操作的變化,可以看到直接把a1的值賦給了v3,18FA8C存儲的是v3的地址,可以看到18FA8C指向的位置是0018FAE0,這個位置上已經是被賦值好“123456”字符串了。而由於局部變量v3位於棧上,並且strcpy沒有限制a1要複製的長度,所以會有可能造成棧溢出覆蓋當前函數ebp(存儲了上個函數的ebp的地址)及返回地址。

        所以造成棧溢出的主要原因是當前函數將局部變量、參數儲存在了棧上,調用strcpy、sprintf、vsprintf這樣的函數之前,將傳入參數的地址push進棧,然後strcpy、sprintf、vsprintf這樣的函數再當給位於棧上的變量賦值超過其定義的長度時就會發生溢出的問題。如圖(e)所示,ss:[ebp-xxxh]指的就是棧內的位置,這些變量、參數都會預留一定的空間。

                                                                       (e)OllyDbg調試過程中截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章