⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000005.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果再用CC2来compile一个正常的login程式,由於CC2中有了patch1,所以&nbsp;<BR>compile出来的login程式也会有後门,让我任意的login;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;,--------.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-----------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,----------.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;login&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;Compiled&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;login&nbsp;&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;source&nbsp;|=====&gt;|&nbsp;&nbsp;by&nbsp;CC2&nbsp;&nbsp;&nbsp;|=====&gt;|&nbsp;Program&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(clean)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|(patch&nbsp;1,2)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|(patched!)|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;`--------'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-----------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`----------'&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果用CC2&nbsp;compile另一个compiler&nbsp;CC3,由於CC2中已经被加入了&nbsp;patch2,&nbsp;<BR>CC3又会被污染,也就是说CC3这个compiler中还是会有patch1和patch2......如&nbsp;<BR>此一来,全世界的每一套UNIX都种下了这个後门,可以让我任意login!&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;然而这些patch都只在binary档之中出现。CC2的source&nbsp;code一切正常,所以&nbsp;<BR>从source&nbsp;code完全看不出有什麽不对劲呢!我们还可以进一步湮灭证据。一旦装&nbsp;<BR>好一套系统,公开的CC1&nbsp;source&nbsp;code中不必有动过手脚的程式码,只要让它被动&nbsp;<BR>过手脚的compiler编译就可以了。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;有著无辜的包装,事实上内容暗藏玄机的程式,称作″特洛伊木马″。&nbsp;这个&nbsp;<BR>特洛伊木马的故事有趣吗?(注1)&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;用C语言写C&nbsp;compiler,写出来的程式会是个什麽样子呢?&nbsp;举个例子,一个C&nbsp;<BR>compiler可能有一段前置处理程式在处理C字串中的溢出字元。比如说,compiler&nbsp;<BR>需要把如下的字串:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;Figure&nbsp;listings&nbsp;:\nFigure1\tA&nbsp;Complete&nbsp;Tree\n.....&quot;&nbsp;<BR>给转换成:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Figure&nbsp;listings&nbsp;:&lt;换行码&gt;Figure1&lt;TAB的码&gt;A&nbsp;Complete.....&nbsp;<BR>这段程式可能看起来像这样(为简单起见,这个程式从标准输入读进原始码,送到&nbsp;<BR>标准输出):&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((c=getchar())=='\')&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(getchar())&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'n'&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\n');&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'t'&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\t');&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(c);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;好像有点奇怪,是吗?明明用if和switch把溢出字元'\'以及後面的'n','t',&nbsp;<BR>分开了,在putchar的地方又送出'\n',&nbsp;'\t'。如果您见多了用某语言写自己的&nbsp;<BR>compiler的情况,对於这种程式段落也就见怪不怪了(注2)。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;C语言是个处在大家周遭而不常被注意到的例子。LISP语言只须简单的parser,&nbsp;<BR>不分程式和资料,使得用LISP写LISP&nbsp;interpreter的情形更是普遍,也是常用的教&nbsp;<BR>材。85级用的PL课本Chezzi&nbsp;&amp;&nbsp;Jazayeri&nbsp;的functional&nbsp;programming一章中,最後&nbsp;<BR>附的LISP程式就是一个LISP&nbsp;interpreter。如果您研究一下,会发现一些感觉挺像&nbsp;<BR>上面那个例子的段落。我自己玩了几年的LISP,到头来反倒除了LISP&nbsp;interpreter&nbsp;<BR>之外,就不会写其他什麽有用的程式了。这也是一个奇怪的现象呢。&nbsp;<BR>&nbsp;<BR>参考资料:&nbsp;ACM&nbsp;Turing&nbsp;Award&nbsp;Lectures&nbsp;:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;first&nbsp;twenty&nbsp;years&nbsp;1966&nbsp;to&nbsp;1985&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QA76.24&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;<BR>&nbsp;<BR>注:1.&nbsp;原本我以为Ken&nbsp;Thompson只是写写罢了。後来据一些人说,这完全是Ken&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thompson&nbsp;本人干过的真人真事。想像他老远到交大来参加conference,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大摇大摆的走上二楼机房,若无其事地login成root的情况吧。你相不相&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;信呢?&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;假设旧的compiler&nbsp;CC1并看不懂'\v'这个控制字元(垂直对齐),&nbsp;我们&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;想要有一个具有这个字元的compiler。新compiler&nbsp;CC2的source&nbsp;code可&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能是这样:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(getchar())&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'n'&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\n');&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'t'&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\t');&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'v'&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\v');&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是compiler&nbsp;CC1并没有办法compile这段程式,因为CC1看不懂程式&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中的'\v'!这似乎是一个逻辑陷阱,在实际develop的时候得多花手续。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;详见Ken&nbsp;Thompson的原文。&nbsp;<BR>&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -