【发布时间】:2017-10-16 18:17:19
【问题描述】:
作为作业的一部分,我希望利用下面共享的 C 代码中的 printf() 漏洞。应该是这样的,当我用字符串运行代码时(例如./format“foo”),我应该用其他东西改变“X等于1”中的“1”。我相信我需要更改 X 变量的值,但如果您有不同的想法,请随时分享。代码如下:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int *p;
int x = 1;
p=&x;
printf("x=%d, sizeof(x): %zu, %x = %p, sizeof((p):%zu,&p = %p, \n", x, sizeof(x), &x, sizeof(p),&p);
printf(argv[1]);
printf("\nX equals: %d \n", x);
return 0;
}
【问题讨论】:
-
我不明白你想利用什么。
printf调用没有足够的参数,并且某些参数的格式说明符类型错误。为什么有人会发布这样的代码供你利用? -
不太清楚你所说的“利用”是什么意思,你可能使用了不正确的格式说明符。大多数时候它会打印废话而不是格式化变量,尽管它会在技术上调用 ub 并且可能不会产生预期的效果。
-
当我在终端上传递一个字符串(例如 ./format "foo")时,我通常只能对
printf(argv[1])行的输出进行更改。但由于printf(argv[1])并不是一种完全安全的打印方式,因此可以通过使用"%n..."或"%s%s%s...."等字符串来利用它(例如,您可以使用这些字符串读取内存等)。我需要做的是更改 X 变量,但我找不到合适的字符串来更改变量。 -
你已经有一个漏洞,因为你没有在
printf(argv[1]);之前检查argc -
我发现存在一个漏洞,因为格式字符串与
printf("x=%d, sizeof(x): %zu, %x = %p, sizeof((p):%zu,&p = %p, \n", x, sizeof(x), &x, sizeof(p),&p);和%n用于插入代码的行中的实际参数不匹配。这是可行的,因为不匹配。试图弄清楚如何在不获得segmentation error 11的情况下使用%n。 @mfro