在學習c/c++的時候,就講到了一些C型別的字串函式不是安全的,比如strcpy沒有檢查長度會溢位,推薦使用strncpy,筆試面試也經常問到。同時經常瀏覽安全相關的新聞,緩衝區溢位攻擊是很常見的一種。那緩衝區溢位為什麼可以攻擊。今天通過strcpy進行簡單的演示。
如下是guess_pwd.cpp程式碼
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Invalid params\n");
exit(1);
}
bool check_result = false;
char pass[10];
memset(pass,0,10);
strcpy(pass, argv[1]);
if (0 == strcmp("xuzeshui", pass))
{
check_result = true;
}
if (check_result)
{
printf("Check password succ!\n");
}
else
{
printf("Check password failed!\n");
}
return 0;
}
上面的程式碼使用g++編譯 g++ -o guess_pwd guess_pwd.cpp 生成可執行檔案。當我們執行下面的輸入。
./guess_pwd 0123456789012345
我們期望的是提示”Check password failed!”,結果卻提示了”Check password succ!”。說明儘管我們不知道密碼是多少,但通過緩衝區溢位,繞過了密碼的安全檢驗邏輯。
上述check_result和pass兩個變數由於是區域性變數,故申請的時候是在棧上分配。由於棧是從高地址往低地址,所以從地址由低到高,check_result分配在pass後面,當進行strcpy操作的時候,因為沒有檢測輸入長度,所以pass溢位了,會覆蓋後面的記憶體區域。由於check_result在pass後面,所以當溢位足夠的時候,check_result被改寫了。
PS:check_result是否是僅挨著pass分配那不得而知,這個取決於編譯器的優化,但是溢位就面臨資料被異常改寫的風險。
轉載自聽風江湖
本文連結地址: strcpy溢位的攻擊示例