此 C 代码中的漏洞是什么?
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;
}
您的代码只是一个 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;
}
用mingw编译。
结果:
为什么会这样?因为缓冲区已经覆盖了 passwordcorrect 变量。它与系统、实现等相关,但黑客攻击不是抽象的或可移植的:)
那里根本没有缓冲区溢出。但这并不意味着它是安全的。
您应该发现的问题是这一行:
printf(lbuf);
无论何时提供格式字符串,请确保它在您的控制之下,并且只要求提供您提供的参数。访问未提供的参数或错误类型的参数会导致未定义的行为(可能会发生各种奇怪和潜在危险的事情)。另外,可以用%n
来戳内存,这显然更危险。
在这种情况下,lbuf
包含 Welcome:
后跟任意不安全的用户输入。
此外,程序无条件读取argv[1]
(假设argc > 0
),并在传递给[=17=时进一步假设它指向一个字符串(假设argc > 1
) ].
我试图更好地理解缓冲区溢出攻击,这是出现的练习之一,它存在缓冲区溢出漏洞。我想知道如何利用此代码中的漏洞。 我不确定如何搜索它。
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;
}
您的代码只是一个 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;
}
用mingw编译。
结果:
为什么会这样?因为缓冲区已经覆盖了 passwordcorrect 变量。它与系统、实现等相关,但黑客攻击不是抽象的或可移植的:)
那里根本没有缓冲区溢出。但这并不意味着它是安全的。
您应该发现的问题是这一行:
printf(lbuf);
无论何时提供格式字符串,请确保它在您的控制之下,并且只要求提供您提供的参数。访问未提供的参数或错误类型的参数会导致未定义的行为(可能会发生各种奇怪和潜在危险的事情)。另外,可以用%n
来戳内存,这显然更危险。
在这种情况下,lbuf
包含 Welcome:
后跟任意不安全的用户输入。
此外,程序无条件读取argv[1]
(假设argc > 0
),并在传递给[=17=时进一步假设它指向一个字符串(假设argc > 1
) ].