作为任务的一部分,我需要利用下面分享的C代码中的printf()漏洞。当我使用一个字符串运行代码时(例如:./format "foo"),我应该用其他东西替换“X equals to 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
函数调用缺少参数,而且某些参数的类型与格式说明符不匹配。为什么会有人发布这样的代码让你来利用? - Weather Vaneprintf(argv[1])
行的输出进行更改。但是,由于printf(argv[1])
不是一种安全的打印方式,因此可以通过使用诸如"%n..."
或"%s%s%s...."
之类的字符串来利用它(例如,您可以使用这些字符串读取内存等)。我需要做的是更改X变量,但我找不到正确的字符串来更改变量。 - Orhan Gazi Yalçınprintf(argv [1]);
之前没有检查argc
,因此您已经拥有了一个漏洞。 - Weather Vaneprintf
如果在堆栈上传递参数的事实,第一次调用的参数(包括p
,即x
的地址)仍将在该内存空间中。然后,您可以从argv [1]
传递另一个格式字符串,以重用这些参数。这是完全未定义的行为,并且极度依赖于实现,但在课程使用的编译器上可能有效。 - Bo Perssonprintf("x=%d, sizeof(x): %zu, %x = %p, sizeof((p):%zu,&p = %p, \n", x, sizeof(x), &x, sizeof(p),&p);
并且使用%n
插入代码是可行的,正是由于这种不匹配。我正在尝试找出如何在不出现“段错误11”的情况下使用%n
。@mfro - Orhan Gazi Yalçın