首先以一种更清晰的方式写出来(除了布局不改变任何东西):
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";
main()
{
printf(f,34,f,34,10);
}
所以我们看到了一个main
我们所期望的函数(它应该返回一个int
但你可以在 C 中不使用 not;同样对于没有函数参数)。在此之前,一个常规字符串。这是一个看起来很有趣的字符串,但它与char*f="fish";
.
好的,那么如果我们printf
通过手动将字符串放在那里来扩展呢?
printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);
我们可以看到它会打印出一些废话,并在此过程中替换一些值。他们是:
First %c : 34 (the ASCII code for " (quotes))
First %s : 'f' (our string, once again)
Second %c : 34 (" again)
Third %c : 10 (the ASCII code for Newline)
让我们也将它们全部替换(尽管我已将字符串的内容替换为<the string>
, 和"
' \"
s 以使其实际作为独立语句工作):
main()
{
printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}
看看那个! main
简单地打印出我们首先开始的行。欢呼!
编辑添加:
虽然我基本上已经为你拼出了答案,但仍有一个谜题。自己考虑一下为什么我们要麻烦替换34, f, 34, 10
,而不是像我在最终代码中所做的那样将它们直接放入字符串中。