我最近发现了这个问题
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);
我无法理解它。我在google / SO上找不到这个特定的解释,所以我希望有人可以向我解释这个东西是如何工作的: - )
答案 0 :(得分:5)
此代码由两行组成。
变量赋值:
$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
的{{1}}的第4个参数printf
%c
10
会生成自己的源代码副本。
答案 1 :(得分:3)
查看printf
参数并手动替换它们,
(39
为单引号,'
,10
在换算为\n
时为换行符%c
)
所以$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) ^^