我最近发现了这个奎因
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);我就是没法把头绕着它。我在google上没有找到任何解释,所以我希望有人能向我解释一下这个东西的工作原理:-)
发布于 2013-10-10 08:31:47
查看printf参数并手动替换它们,
(39是单引号,'是换行符,当解释为%c时,10是换行符\n )所以$a的开头是
$a=%c%s%c;printf($a,39,$a,39,10);%c变为(用^替换下面标记的字符)
$a='%s%c;printf($a,39,$a,39,10);%c
^ (first %c replaced)
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c%c;printf($a,39,$a,39,10);%c
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (%s replaced)
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);%c
^ (second %c replaced)最后
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);\n
(last %c replaced) ^^ 发布于 2013-10-10 08:39:32
这段代码由两行组成。
可变赋值:
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';和一个printf
printf($a,39,$a,39,10)首先,让我们学习一些关于printf的知识。如果您检查sprintf documentation,您将看到printf('%c',39)将打印第39个字符,即',而printf('%c',10)是换行符\n。要记住的另一件事是,printf接受一个参数列表,这意味着printf('%s%s','foo','bar')将打印foobar。
因此,现在应该清楚的是,printf($a,39,$a,39,10)采用了来自$a的格式,并进行了以下4次转换(等于$a字符串中%符号的数量)
39用于%c的第一次出现(检查$a变量),$a用于%s。39的printf的第四个参数%c%c的%c这会导致它自己的源代码的副本。
https://stackoverflow.com/questions/19290540
复制相似问题