在上个星期学习Unix看到一段趣闻,Unix的开创者Ken Thompson在编译器中安插后门,使得他可任意登录一台看似很安全的Unix系统。很多安全专家看了一遍又一遍的Unix源代码,始终没发现原因,他们总在以为自己机器固若金汤的时候被大神悄然登录。后来在一个颁奖典礼上大神给出了原因。。其中涉及到一个程序,这个程序能输出自身的源代码。大神告诉我们,自己手动实现代码能获得更多的乐趣和感受。然后自己就尝试了下。。终于在今天晚上弄出来了。。呵呵!
1.初级实现
int main(){char *s="int main(){char *s=%s;printf(s,s);return 0;}";printf(s,s);return 0;}
|
这种实现了输出大部分代码,但在双引号处出现了问题,但现在没想到一个很好的方法能稍微改动代码便能完全输出代码,要不这是一个很好的实现方法。双引号问题出现的原因是
a. C中字符串必须有""括起来
b. printf输出时有很多限制,要输出"必须用\"来实现,要输出\必须用\\来实现。形成死循环
2.最终实现
上述问题解决的关键是自由的控制输出,用printf有点受限制。所以我们自己手动解析输出格式,用putchar来实现输出。另一个注意事项是必须直接使用"和\,最好用其对应的数字代替,因为它们都是比较郁闷人的东西。
int main(){char *s="int
main(){char *s=%s;int
i,j;for(i=0;i;int i,j;for(i=0;i<strlen(s);i++){if(s[i]=='%'&&s[i-1]=='='){putchar(34);for(j=0;j<strlen(s);j++)putchar(s[j]);putchar(34);i++;}else{putchar(s[i]);}}return 0;}
|
哈哈。。问题AC。期待看大神是怎么解决这个问题的。好奇实现这个功能的最少代码是怎么的?
阅读(3915) | 评论(3) | 转发(0) |