[英]What is the vulnerability in this C code?
我試圖更好地理解緩沖區溢出攻擊,這是出現的練習之一,它具有緩沖區溢出漏洞。 我想知道如何利用此代碼中的漏洞。 我不確定如何搜索。
int
main(int argc, char **argv)
{
(void) foo(argv[1]);
exit(0);
}
int
foo(char *arg)
{
return bar(arg);
}
int
bar(char *arg)
{
char lbuf[1024];
if (strlen(arg) >= 1024)
return -1;
memset(lbuf, 0, sizeof(lbuf));
sprintf(lbuf, "%s", "Welcome: ");
read(0, lbuf + strlen(lbuf), sizeof(lbuf) - strlen(lbuf) - 1);
printf(lbuf);
fflush(stdout);
return 0;
}
那里根本沒有緩沖區溢出。 但這並不意味着它是安全的。
您應該找到的問題是此行:
printf(lbuf);
每當您提供格式字符串時,請確保將其安全地控制在您的控制之下,並且僅詢問您提供的那些參數。 訪問未提供的參數或類型錯誤的參數會導致未定義的行為(可能會發生各種奇怪且潛在危險的事情)。 另外,可以使用%n
戳一些內存,這顯然很危險。
在這種情況下, lbuf
包含Welcome:
其后是任意不安全的用戶輸入。
另外,該程序無條件地讀取argv[1]
(假設argc > 0
),並進一步假定將其傳遞給strlen()
時,它指向一個字符串(假設argc > 1
strlen()
。
您的代碼只是一個UB,沒有任何可能的破解(如果我們僅考慮緩沖區溢出並將分析任何其他可能的破解)。
要使用的緩沖區溢出攻擊技術必須覆蓋程序稍后使用的某些數據。 可能是更改變量,或放置了一些代碼(較不常見但可能)
一個例子:
#include <stdio.h>
#include <string.h>
int CheckPassword(void)
{
char passwd[5];
int passwordcorect = 0;
printf("Enter password:");
gets(passwd);
if(!strcmp(passwd, "1234"))
{
passwordcorect = 1;
}
return passwordcorect;
}
int main()
{
if(CheckPassword())
{
printf("\nSpecial priviledges granted!!\n");
}
else
{
printf("\nWrong!!\n");
}
return 0;
}
結果:
為什么會發生? 因為緩沖區已覆蓋passwordcorrect變量。 它與系統,實現等相關,但黑客行為不是抽象的或可移植的:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.