如果問題是畢現的,就非常容易解決。你這裡是段錯誤,不是棧溢位。一般只有深層遞迴或者大的區域性變數才會有棧溢位。根據你的描述,eip被踩掉的可能比較大。另外sigsegv時,檢視寫入的非法地址和寫入的值是什麼也很關鍵。其他的一些建議,可以參考一下:
1. 所有的編譯警告都開啟。
2. 檢查一下calltrace,函式呼叫合乎邏輯,可以初步判斷eip是否被踩寫。
3. 嘗試所有的不安全的記憶體操作strcpy, sprintf, memcpy,改用strncpy等安全版本替換。
4. 檢查所有的暫存器值是否是合法地址,嘗試將它們指向的地址附近的記憶體dump出來,看是否有熟悉的結構或者字串。
5. 檢查pack位元組對齊是否一致,特別是用到第三方庫的情況。
6. 是否有整數溢位,signed/unsigned是否有不安全的混用。...
如果問題是畢現的,就非常容易解決。你這裡是段錯誤,不是棧溢位。一般只有深層遞迴或者大的區域性變數才會有棧溢位。根據你的描述,eip被踩掉的可能比較大。另外sigsegv時,檢視寫入的非法地址和寫入的值是什麼也很關鍵。其他的一些建議,可以參考一下:
1. 所有的編譯警告都開啟。
2. 檢查一下calltrace,函式呼叫合乎邏輯,可以初步判斷eip是否被踩寫。
3. 嘗試所有的不安全的記憶體操作strcpy, sprintf, memcpy,改用strncpy等安全版本替換。
4. 檢查所有的暫存器值是否是合法地址,嘗試將它們指向的地址附近的記憶體dump出來,看是否有熟悉的結構或者字串。
5. 檢查pack位元組對齊是否一致,特別是用到第三方庫的情況。
6. 是否有整數溢位,signed/unsigned是否有不安全的混用。...