周景平:大家好,今天我給大家分享的主題是非主流的Fuzzing。這個主要是在我以往的一些漏洞挖掘領(lǐng)域的積累,有好多可能是好幾年前做的一些實踐,有一些是最近做過的一些實踐,主要是跟大家分享一下。
首先自我介紹一下,我的本名是周景平,目前在知道創(chuàng)宇當CSO,首席安全官。后面列舉了一些黑客組織,下面有我的電子郵箱,我比較喜歡分享一些觀點到微博上面,到Twitter,有知乎上面的一些分享,大家有興趣的話可以關(guān)注一下。
首先我要介紹一下什么叫Fuzzing,F(xiàn)uzzing的中文就是模糊測試。在這里列舉了一本書,有兩版,但是我不是說這個書有多牛,我覺得這個書一般。但是為什么會貼出來?我覺得它的標題寫得好,表達了Fuzzing的一些比較深刻的認識,是《模糊測試強制發(fā)掘安全漏洞的利器》,我覺得這個標題取得好。里面有一些介紹模糊測試的歷史、分類,我覺得可以參考,至于里面的一些內(nèi)容,大家仁者見仁。里面什么叫Fuzzing,在這本書的序言里面,就是MSF的創(chuàng)始人舉了一個例子,他有一個朋友,有一個小孩拿到一個蘋果電腦被鎖屏了,小孩一頓亂敲,結(jié)果把那個鎖屏解了,這個就是模糊測試。
在里面有一個定義,在我們安全界里面我常說的一句話就是,安全圈都是語文沒學好的,很多問題就糾結(jié)在中文的博大精深,你可以這樣解釋,也可以那樣解釋。比如我們安全界經(jīng)常爭論的,這個是漏洞嗎?什么是漏洞,什么是Bug,一提到這個問題大家就吵個不停。這個東西有時候很難下一個定義,我覺得這本書里面也可以借鑒一下。它就給這個模糊測試下了一個定義,他是說通過向應用程序提供非預期的輸入,并監(jiān)控輸出過程中發(fā)生的異常,發(fā)現(xiàn)這么一個軟件缺陷的方法。另外也提到了一句話,在里面代表了一些主流的思想,就是模糊測試數(shù)是利用自動化和半自動化的一個方法重復的向程序輸入。就像開始我舉例子這個小孩一樣,他不停的在鍵盤上輸入,恰好有某一個命令就解鎖了。
在這里我也類比了一下漏洞挖掘的過程和測試的結(jié)構(gòu)和流程。這個其實很簡單,就是按照定義來的,你首先輸入你的原始數(shù)據(jù),向你的目標程序解析執(zhí)行,你去監(jiān)控這個異常的輸出就行了。在那本書里面,他的結(jié)構(gòu)分得比較細。有一個識別目標,識別輸入,這是什么意思呢?這個就是好像你拿了一個軟件過來分析的話,你首先要更多的時候去了解它的協(xié)議,它是怎么樣輸入輸出的一個數(shù)據(jù)格式。對于文件格式類的,你可能要去分析一下這個文件格式是怎么一個構(gòu)造。然后你對于一個程序來說,哪些變量是你需要去控制的,這是一點。還有一點那個分類后面又解釋了說,這個監(jiān)測的異常不一定是漏洞,很可能是Bug。在這個Bug里面抽出來以后,再識別哪些是你要的漏洞。
我們第一步就是構(gòu)造這種非預期的輸入,我把它理解為這種生成模糊測試的樣本數(shù)據(jù),這個我認為是一個關(guān)鍵點。因為你所有的觸發(fā)這個漏洞的東西,就取決于這個數(shù)據(jù)的量或者變化有多大。你的變化越多,或者說你的變化越大,可能你發(fā)現(xiàn)的漏洞,發(fā)現(xiàn)的異常可能就更多。但是這個里面的數(shù)據(jù)結(jié)構(gòu)一般包括幾個,這個是按我個人的理解來分的,包括基本的數(shù)據(jù)結(jié)構(gòu)和模板及對應值。基本的數(shù)據(jù)模塊,比如就是一個文件格式,你要放一個crash,首先要有這么一個模板。要發(fā)Word文檔,本身自己有一個文件格式,但是文件格式里面還包括一些網(wǎng)絡(luò)協(xié)議,包括一個語言語法概念。對應的值一般就是在某個屬性的基礎(chǔ)上,你要給予復制。比如一般常見的,我們比較常見的注入里面來一個逗號,或者在某些內(nèi)層的漏洞里面給一個空的值,或者給一個超大的值,或者是給一個超長的字符串,告訴他內(nèi)存的溢出。所以這個其實就是告訴我們非預期的一個輸入。
這是一個例子,是一個瀏覽器的識別,其實你可以把基本的這些屬性定義化搜集,首先要搜集這些東西,把這些搜集到,然后里面第一部分提到了有很多值,包括常見的字符串格式化的漏洞,或者是給他來一個復值,或者來一個超大的支點,其實就是一個很典型的非預期輸入,首先要搜集一些前期的工作準備。
這個應用程序的解析其實就很簡單了,注意兩點就行了,對于Fuzzing來說,因為Fuzzing是要求自動化或者半自動化的東西。但是在這個階段,對于一個Fuzzing來說,一般要求是全自動化要不停的把你的數(shù)據(jù)提交到應用程序,不停的去測試解析。整個東西里面有一些注意點在設(shè)計的時候,比如說在跑的過程當中異常了,推出了,崩潰了,你怎么樣繼續(xù)跑下去?要怎么樣去處理這個異常?這是要注意的。然后就是框架穩(wěn)定性的這一步,當你大規(guī)模集群部署的時候,你這個Fuzzing不能中斷,一旦中斷了,后面樣本的測試就走不下去了。
這個里面要主要的主要是分類,就是說你這個Crash點是不是同一個,是屬于同一類的問題。假如說你海量的數(shù)據(jù),導致的異常太多了,你不去自動把它分類處理的話,有可能你這個樣本簡化半天,發(fā)現(xiàn)這個漏洞分析來分析去是同一個問題,極大的浪費了時間和成本。還有一種就是不能夠穩(wěn)定出現(xiàn),因為這種有一次性的Crash,就是只能跑一次它就崩潰了,你不能復現(xiàn),這種對于我們來說是沒有太大的意義的,你沒有辦法復現(xiàn)我怎么去調(diào)試呢?根本沒辦法。
這里面主要是講了一下主流Fuzzing的歷史和現(xiàn)狀。這本書里面有一個圖,其實當時也總結(jié)得還算OK,是總結(jié)到了2007年。最開始提出的應該是在1989年,有一個教授在學術(shù)圈測試穩(wěn)健性的時候就提出了這么一個方法,然后逐步發(fā)展。可以看到在這里面列舉了幾列,前期可以看出來,很多都是在文件格式里面,比如Word、Office系列的那些,后面又出現(xiàn)了基于瀏覽器的。到現(xiàn)在,我接著在后面總結(jié)了三個比較有名的,跟大家說一下。2010年Lcamtuf發(fā)布了一個Fuzzing的程序。為什么提他呢?因為他當時提出來,那個程序他剛剛發(fā)布的時候我就測試過,對于用的量比較少的那一類瀏覽器,提上去立馬卡死。為什么要提它?它的影響在哪里呢?現(xiàn)在還有好多人基于這個代碼進行修改,包括我前面貼圖的那個,也是參考了這個代碼進行修改。第二個是一個框架的代表,這個也是基于瀏覽器的。目前的主流Fuzz在瀏覽器這一塊應用得很廣,很多都在用瀏覽器。為什么要提這個框架?因為有很多公司或者說很多個人研究者在選用框架的時候去參考了這個框架,我也去嘗試過套用這個框架做測試,但是它的缺陷確實還是很明顯的。所以很多人做了自己的開發(fā)修改,好在它是開源的,可以去修改。第三個又是這個人,他現(xiàn)在是非常火的一個Fuzzing的工具,他跑出了很多的漏洞。這個人的理念相對來說是比較領(lǐng)先一點的,是跑內(nèi)存,各種方法,這個效果你可以去參考一下,確實是很驚人的,目前還在不斷的有人加入這個計劃去跑。
這個現(xiàn)狀,目前內(nèi)存型的漏洞主要的挖掘手段就是模糊測試,這個競爭是非常激烈的。你可以從瀏覽器IE,或者說Chrome、Firefox每一個去看,你會發(fā)現(xiàn)這個競爭是相當激烈的。而且另一個就是高度的定制化、私有化、復雜化,很多安全人員都開始有自己的開源工具,比如著名的我們557的一位博士,他自己寫了一個很牛的框架,他光ID就報了100來個CVE。而且我問了他一下大概用了多少機器,當時就是200個VM,這個產(chǎn)出是很驚人的。然后就是集群化和大規(guī)模化,前面谷歌有位安全人員在某個安全大會上分享了他們的一個云的Fuzzing,他就是已經(jīng)云端化了,把這個Fuzzing的機器集群已經(jīng)擴大到那種規(guī)模了,大概有4千臺機器,他沒提VMware。所以4千臺機器上面還部署了多少VMware不知道,所以這個量是很龐大的。現(xiàn)在包括百度、騰訊和360的,有大量的機器在做這一塊。這個截圖就是火狐上面的,可以看到Bug List上面有多少應用Fuzzing這個程序報告的。這個是谷歌的Fuzzing,這個是我用的一個。就因為這10幾臺的VMware,在去年我躋身于微軟漏洞挖掘100強里面,也就是10個。
前面講了那么多主流的東西,其實我今天要講的是非主流的,那種問題就來了,這種非預期輸入一定非得隨機化嗎?異常輸出就一定是Crash嗎?因為前面所有的框架異常處理都是找這個Crash崩潰的信息,這個是內(nèi)存的一種漏洞。或者我換一種提法,這個只適合于這種內(nèi)存型漏洞的測試碼?只有大規(guī)模的計算資源才能Fuzzing嗎?這個可以和第一個問題可以配合來,當你手上沒有多少資源的時候,你覺得走不下去了。我覺得不一定,我覺得有一點,不一定很復雜,這一點其實也是跟前面兩點可以一起說的,你必須有大量的機器,大量的計算力,必須開發(fā)很牛的框架來做這個Fuzzing的測試,這個Fuzzing的測試只適合找一些內(nèi)存型的漏洞。
我今天講這個非主要的就是想告訴大家,F(xiàn)uzzing雖然是一種漏洞挖掘Bug的方法,我更加認為它是一種思想,它可以適合于各種各樣的場景,不一定非得你做一個內(nèi)存型的漏洞挖掘。我要強調(diào)的就是你要有這種意識,當你在漏洞完全的時候,你要有這樣一種方法,可能快速的定位找到漏洞。
我們從漏洞挖掘的方法論到到Fuzzing,我們經(jīng)常用的一個方法論里面,首先我們一般對于一個漏洞挖掘者的學習經(jīng)歷來看一般都是這樣的,首先是分析別人的漏洞,或者分析漏洞以后,我會總結(jié)這個漏洞有什么樣的一個模型,我們能形成一個模型。然后我用這個模型去匹配和發(fā)現(xiàn)一些新的問題漏洞,在這個模型下面去找這個。其實這個東西你用的Fuzzing也是一樣的,我把最后一步做到自動化,首先通過我自己的分析,這個漏洞是這個樣的,原理是這個樣子的,是不是在技術(shù)的點還會有這樣的問題?我寫一個程序,自動化的變了一遍,或者我去嘗試,可能又發(fā)現(xiàn)是一樣的問題。
這里面還是要糾結(jié)到那三步,就是輸入數(shù)據(jù)的架構(gòu),其實這個東西有的時候就要根據(jù)不同的類型去做了。舉一個很簡單的例子,比如SQL注入的,有的時候你提交一個單引號或者是一個雙引號,它就出錯了,這就是異常信息。比如說XSS,提交一個能夠彈框的,按一個1,彈一個1出來,說明這也是一種異常,已經(jīng)執(zhí)行了。所以我們要抓住這兩點,就很好做一些事情。
這里面舉了幾個例子,第一個就是XSS的Fuzzing,在攻防里面有幾個方向,第一個方向就是找新的策略,就是人家的那個防護策略他根本沒考慮到這種方式能夠執(zhí)行,我要找的就是這個。還有一種方向就是說,我不跟你對抗,我繞過,利用你這個機制我提交兩次,一次以后我還原了原來的,這是一種對抗。所以這里面有一個原型,當時做測試就是這一句,就是一個反斜杠的利用。當時有人提出來,有一個XS的點,它的空格被過濾了,可能是其他機制過濾了,他沒辦法插入這個,后來就發(fā)現(xiàn)這個反斜杠可以。我們就順勢思考,這就是一個漏洞模型了,我總結(jié)出來了,就是一個漏洞模型,這是反斜杠。我們就很自然而然的想,會不會有其他的字符串可以做到這個效果?寫一個腳本很簡單,整個下面是PHP,就是這么一個代碼。
這個設(shè)計就是你怎么捕獲異常,我的意思就是說,假如瀏覽器成功執(zhí)行了1.PHP的話,解析了HPH的話,他會去訪問,所以我記錄了一個異常就行了,我當時測試有這么一些結(jié)果。我在測試的時候,做這個測試沒多久就有一個老外也做了相同的工作,他做的比我全,前面那兩個字符串我測過,沒有什么效果。他做得更廣,范圍更大,把寬字節(jié)什么都考慮到了。這個報告可以看一下,他的設(shè)計和我的方法其實也相當于差不多。這個里面的點模型還有很多,比如我這個空格,因為里面那句話的模型有很多,只是一個空格。這個空格定了,還有另外一個空格,假如兩者或者三者,或者各種各樣組合起來,其實你Fuzzing的數(shù)據(jù)量還是很龐大的。后來有另外一個老外,他干脆就寫了這么一個框架,你只要去在里面填充這個模板就行了,而且這個數(shù)據(jù)也是共享的,大家有興趣的可以去學習參考一下。
下面我講一個SQL注入的嘗試。在這個里面其實異常很簡單,前面反復提到了,提交一個逗號,或者說一個雙引號就可以了。Oracle有一個存儲過程的Fuzzing,這是我很早的一個研究。這個存儲過程其實有非常大的意義,假如玩過Oracle的話,會經(jīng)常利用它的漏洞,利用集成去注入,這就是一個典型的注入的代碼程序。這個里面的關(guān)鍵點,異常數(shù)據(jù)很簡單就是一個引號就行了,異常輸出也很簡單,就是他提示你的語法錯誤了,你抓到這個就行了。剩下你要做的,要想的是什么呢?你在里想思考的事,這個存儲過程有,這個參數(shù)有,那么其他參數(shù)有沒有?其他存儲過程有沒有?我們怎么想辦法把所有的東西都變了一遍,答案是可以的。所以通過一些研究,第一步就通過Object ID,就得到一些可擴展的參數(shù)。得到這個參數(shù)以后,這些得到的函數(shù)名和過程名是一樣的。這三步的目的都是為了得到存儲過程的名字、過程ID和變量的名字,剩下的就是你調(diào)用它,就可以判斷了。當時有一個朋友跟我寫過一個程序,我們配合的,效果還是有的,后面沒有去跑,而且自己后來方向變了,就沒有專注那一塊,慢慢放棄了,但是這個方式是OK的。
另外可以提一下比較有意思的一個案例,就是iis6下面有一個文件名解析的漏洞,雖然微軟一直不承認這是一個漏洞,他認為是一個特性,但是這個確實給很多網(wǎng)站帶來了困擾。就因為上傳這么一個文件,導致被解析了,所以繞過了很多的程序過濾。當時這個問題的發(fā)現(xiàn)應該是烏云他們那個團隊。他們當時給了一個公告,也沒給我細節(jié),我問過他們,他們還不告訴我。那么怎么辦呢?我只好自己去想辦法跑一下。其實這個設(shè)計很簡單,也是按之前的我變了一下所有的字符。這里面的異常判斷,直接CURL去訪問一下,如果能夠訪問到那個被解析的代碼說明是OK的。
我前面說的是一種思想,就是Fuzzing可以應用于很多的場景,這是在滲透測試中,其實我們也要很多用到的場景。比如說豬豬俠在某一年的烏云大會上講到的一個議題,就是自動化攻擊的這么一個現(xiàn)在和將來的議題,里面就提到了各種各樣的組合方法,比如生日和排列組合,各種年月日、名字,加到這個字典里面去模糊測試。其實這就是一個很典型的Fuzzing,我還可以跟我另外一個朋友分享一下,是在他的滲透測試中,這個有點想法,就像我開篇講的那個小孩一樣的。他就是通過在某次滲透測試中,他發(fā)現(xiàn)他搞定了一個權(quán)限,但是是一個低權(quán)限的,他通過很多的提權(quán)工具都沒有辦法。他唯一做的是什么事呢?這個時候他就坐在電腦面前盲目的敲,就用SU的那個盲目的敲密碼。他已經(jīng)敲了大概有幾個小時,他有點暈了,突然一抬頭看,是一個井號了。問題是這個時候他不知道哪個密碼是對的,這是一個真實的案例,是我朋友的一個案例。我舉這個例子的意思就是說,你不要太局限于你的思維,你的思維要發(fā)散,向前看。
這里講一個我提的比較多的,就是相似性的漏洞挖掘。相似性的漏洞挖掘有幾條,其中有一條就是相似的業(yè)務必然帶來相似的漏洞,這個大家可以去理解。還有一條也可以順帶說一下,同一個人開發(fā)的代碼肯定有同一個問題。所以他開發(fā)的這個程序有漏洞了,他開發(fā)的另外一個程序肯定有同樣的問題,放心,絕對有。所以你怎么去發(fā)現(xiàn)呢?大家知道我一直是漏洞之王,刷榜的,有一個技巧。我在2012年就報告了這么一個XSS給騰訊,當時他們很積極的修復了。當時因為漏洞足夠多,我們要去想這個方法測試。2014年有一天實在無聊,我寫這個程序有一個新的想法,我能不能實踐一下?我就去做了。我要做的是什么呢?首先看一下效果,就報了這么多Bug。這個是怎么來的呢?其實很簡單,我第一步就把qq.com的子域名全部爬一遍,暴力也好,越多的得到子域名就越OK。我把這些子域名變了一遍,這個里面涉及到異常判斷,可能涉及到開發(fā),比如你假如手工要貼到UI的話,這個就不能自動化,不能說是Fuzzing。我當時就想到一個解析的方法,這是一個命令行的版本,我能夠解析這個確實執(zhí)行了,相當于一個命令行的瀏覽器,判斷這個值就行了。這個代碼也很簡單,就是把所有的子域名變了一遍就行了。這是我其中刷的一個漏洞,其實還有好多漏洞可以刷。所以有時候你總結(jié)一下,把所有你在烏云上看到的那些漏洞,把這些變量都保存一下,這個處罰的保存一下,把所有的子域都爬一遍,說不定你能夠刷爆好幾個SRC。
這里面主要說一下秘籍,這個Fuzzing首先要有這個意思,不止是一個漏洞挖掘的工具方法,它是一種思想,可能應用于各種各樣的場景。你要看到這個漏洞原型的時候,或者你要想到這個東西。你看到這個漏洞的時候,你會想到是不是有相當多的問題我要跑一下?就是跑很重要。所以第二個秘籍,就是你要跑,Just do it。就是你有這個想法了,必須要去做。這一句話基本上是流傳很廣的,那個小伙問我怎么才能牛?我說你整就牛,你只要去做了,就會牛。下面還有一個真實的例子,我就可以告訴你為什么你只要做了,就真的有漏洞出來。
跨維思維,有的時候不要把你的思維太局限了,你要想的東西,這里主要是提了不要局限在你提取的那個漏洞模型里面,有可能這個漏洞模型里面還有其他的一些東西,我下面這個例子就可以說明這個問題。
首先看一下Bypass,這是烏云上有一個報了360的一個漏洞,當時他的漏洞其實很簡單,其實繞過了白名單。因為當時細節(jié)沒有出來,我當時看到這個點,我看到這個因為出在解析方法上面,取得的getHost跟原來的不一致,繞過了這個檢測。后來我就想辦法找到這個東西,其實這個細節(jié)已經(jīng)給出來了,他就是提交這么一個URL,他通過這個getHost的取得,是取得了360.cn。他通過瀏覽器去訪問這個URL的時候,其實他訪問的是烏云。所以這個漏洞模型就來了,我把這個反斜杠作為我的Fuzzing點,我去跑一下,看看還有沒有其他的出現(xiàn)。我當時設(shè)計了這么一個模型,其實這個異常捕獲很簡單,就是有沒有訪問到這個80服務器就行了。把完整的模型跑起來,沒有任何發(fā)現(xiàn),有可能就是局限了。
但是我們做深一層次的思考,不能夠局限于目前這個漏洞模型,這是一個典型的標準不一致帶來的安全問題,就是兩個方法,兩個東西在做判斷的時候,在做對比的時候,它的標準是不同的。最基本的標準不同,你根本判斷出來的結(jié)果是不靠譜的。這個例子里面其實是getHost取得的那個值,沒有考慮反斜杠的問題。我們反過來想一想,在其他的場合是不是也有這樣的東西呢?比如GS里面的域,當取得這個域值的時候,是不是也會出現(xiàn)同樣的問題?剩下來就是重新做了。其實這個做起來很簡單,這個當然是我最后從事的版本,前面我還做好幾款設(shè)置,寫一個APK,自動化的打開這個瀏覽器,那個時候是想多了,后來發(fā)現(xiàn)這是很簡單的一個方法。這里面只是一部分,還有一個部分,這個其實很簡單,就是用這個框架去調(diào)用訪問這么一些網(wǎng)址,自動訪問。然后我要捕獲異常是一樣的,我的同事寫的,他就寫了里面有一個判斷,不管你請求什么,我都會執(zhí)行這個命令,打印出當時的這個域。很簡單,只要你訪問成功了,這是第一步,我要看當前的域是不是這個結(jié)果,有沒有繞過。這個我跑下來的結(jié)果,第一個在Android平臺上面的QQ瀏覽器、微信,包括QQ,這些都存在UXSS,都跨域了。很簡單,其實原理就是因為有兩點,他在處理IP和域名組合的時候,一般默認的用這個點去分割了,到這兒直接分割了,他看到執(zhí)行的效果就是這樣,這個域其實是在QQ下面的。就相當于你可以控制qq.com一個不存在的子域,你可以通過跨子域的一些方法,實現(xiàn)你的攻擊目的。這里攻擊的方法不在今天議題的范疇之內(nèi),就不介紹了,這個是截圖qq。
另外發(fā)現(xiàn)了Firefox平臺下面的UXSS,很簡單,這個值就是兩個,一個是11,還有一個12,也是一樣的效果。但是這個問題,其實當時我發(fā)現(xiàn)這個問題大概在好幾個約制前就發(fā)現(xiàn)了,但是很可悲。我發(fā)現(xiàn)了就丟在那里沒管了,有一天我再去測試沒有了,怎么回事呢?我發(fā)現(xiàn)在論壇上面,我還找這個老外聊了一下,確實就是補的這個漏洞。我在這個例子里面就是說,第一個你要有跨域的想法,不要局限于現(xiàn)在這個漏洞模型,要發(fā)散思維,有沒有其他點。然后你一定要去跑,一定要去做。你只要去做了,就可以發(fā)現(xiàn)新的問題。
今天我就講到這兒,謝謝大家!
潘柱廷:大家有沒有問題問一下黑哥?
提問:你現(xiàn)在通過這些方法,在實際的應用于SQL方面挖掘的漏洞,還有在二進制方面會有一些什么樣的心得和體會?
周景平:其實很多關(guān)注我的人知道,黑哥以前是做Web安全的,突然之間來了一個微軟的一百強里面的名單,報了很多瀏覽器的漏洞,這個里面其實主要是我身邊大牛比較多,朋友比較多,他們對我進行了指導,確實給了我很大的幫助,包括百度的一些交流,讓我受益匪淺。
另外一個我的優(yōu)勢在哪里呢?因為我就12個VM。我的優(yōu)勢在哪里呢?我的想法可能比別人多一點。就是很多時候我看到人家的樣板,人家可能想到這個點測試就過了,我有可能就是在你的樣本基礎(chǔ)上,就類似于今天我提到這么一些方法。我發(fā)現(xiàn)有一些他們自己都沒有意識到的點,我可能就做到了。后來我回顧了自己的整個職業(yè)技術(shù)生涯,我喜歡回顧一下自己。后來發(fā)現(xiàn)我的很多研究其實都是站在別人的基礎(chǔ)上去完成的,這個可能是我的一個弱勢,或者說也是我的一個強勢。
潘柱廷:如果給你1200個VM,會不會和現(xiàn)在不一樣?
周景平:我不太喜歡有壓力。當有人給你投資源的時候,他是有要求的。當你沒有資源的時候,你就覺得很牛。你看我就這么點條件,我都能做得這么好,是不是給你很多條件你就會做得更好了?那不一定,真不一定,有可能更失望,所以我寧愿保持現(xiàn)在這種狀態(tài)。
潘柱廷:說到底還是計算密集型,黑哥更喜歡計算不密集型,他喜歡創(chuàng)意密集型。
周景平:我喜歡玩創(chuàng)意,比較猥瑣一點,人也長得比較猥瑣。