【轉】strcpy溢位的攻擊示例

Dsp Tian發表於2017-08-27

在學習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溢位的攻擊示例

相關文章