Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151288
  • 博文数量: 32
  • 博客积分: 2053
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 12:45
文章分类

全部博文(32)

文章存档

2011年(12)

2010年(20)

分类: LINUX

2010-09-14 00:24:22

在上个星期学习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。期待看大神是怎么解决这个问题的。好奇实现这个功能的最少代码是怎么的?
阅读(3854) | 评论(3) | 转发(0) |
0

上一篇:Thompson shell

下一篇:linux-loopback.c

给主人留下些什么吧!~~

chinaunix网友2010-11-28 01:04:22

以及那个双引号的解决方法没有这么麻烦 main(){char *s="main(){char *s=%c%s%c;printf(s,0x22,s,0x22);return 0;}";printf(s,0x22,s,0x22);return 0;}

chinaunix网友2010-11-27 23:55:00

呵呵,今天看UVA发现了这道题,写了个用宏定义的 #include #define A(a) int main(){printf("#include \n%s\nA(%s)",#a,#a);while(1);} A(#define A(a) int main(){printf("#include \n%s\nA(%s)",#a,#a);while(1);}) 欢迎交流~呵呵~http://www.freopen.com/?p=10281

chinaunix网友2010-09-14 14:39:07

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com