利用外部控制格式字符串的漏洞

时间:2019-05-27 12:39:24

标签: c

首先,请考虑一下该网站(https://cwe.mitre.org/data/definitions/134.html)。他们是一些具有漏洞的代码。他们谈论的是我真的不知道漏洞代码在哪里。

该网站上提供了3个具有漏洞的代码段,例如PrintWrapper,Snprintf和%1 $ d。

1 个答案:

答案 0 :(得分:1)

@CassieJade,您需要在线查看这些功能的文档。 printf, snpritf是非常常见的功能。顺便说一句,这个平台不适合学校作业。如果您尝试过一些东西并希望从那里开始,我们将非常欢迎。

  1. http://www.cplusplus.com/reference/cstdio/printf/
  2. http://www.cplusplus.com/reference/cstdio/snprintf/

以下内容很好地说明了您对$的关注。 (GCC) Dollar sign in printf format string

符号%2$d的含义与%d(输出带符号整数)相同,除了它使用给定的基于1的数字格式化参数(在您的情况下,它是第二个参数b)。

int a = 3, b = 2;

printf("%2$d %1$d", a, b);

在这里您希望打印3 2,但是它将打印2 3,因为参数a变为param#1,b变为param#2,并且首先打印%2 $ d,所以先打印2由%1 $ d等于3

您可能想看一下printf的man page,它对于新手来说有点复杂,但它是最终的真理。

以下是您的打印包装纸。

char buf[5012];
memcpy(buf, argv[1], 5012);
printWrapper(argv[1]);
return (0);
  

您的网站说:攻击者可以修改   外部控制的格式字符串,这可能导致缓冲区   溢出,拒绝服务或数据表示问题。

现在,如果此argv 1可以由不受信任的人提供,则他可以提供任何将要传递给printf的垃圾参数。您任务的目标是不使用任何外部控制的字符串来提供print()。 例如argv 1可以是非常大的字符串(最大允许)。 或者例如,我是一个正在调用您的程序的人,并且我将argv 1传递为“%d Hello World”,则您的printWrapper最终将输出诸如“ -446798072 Hello World”之类的垃圾,因为没有整数作为参数传递在printf(argv 1)中。

另外memcpy正在从源argv 1读取固定数量的字节,该字节可以具有较短的字符串,在这种情况下,它将是无效的读取(读取越界)。

  

snprintf(buf,128,argv[1]);

这里的利用非常清楚,可以通过包含多个指定符(例如%n)来更改argv 1,这些指定符可以向您的buf中写入n个字节,而不是预期的写入。通过在argc 1中使用%X,黑客可以获得堆栈上变量的地址,该地址可以被进一步利用。所有这些都是容易受到攻击的,因为外部不可信来源正在创建由printf或snprintf,sprintf函数使用的格式说明符字符串。 例如,假设黑客在argv 1中输入了“%200d”。 sprintf(buf, 128, argv[1]); 将先打印200个字节,然后再打印一个垃圾整数,这可能根本不是故意的,因为它的snprintf是一个有界函数,它将只允许写入128个字节,该字节将为空。

我希望现在已经清楚了。