關於C C 記憶體一點小知識

2021-06-09 00:49:03 字數 731 閱讀 4097

這裡室友拷了一段**過來除錯,這個過程中發現了一點由使用了未分配的記憶體造成的乙個問題,為此我花了一點時間來除錯問題的根源;

**如下:

#include #include using namespace std;

int main() if

(flag) 

else

return

0; } 

答:破解上述加密的關鍵在於利用攻破strcpy()函式的漏洞。所以使用者在向「passwd」快取輸入隨機密碼的時候並沒有提前檢查「passwd」的容量是否足夠。所以,如果使用者輸入乙個足夠造成快取溢位並且重寫「flag」變數預設值所存在位置的記憶體的長「密碼」,即使這個密碼無法通過驗證,flag驗證位也變成了非零,也就可以獲得被保護的資料了。例如:

$ ./psswd aaaaaaaaaaaaa 

password cracked 

雖然上面的密碼並不正確,但我們仍然可以通過快取溢位繞開密碼安全保護。

要避免這樣的問題,建議使用 strncpy()函式。

作者注:最近的編譯器會在內部檢測棧溢位的可能,所以這樣往棧裡儲存變數很難出現棧溢位。在我的gcc裡預設就是這樣,所以我不得不使用編譯命令『-fno-stack-protector』來實現上述方案。

關於sqlServer的一點小知識

以前用的資料庫都是mysql或者oracle,對sqlserver還真的是很陌生,老師今天突然交給我乙個任務。任務首 先要做的就是匯入sqlserver資料庫,還是個 mdf格式的,可憐我以前只匯入過oracle的dmp檔案,呵呵,不 過沒事,網路如此的發達,我就不信找不到解決問題的方法。so簡單的...

C C 記憶體管理一點問題

1.常見的記憶體錯誤及其對策 記憶體未分配成功卻使用了它 在使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert p null 進行檢查 如果使用malloc或者new來申請記憶體,應該用if p null 或if p null 進防錯處理。無論用何種方式建...

Linux一點小知識

ps o pid,pgid,ppid,comm cat pid pgid ppid command 17906 17906 17905 bash 18011 18011 17906 ps 18012 18011 17906 cat 1.程序組 pid為程序自身的id,pgid為程序所在的程序組的id...