我对 C 的 printf() 中双引号和单引号的使用有疑问。我有以下代码:
#include<stdio.h>
int main(int argc, char** argv) {
char buffer[100];
strncpy(buffer, argv[1], 100);
printf(buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以当我编译并运行它时,会发生以下结果:
./a.out 'AAAA%8$p'
AAAA0x70243825**41414141**
./o "AAAA%8$p"
AAAA
Run Code Online (Sandbox Code Playgroud)
请注意,在第一种情况下,我输入了单引号,在后一种情况下,我输入了双引号。
这里发生了什么。
Q2。我正在关注此链接。所以我的问题是,运行时输入 argv[1] 中的 AAAA 如何能够影响 printf() 的输出。起初我以为这只是巧合,但我输入并得到以下内容
./o 'BBBB%8$p'
BBBB0x70243825**42424242**
Run Code Online (Sandbox Code Playgroud)
编辑:所以我认为看到答案存在一些误解。我知道直接“printf(buffer)”的滥用。因此,我将引用我之前提到的相关链接:
由于 printf 的参数数量可变,因此它必须使用格式字符串来确定参数数量。在上面的例子中,攻击者可以传递字符串“%p %p %p %p %p %p %p %p %p %p %p %p %p %p %p”并欺骗 printf 认为它是这样的有 15 个参数。它会天真地打印堆栈上接下来的 15 个地址,认为它们是它的参数:
$ ./a.out "%p %p %p %p %p %p %p %p %p %p %p %p …Run Code Online (Sandbox Code Playgroud)