使用者工具

網站工具


programming:compiling_a_compiler

差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
programming:compiling_a_compiler [2007/02/25 14:41]
wenpei 建立
programming:compiling_a_compiler [2007/02/25 14:44] (目前版本)
wenpei
行 81: 行 81:
  
 是compiler CC1並沒有辦法compile這段程式,因為CC1看不懂程式中的'​\v'​!這似乎是一個邏輯陷阱,在實際develop的時候得多花手續。詳見Ken Thompson的原文。 是compiler CC1並沒有辦法compile這段程式,因為CC1看不懂程式中的'​\v'​!這似乎是一個邏輯陷阱,在實際develop的時候得多花手續。詳見Ken Thompson的原文。
 +
 +
 +====== Ken Thomposon 現身說法 ?!  Compiling a Compiler 解答篇 ======
 +by 8123033 穆信成
 +
 +http://​www.cis.nctu.edu.tw/​chinese/​doc/​research/​doc/​cismagazine/​cis-magazine-84-1.html
 +
 +  Comp.lang.lisp 有一段時間挺混亂的. 一個Lisp討論區,​ 最新的 post 卻都不是什麼lisp 討論. 有人在批評 C 語言, 有人在抱 怨 UNIX 的指令太難記,​ 當然有人批評就有人反駁. 一些老讀者 終於看不下去了,​ 不得不大聲疾呼要回歸這個討論區的本來面貌,​ 但看大家熱烈的興頭,​ 要打完這許多場筆戰還有得等的呢.
 +
 +  就在這時候,​ 有人又想起了 Ken Thomposon 在他的圖寧獎演講中 所提及, 放在C compiler 中的那個特洛伊木馬了. 我曾在資訊人 園地 『 Compiling a Compiler 』 中談到這個故事. 『特洛伊 木馬』, 指的是外表看起來無害,​ 但內裡暗藏玄機的程式. 據 Ken 所說, 他在 C compiler (事實上應該是 pre-processor) ​ 中放了一個後門,​ 如果compiler發現它所處理的程式是 login 的 原始程式,​ 它就會在裡面加入一段程式碼,​ 讓 Ken Thomposon 可以 login 進去. 由於 UNIX 得用 C compiler 來編譯, 這意味 著 Ken 將可以進入任何裝 UNIX 的電腦; 那麼, 我換個乾淨的 compiler 總可以吧?​ 但新 compiler 的原始碼也得由舊compiler 來編譯, 而為了讓這個特洛伊木馬能流傳久遠,​ 如果舊 com- piler 發現自己正處理的的是另一個 (正常的) C compiler, 它 就會把上面那段『如果是login,​ 就加入一段...』 的那段程式碼,​ 給插到這個compiler裡面去.
 +
 +  就在 comp.lang.lisp 正為了一些 UNIX / C 的問題吵得興高采 烈之際, 大家又回想起了這個老故事. 於是有人問了,​ 真有這麼 回事嗎? 抑或 Ken Thomposon 只是說說而已?​ 如果他真做了這麼 巧妙的一個特洛伊木馬 , 現在他已經可以進入世界上任何一台 UNIX 工作站, 如入無人之境了. 有人說, 這不過是 『一個可能 發生的假想』而已. 畢竟要寫出這樣的一個compiler,​ 可需要很 高的技術水準呢. 也有人說,​ 他當然把這個駭人聽聞的 compiler ​ 給寫出來了,​ 只是沒有流出去罷了. 有人引了Ken的一段話,​ " ​ The actual bug I planted in the compiler would match  code in the UNIX '​login'​ command",​ 看到沒有,​ 『actual』 ​ 唷, 當然是真有其事啦. 更有人言之鑿鑿地保證,​ Ken 在一次 UNIX user group 集會中曾暗示著,​ 他已經把這個特洛伊木馬給 送出去啦!
 +
 +  終於有人在翻出Ken Thomposon的 email address後, 親自去向他 本人求證了. Ken 的回信說,​ 他並沒有看comp.lang.lisp 的習慣. 聽說了這個消息後,​ 才上去看了看相關的討論. 然而, 直接在 newsgroup 裡頭回話似乎會引起更多的誤會,​ 於是他就不親自出 面囉!
 +
 +  原來,​ Ken 在做出了這個特洛伊木馬之後,​ 便半哄半騙地讓 Unix Support Group 裝了他們的compiler. 大約一個月後,​ login程式 就如同預期地被感染了. 然而Unix Support Group 也不是等閒之 輩. 不久之後,​ 有人發現了,​ 這個C pre-processor 的 symbol table 怎麼怪怪的?​ 於是他們直接研究 compiler 產生的目的碼, ​ 看看到底 Ken Thomposon 在搞什麼鬼. 最後 Ken 的計謀就曝光 啦.
 +
 +  Unix Support Group 也不急著找 Ken 算帳, 倒是用很妙的方法 解決了這個特洛伊木馬. 能直接產生目的碼的 compiler 大都有 一個 -S 的選項, 亦即要 compiler 產生組合語言檔,​ 而非目的 碼. 產生組合語言檔的一個理由是讓人來讀,​ 可以除錯用. 因此 為了避免被發現,​ 這個特洛伊木馬在用 -S 編譯的時候是不做壞 事的. Unix Support Group 便把所有的程式用 -S 選項編譯一次, ​ 再另外用 assembler 產生目的檔. 於是, 這個特洛伊木馬就消失 啦!
 +
 +  Ken 說, 這個特洛伊木馬僅在他們之間被當作一個惡作劇的小把 戲, 從來沒有流出去過. 得到這個答案的 Jay R. Ashworth 很 得意地把這封 email 貼了出來,​ 並且告訴大家,​ 最好把這封信存 起來, 以備下次又有人說起這件懸案時,​ 就可以拿出來現寶囉! 以下是 Jay R. Ashworth 貼的原文. 檔頭和引言已經刪掉了.
 +<​code>​
 +---------------------------------------------------------
 +
 +Proving that the real Mrs. Robinson stood up.
 +
 +It occured to me last week that ken@research.att.com is _still_ a valid address, 25 years later... so I asked. Here, from Ken himself, is the Real Story:
 +) From ken@plan9.att.com Sun Apr 23 14:42 EDT 1995
 +) Received: from plan9.att.com by IntNet.net (5.x/​SMI-SVR4)
 +) id AA19375; Sun, 23 Apr 1995 14:42:51 -0400
 +) Message-Id: <​9504231842.AA19375@ IntNet.net>​
 +) From: ken@plan9.att.com
 +) To: jra@IntNet.net
 +) Date: Sun, 23 Apr 1995 14:39:39 EDT
 +) Content-Type:​ text
 +) Content-Length:​ 928
 +) Status: RO
 +
 +)
 +
 +thanks for the info. i had not seen
 +) that newsgroup. after you pointed it
 +) out, i looked up the discussion.
 +
 +) writing to news just causes more
 +) misunderstandings in the future. there
 +) is no way to win.
 +[
 +
 +note: I asked him if he minded my posting the reply, he had no objection ] ) fyi: the self reproducing cpp was
 +) installed on OUR machine and we
 +) enticed the "unix support group"
 +) (precursor to usl) to pick it up
 +) from us by advertising some
 +) non-backward compatible feature.
 +) that meant they had to get the
 +) binary and source since the source
 +) would not compile on their binaries.
 +
 +) they installed it and in a month or
 +) so, the login command got the trojan
 +) hourse. later someone there noticed
 +) something funny in the symbol table
 +) of cpp and were digging into the
 +) object to find out what it was. at
 +) some point, they compiled -S and
 +) assembled the output. that broke
 +) the self-reproducer since it was
 +) disabled on -S. some months later
 +) the login trojan hourse also went
 +) away.
 +
 +) the compiler was never released
 +) outside.
 +
 +) ken
 +
 +Everyone: please save this post, so the next time the question comes up,
 +you can just go look. :-)
 +
 +Cheers,
 +-- jr 'will bug legends for food' a
 +-- 
 +Jay R. Ashworth High Technology Systems Consulting Ashworth
 +Designer Linux: The Choice of a GNU Generation & Associates
 +ka1fjx/4 "I minored in babbling in college... and got +1 813 790 7592
 +jra@baylink.com honors in it." --Brian Heath NIC: jra3
 +
 +Unix System Lab 
 +</​code>​
programming/compiling_a_compiler.1172385672.txt.gz · 上一次變更: 2007/02/25 14:44 (外部編輯)