想成為資安研究員的心路歷程 - 從高中到大學的五年
前言⌗
我希望自己有一天可以把這些歷程公開,某程度上我是個喜歡到處叭叭自己經歷的人,不過總會有些想法埋在心裡(極端的或是負面的),比起到處講或許寫下來會是比較好的呈現與抒發方式。
我並沒有預想著這篇文章會帶給讀著什麼樣的體驗,存粹只是把自己的經歷與當時的一些心境呈現出來。而且有些實在太過久遠的記憶可能早已扭曲,也不見是完全正確的。
也許讀完這篇文章你會有些想法,我很歡迎你與我分享你的看法。
高中時期⌗
進入資安領域前的我⌗
感覺應該要交代一下自己的背景,我在國高中接觸資訊安全之前就算是個選手(?),我主要參與的競賽是機器人競賽(雖然說是機器人但都不是人型的),從樂高機器到超大台的金屬機器,我在隊伍上主要負責的是技術溝通與程式設計,所以我是有程式設計基礎的,如果要對當時自己的程式設計能力打個分數的話,我認為應該是「能用」,至少我可以讓機器順利地動起來。
我開始撰寫機器人程式是因為我不擅長設計機構,通常這類型競賽都是團隊行動,可以依靠擅長機構設計的隊友們,我只要負責把電路跟控制器弄好讓機器動起來就好,而且光是看著這些硬體聽命於我寫的程式動起來我就相當有成就感了,隊友也會為因為機器可以動起來而感到開心。
寫控制機器人的程式一段時間後,我自覺對寫程式這件事情挺有興趣的,也就開始走向純軟體的世界,開始寫一些小專題,像是新手友善的聊天機器人、爬蟲之類
2019:一切的開端 MyFirstCTF⌗
我從高中開始接觸資訊安全,接觸的契機是 2019 年的一場 AIS3 舉辦的 MyFirstCTF1,對我而言是真的人生第一場 CTF,順帶一題,當年的冠軍是 k1a,我後來才知道他打的時候早是久經沙場的 CTF 玩家了。我曾經為 MyFirstCTF 寫過心得文,但我現在找不到了。
這個新手友善的競賽非常適合用來認識與熟悉各種 CTF 類別,對我而言這場競賽就是我進入 Pwnable 跟 Reverse 領域的敲門磚。第一次接觸 buffer overflow、從認識逆向工具到看到組合語言,僅有一天的競賽卻對我的生涯產生了極大的改變。
至於為什麼是 Reverse 跟 Pwnable 呢?因為我在題目裡面找到了某種熟悉感,以前只在 CheatEngine 裡面看過,但也只是略懂(大概是那種知道 jne 改成 je 可以翻轉條件那種略懂)。
在此我要特別感謝一個網友,如果沒有他的話我也不會繼續打 CTF,更不會有現在的我。
故事是這樣的,在某個遊戲群裡我剛好提到我正在打人生第一場 CTF,而這位網友告訴了我
:「我從 CTF 退休了」
:「看了下我的紀錄」
:「我打過至少 90 場 CTF」
是個打過至少 90 場 CTF 的退役戰場老兵。一個不要臉的新手發現了一根救命稻草,想當然爾就是巴著問各種問題,而他完全不嫌棄的耐心給我引導跟指示。
很感謝當時他願意協助一個連問題是什麼都搞不清楚的白目新手,我從他身上學到改變了我一生的知識與心態。真希望我有一天可以找到他然後請他吃個飯。
(我很佩服他的耐心,如果現在的我是遇到當時的自己,一定啪啪兩巴掌)
:「打 CTF 的精神就是 就算你做不出來 你還是得把它做出來」
通過 CTF 來學習⌗
CTF 在短時間的競賽時間加上競賽壓力,對我而言是一個再好不過的學習方式。
我大量的基礎知識(像是作業系統、ISA、逆向工具…)是積極參加各種 CTF 競賽累積的。我會在賽中通過大量的資訊搜集想辦法找到類似的利用案例,光是在資訊收集上就會先考驗對題目的認知程度。
想找到最重要的那個知識點,會需要連通各種知識路徑來發掘那個關鍵。這過程像是窮舉所有已知知識然後想辦法延伸,對我而言是個很快的學習方式。
如果能成功找到並理解關鍵的知識點就有機會解開題目,而且這種及時反饋非常適合用來驗證理解程度。不過有一點也很重要,如果真的沒辦法在賽中找到突破點,也要記得閱讀官方或別人寫的 writeup 來補足缺少的知識點。
不過這種方式對完全沒基礎知識的人來說可能很痛苦,因為一開始就不知道該從何查起。如果要給新手們建議的話,我建議先查網路上有沒有針對那個類別的教材,先跟著教材做一次了解一些背景知識再開始打比賽。
關於 CTF <無/有>用論,我非常推薦閱讀 terrynini 寫的 「CTF轉生—不轉生就拿出真本事」
為了更多的參賽機會,我跟別的網友們一起創立了一個小小戰隊開始打很多網路上的 CTF,像 HITCON CTF、DragonCTF、BalsnCTF、神盾盃等競賽。
基本上每一個月都會在 CTFTime 上面找比賽來打。通過頻繁的參與線上的 CTF 我累積了相當多的背景知識,而且在賽中成功解出題目相當有成就感,這種正向回饋也造就了我會想繼續參與下一場競賽。
2020:從第一次大型決賽到進入台灣 CTF 社群 - HITCON x Balsn⌗
通常打 CTF 不久後就會發現許多 CTF 競賽都會有初賽與決賽,而且只有夠厲害的隊伍才有能力進到決賽,所以把「打進有名 CTF 的決賽」當成目標我覺得相當合理。
在我與隊友們頻繁征戰後,我們終於迎來了我們的第一個決賽機會「HITCON x Balsn 資安經典交流賽」,這次活動是只限定給台灣隊伍參加,但一樣是以 HITCON CTF 作為入圍門檻。
在競賽現場腎上腺素狂飆的快感與比賽刺激的張力真的挺爽的。不過第一次參賽我其實表現不太好,而且整隊都是第一次參加根本不會知道要做個 Attack Manager 這種基礎工具,雖然成功拿下整場競賽第一個首殺,但最後沒有辦法好好的維持優勢漸漸敗下陣來,我還記得當時的第一名是 10sec。
第一次參加這種規模的競賽,場地規格相當浮誇,一整片文創六樓超大場地、每個隊伍的 Pit 都有對應的設計、超大片的隊伍介紹牆、超大螢幕跟很酷炫的燈光、很酷的計分版跟競賽視覺化、一直嚇到我的超大聲喇叭。人生頭一次看到這種大場面是挺震撼的,心裡話:「我下次還想來」。
這場競賽是我生涯的一個非常重要的節點,這場「交流賽」確實地發揮它的作用打開了我的人脈網,我在這場比賽結識了很多人,像是 @seadog007、@lys0829 跟其他隊伍的強者們。而且這場競賽結束後,所有參賽隊伍拉了一個群組,創立了一個把所有人黏起來的新隊伍:XxTSJxX。這場競賽打開了我與資安社群的人脈,我終於與台灣的 CTF 圈搭上線了。
認識強者之後我意識到自己的不足,希望有一天可以像那些厲害的選手一樣,解題跟喝水一樣簡單。我想變得更強,但很多是需要經驗積累並不是一兩天就能改變,想成為強者的心態一直驅使著我學習與進步,到今天也還是一樣。總是可以意識到自己還有很多進步的空間,想把自己的能力發揮到極致。
2021:勇闖 AIS3 EOF⌗
跟台灣 CTF 圈子搭上線後,我認識了一些同年齡有在打 CTF 的選手們,其中最重要的兩人是 @nella17 跟 @learner_mumu。本來這圈子就不大,可以找到同年齡的人我是非常開心的,但真的是太過久遠了,實在想不起來到底在哪個場合與這兩位高手搭上線的,我記得有在國高中金盾賽場上有見過之類的。總之就湊一湊組了個隊伍一起去打 AIS3 EOF。
AIS3 EOF 是由 AIS3 舉辦的 CTF 競賽同時也是三校合開(台大、交大、?)<電腦安全/程式安全>課程的期末考。
(我不記得第三個學校是哪間了)
我覺得可以這樣形容 AIS3 EOF2 這個活動:「脫離新手村的最終大 Boss」。
如果可以在 EOF 取得不錯的成績,那就代表具有一定的解題能力,可以考慮挑戰其他更困難的 CTF 了。
(不過近年來的 EOF 形式不像以往只是單純的 Jeopardy,可能這句話不再適用)
*請自己行插入熱血的音樂*
總之經過高中生們的一番努力,努力敲敲打打從大學生們的手中搶走決賽資格,最後拿了個決賽第五名壓線領了個獎。能夠在一堆大學生手中偷走這個名次,對於當時的我們來說是非常有成就感與認同感的。
而我也通過這場競賽認識更多高手的存在,像是當年度的第一名 DoubleSigma 隊長張元,是個超級強的 Pwner。(我很遜只敢在背後偷偷關注高手)。
(然後我其實不確定那時候 DoubleSigma 到底被 Balsn 併進去了沒)
高中時期的 CTF 生涯也就在這場之後畫下了句號,因為之後就不再是高中生了。
從第一次接觸 CTF 到能夠參加 AIS3 EOF 決賽,對高中時的我來說是非常大的進步,我也在這時堅定了自己繼續打 CTF 的決心。
升學⌗
我應該算是非常規教育體制的產物(嗎?),總之我希望通過特殊選材上大學,因為學校裡有很多通過機器人競賽然後通過特殊選材進入許多大學的先例,我把這些學長姐們當成我的榜樣,走著類似的道路前進,過往的案例都是進機器系或是電機系。不過隨著我對軟體工程的認識加深,我逐漸的轉換目標到「特殊選材進入資工系」。
我與當時同年齡接觸資訊科技的同學們的經驗有蠻大差異(有跟其他特選上交大的同學們驗證過這件事)。
當時競賽程式跟高中科展就是資工特選的唯二解答,對一個高中生的程式設計能力評估指標主要聚焦在演算法競賽上。基本上當時能通過特殊選材進入資工系的學生,多少都在此類型的競賽上有所成就,例如「APCS」、「資訊學科能力競賽」、「資奧選訓」或是其他台灣的競程競賽。
不過我的運氣很好,當我特殊選材的時候,開始有學校注意到專案實作與其他類型的資訊競賽的重要性,像是成大開設了專門的實作組別,會通過上機實作專案並測試效能來評分。
我的第一個特選好消息是在成大特選的實作組取得了正取一的好成績。令我意外的是幾個禮拜後,我成功進入交大特殊選材的二階面試,更令所有人意外的是,交大給了一個沒沒無聞的人正取一(我猜應該是我的面試吹得還不錯)。
最後就是進入了交大的資訊工程學系,開始我的大學生活。
延伸閱讀:我有寫一篇關於特殊選材的過程與心得。
大學時期⌗
進入大隊伍後的心態變化⌗
既然被併入大隊伍後,就理所當然地跟著大隊伍一起打比賽了,但有個嚴重問題逐漸浮現:「我不夠強」。
當隊友可以跟喝水一樣的把題目解掉,我還在努力搞懂題目想問我什麼,老實說這種感覺很不好受,競賽不再只是好玩的學習機會,我該怎麼跟上隊友?我該怎麼幫上隊友?不過這問題一直都存在,只是進入大型戰隊之後變得更嚴重了。
為了不要讓隊友覺得我都在躺分耍廢,也希望可以被隊伍認可,能幫上大家的忙,我開始想辦法找尋自己在隊伍的定位。最後發現自己沒辦法成為六邊形戰士(像是 @maple3142),我開始尋找過往的榜樣,看看那些以稱霸一個類別為主的選手,像是 @L4ys、@terrynini 這些以逆向工程聞名的選手,看看他們的 blog 跟貼文,找尋一些靈感,開始專注磨練逆向工程技巧,怎麼樣可以看得更快更準確等。
既然挑了一個類別當成自己的專長,那應該有些可以當成指標的成果,看來看去發現 FLARE-On Challenge 看起來是個相當指標性的競賽,一個人、一堆逆向題、是個 CTF。看起來作為證明自己在好不過了,那就把這個當成一個目標拿來證明自己吧。
抱著這個心態,我在升大學前那年做了第一次的嘗試發現自己菜的一批只解了一半後面就沒耐心繼續看下去,這個目標也就暫時被我擱置不了了之。
開銀河戰艦轟炸台灣的資安競賽⌗
還是需要一些其他目標來想辦法提供自信心,剛好因為跟 @seadog007 還有 @lys0829 很熟,所以就一起組隊打很多台灣競賽,金盾獎、神盾杯、CGGC 之類的台灣資安賽事,不知道是不是三人組合靈能挺高的,所以在台灣的資安競賽取得了相當多好成績。
現在看起來台灣各大資安競賽好像我們三人都沒有分開是固定班底,不過海豹跟翔哥實在是太有名了,大多數人比較不會認識我,還挺怕被認為沒什麼實力在躺分 😣 而某些比賽允許更多人參加時,不時會有快樂夥伴加入行列,像是:@ice1187、@nella17、@toxicpie。
值得一提,這艘銀河戰艦成功在 2023 年參加多數台灣有規模的資安競賽(金盾獎、神盾盃、CODE、CGGC),而且全都以決賽第一名結束。
2022:第一次入圍 DEFCON 決賽 - Balsn.217@TSJ.tw⌗
DEFCON 是一個相當指標的 CTF 競賽,尤其在台灣 CTF 圈子,頂尖隊伍才有能力入圍這個競賽的決賽,而參賽機會也剛好落在我的頭上。Balsn 與 TSJ 為了征戰 DEFCON 合併到成一個大聯隊 Balsn.217@TSJ.tw,試圖衝擊賽場。
第一次組成如此大的隊伍(約 30 人),彼此不熟的大家還在磨合期且沒有還沒建立流暢的合作模式。而我也不知道該怎麼如何發揮自己的影響力,只好嘻嘻哈哈的想辦法找個小圈子加入想辦法找事做,就這樣經歷了有點打雜跟觀摩結束了初賽與決賽。不過這樣跟著一大群人一起打比賽的經驗相當稀有,但也意識到自己還有很多需要補足的點。
FLARE-On Challenge 9⌗
在經歷了更多競賽跟自己研究的磨練後,我終於在 2022(應該是大二)的時候破台了 FLARE-On Challenge。
我有寫 FLARE-On 9 的 Writeup
能成功全破 FLARE-On Challenge 算是給了自己一個定心丸,也算是對自己逆向技術的客觀肯定,對自己的自信心也有一定的加成。
2023:再次入圍決賽,發揮自己專長 - TWN48⌗
經過了一年的各種團隊建構活動,大家也彼此熟悉許多,知道該把誰放在什麼位置做什麼事情,然後開發與完善了屬於隊伍的關鍵設施。
這一次大家都準備好了,我的能力也準備好了,這一次必定會有些成果的。
而最後結果也告訴我們,我們打了一場漂亮的仗,拿到了決賽第三名。
延伸閱讀:我也有寫關於 DC31 的紀錄
想成為 (Wanna-be) 一個資安研究員⌗
競爭心態的掙扎⌗
現代網路相當便利,任何消息都會通過演算法推到自己的眼前。各種消息就會包括誰誰誰成功打下了什麼設備、某某某發現了什麼新型態漏洞。
我一直沒辦法很好的調適自己的競爭心態,也許是因為我的一生都作為一個選手存在?或是我就是個小心眼的人?
每當我發現身邊與我類似的人達成了什麼,第一個踢進我腦袋的想法並不是「他做得很棒,我應該要好好的祝賀他」,而是「為什麼我做不到?」。
我不喜歡這種想法,每次都會從嫉妒到對自己的怨恨,但就跟某種惡魔般直覺一樣,每當同樣的情境發生,這個惡魔就會跑出來亂洨。
我試著去了解這種心態背後的原因,所以嘗試去看心智相關的書、查查網路。題外話,有時候網路上查一查會得出一個很好笑的結論:「因為小時候沒有被父母關愛」。
整理一下我嘗試理解自己之後的一些發現,這種惡性心態可能源自這些原因:
- 想被別人認可、肯定
- 對自我的評價過度依賴外部基準(比賽贏幾場、有多少個 CVE)
- 害怕被淘汰、失去價值(找不到工作)
不過還有一種我不願承認的可能性:「單純我就是個雞掰人」
我覺得理解這種心態背後的主因,就有辦法安撫自己,因為知道自己到底想要什麼。顯然我不是想要攻擊人,就只是我也想要被肯定。
比起認為對方想跟我「拼輸贏」,應該把對方當成「參照」,不再是「他找到了漏洞所以贏過了我」,而是「他成功找到漏洞,我可以從中學到什麼」。
我覺得這樣是一個比較健康的心態,所以會對自己做一些「思想練習」來轉換自己的競爭心態。
心態轉換是需要時間跟精力的,有時候還是會不小心放出這個惡魔,但只要可以發現他跑出來,好好把它請回神燈裡面就好。
第一個實習⌗
我的第一個實習經驗並不是很順利,實習內容是漏洞挖掘(VR),我覺得主要原因是挑的研究目標太過困難了(不過也沒得選)。
我一開始就挑了一個魔王難度的目標,在接近瘋狂的撞牆下,我所有過往累積的自信心跟心態就在這樣在短時間內頻繁撞牆下消逝殆盡。 從一開始的「應該只是運氣不好」、「再堅持一下,總會有結果」一路滑坡到「我什麼都做不到」、「我這輩子就這樣了,我不適合做這個」。
我在 2024/11/08 的臉書上發了一篇文:
我高中的時候,看著各個資安前輩走過的道路就做了一個幼稚的假設:「我只要比賽打得夠好,我在真實世界的實戰成果就不會很糟」 不過這個想法在我奧義實習時動搖了,從相信變成了懷疑,快要變成否定了。
我沒辦法取得說服得了自己的成就,也許對團隊來說是很大的進展,但我覺得是一個沒辦法產生 impact 的東西。
感覺我的心態跟毅力都還不夠格做一個資安研究員,有沒有什麼好的心態建設的參考,還是前輩們從來沒有這種煩惱?😵
這篇文算是我對自己的第一次實習的總結吧:我什麼都沒做到。
這篇文引來很多人的留言,我每一個留言都有看過,很感謝當天留下那些溫暖留言的人們,感謝他們幫我加油打氣。
總結這些留言,其中我認為幾個比較重要的概念:
- 「找一個真心喜歡、就算不領薪水也可以做得很開心的目標,而產出只是單純的時間問題。」
- 「重點在想要達到什麼目標跟怎麼去達成,目標越大,時間軸就要拉得更長,耐性是變強的不二法門。」
我在這次的墜落後,非常可以理解「循序漸進」的重要性。如果有想要嘗試做 VR 的話,建議先從一些簡單的小目標開始培養心態。
新的嘗試⌗
一年後,我就離開前公司,到 DEVCORE 參加了實習生計劃,成為了研究組的實習生。 跟我同期的有 @nella17 跟 @YingMuo。
參加 DEVCORE 實習生計劃之後,在我參加 DEVCORE 實習計劃後,我覺得漸漸找回以前那種自信與成就感。 這個實習計劃是一學期一期,整理運作方式大概是,每期初與 Mentor 們討論出可以在一期實習內做完的目標、每週與 Mentor 開進度討論會。 Mentor 會檢視研究時大方向的決策,做出決策的理由跟結果,然後一起討論出怎麼做比較好。
我覺得是一種互相成長(是我與實習生之間或我與 Mentor 之間),很多未知的目標 Mentor 們不一定會見過,在這種情況下更能審視與改進自己面對未知領域的學習方式。很多時候也可以從 Mentor 問問題的角度知道什麼資訊是高價值的,更應該要先挖掘。
學習過程就是不斷的試錯然後減少犯錯,在這種密集的訓練下,對漏洞挖掘能力提升非常的大。
現在⌗
至今在 DEVCORE 實習加總起來應該也有一年了,我有些有趣的發現,有機會我可能會寫一篇文章講述這些發現。
總之這一年從自我懷疑到現在的重拾初心,我覺得非常不容易,我非常地幸運能夠有機會與這些高手一同學習,實在有太多需要感謝的了。
我想這五年來,我從什麼都不會到現在可以挖掘真實世界產品的漏洞,過程中實在受過太多人的幫助了。
感謝我這五年來幫助過我的人們、感謝那些在我低潮時刻向我伸出援手的人們。
我現在還不是一個獨當一面的資安研究員,還有很多需要學習的地方,雖然不知道需要多久才可以達成,不過我相信自己正在逐漸完成這個目標。
後記⌗
這篇文章是我在歐洲出差的時候突然想寫的,與 @YingMuo 聊到類似的事情時,有一個觀點挺有趣的。
「我覺得我運氣很好,剛好遇到的目標剛好比自己實力稍微難一點點,所以我可以知道自己當前的極限在哪。」
聽完這句話,我回想了自己的經歷,好像到現在還是不知道自己當前的極限在哪,有點像是一個壞掉的天平,其中一邊已經被一個過為龐大的目標塞住了。
也許要破除這個心魔就是有一天我回頭去把第一次實習沒打下來的目標打下來,但我認為現在能力還不足以對付它,但總有一天我會做到的。