Linux 二进制分析
內(nèi)容簡介
二進(jìn)制分析屬于信息安全業(yè)界逆向工程中的一種技術(shù),通過利用可執(zhí)行的機器代碼(二進(jìn)制)來分析應(yīng)用程序的控制結(jié)構(gòu)和運行方式,有助于信息安全從業(yè)人員更好地分析各種漏洞、病毒以及惡意軟件,從而找到相應(yīng)的解決方案。本書將帶領(lǐng)讀者探索連一些專家都未曾接觸的領(lǐng)域,正式進(jìn)入計算機黑客世界。
本書是一本剖析 Linux ELF 工作機制的圖書,共分為9章,其內(nèi)容涵蓋了 Linux 環(huán)境和相關(guān)工具、ELF 二進(jìn)制格式、Linux 進(jìn)程追蹤、ELF 病毒技術(shù)、Linux 二進(jìn)制保護(hù)、Linux 中的 ELF 二進(jìn)制取證分析、進(jìn)程內(nèi)存取證分析、擴(kuò)展核心文件快照技術(shù)、Linux/proc/kcore 分析等。
如果你是一名軟件工程師或者逆向工程師,想要學(xué)習(xí) Linux 二進(jìn)制分析相關(guān)的內(nèi)容,本書實為明智之選。本書提供了在安全、取證和殺毒領(lǐng)域中實施二進(jìn)制分析的解決方案。本書也適合安全愛好者和系統(tǒng)工程師閱讀。為了更好地理解本書內(nèi)容,讀者需要具備一定的 C 語言編程基礎(chǔ)和 Linux 命令行知識
作者簡介
Ryan O'Neill(ELF 大師)是一名計算機安全研究員兼軟件工程師,具有逆向工程、軟件開發(fā)、安全防御和取證分析技術(shù)方面的背景。他是在計算機黑客亞文化的世界中成長起來的——那個由 EFnet、BBS 系統(tǒng)以及系統(tǒng)可執(zhí)行棧上的遠(yuǎn)程緩沖區(qū)溢出組成的世界。他在年輕時接觸了系統(tǒng)安全、開發(fā)和病毒編寫等領(lǐng)域。他對計算機黑客的極大熱情如今已經(jīng)演變成了對軟件開發(fā)和專業(yè)安全研究的熱愛。Ryan 在 DEFCON 和 RuxCon 等很多計算機安全會議上發(fā)表過演講,還舉辦了一個為期兩天的 ELF 二進(jìn)制黑客研討會。
他的職業(yè)生涯非常成功,曾任職于 Pikewerks、Leviathan 安全集團(tuán)這樣的大公司,近在 Backtrace 擔(dān)任軟件工程師。
Ryan 還未出版過其他圖書,不過他在 Phrack 和 VXHeaven 這樣的在線期刊上發(fā)表的論文讓他聲名遠(yuǎn)揚。還有許多其他的作品可以從他的網(wǎng)站上找到。
本書內(nèi)容
譯者序
譯者棣琦(本名張萌萌),曾夢想成為一名高級口譯,卻陰差陽錯成了一個愛寫代碼的程序員。在 IT 江湖升級打怪的過程中,為了不斷提高自己的技能,看書是少不了的;而要想成為高級玩家,看英文書自然也是必須。一個很偶然的機會,我接觸到了本書的英文版。第一遍翻看時略顯吃力,畢竟書中講述的許多概念都是作者的原創(chuàng),網(wǎng)上幾無相關(guān)資料。但是這些稀缺的內(nèi)容對于深入理解二進(jìn)制分析卻非常重要,譯者由此嘗到了知識的甜頭。本著“獨樂樂不如眾樂樂”和“知識分享”的目的,本書的翻譯之路就這樣順理成章地開始了。
要想成為一名真正的黑客,不僅要會編寫程序,還需要解析程序,對已有的二進(jìn)制文件進(jìn)行反編譯,洞悉程序的工作原理。而本書完全是作者多年來在逆向工程領(lǐng)域的實戰(zhàn)經(jīng)驗總結(jié),其內(nèi)容從 Linux 二進(jìn)制格式的簡單介紹到二進(jìn)制逆向的細(xì)節(jié),不一而足。書中還穿插了作者自己維護(hù)的許多項目或軟件代碼示例。相信通過本書的學(xué)習(xí),讀者完全可以掌握 Linux 二進(jìn)制分析相關(guān)的一套完整的知識體系,為成長為一名高水平的黑客打下堅實的基礎(chǔ)。考慮到本書并非針對零基礎(chǔ)的讀者編寫,因此建議讀者能夠有一定的 C 語言和 Linux 基礎(chǔ),以便更好地理解領(lǐng)會書中精華。另外,任何 IT 技術(shù)的學(xué)習(xí)掌握,都離不開動手操作。讀者要想叩開 Linux 二進(jìn)制世界的大門,需要親自動手實踐書中示例,才能將書本知識轉(zhuǎn)換為自身技能。
最后,不能免俗的是各種致謝(雖然俗,但誠意百分百)。感謝我的父母對我闖蕩江湖的支持,感謝 Linux 中國創(chuàng)始人王興宇的信賴,感謝語音識別領(lǐng)域的技術(shù)大牛姚光超提出的寶貴建議,感謝我的朋友 Ray 對我的鼓勵。當(dāng)然,更要感謝各位讀者的支持。
最后的最后,由于譯者水平有限,外加本書作者在表達(dá)上多有晦澀之處,因此譯文難免有紕漏,還望廣大讀者以及業(yè)內(nèi)同行批評指正。
2017年9月
北京
關(guān)于作者
Ryan O'Neill 是一名計算機安全研究員兼軟件工程師,具有逆向工程、軟件開發(fā)、安全防御和取證分析技術(shù)方面的背景。他是在計算機黑客亞文化的世界中成長起來的——那個由 EFnet、BBS 系統(tǒng)以及系統(tǒng)可執(zhí)行棧上的遠(yuǎn)程緩沖區(qū)溢出組成的世界。他在年輕時就接觸了系統(tǒng)安全、開發(fā)和病毒編寫等領(lǐng)域。他對計算機黑客的極大熱情如今已經(jīng)演變成了對軟件開發(fā)和專業(yè)安全研究的熱愛。Ryan 在 DEFCON 和 RuxCon 等很多計算機安全會議上發(fā)表過演講,還舉辦了一個為期兩天的 ELF 二進(jìn)制黑客研討會。
他的職業(yè)生涯非常成功,曾就職于 Pikewerks、Leviathan 安全集團(tuán)這樣的大公司,最近在 Backtrace 擔(dān)任軟件工程師。
Ryan 還未出版過其他圖書,不過他在 Phrack 和 VXHeaven 這樣的在線期刊上發(fā)表的論文讓他聲名遠(yuǎn)揚。還有許多其他的作品可以從他的網(wǎng)站(http://www.bitlackeys.org)上找到。
致謝
首先,要向我的母親 Michelle 致以真誠的感謝,我已經(jīng)將對她的感謝表達(dá)在這本書里了。這一切都是從母親為我買的第一臺計算機開始的,隨后是大量的圖書,從 UNIX 編程,到內(nèi)核內(nèi)部原理,再到網(wǎng)絡(luò)安全。在我生命中的某一刻,我以為會永遠(yuǎn)放棄計算機,但是大約過了5年之后,當(dāng)我想要重新點燃激情時,卻發(fā)現(xiàn)已經(jīng)把書扔掉了。隨后我發(fā)現(xiàn)母親偷偷地把那些書幫我保存了起來,一直到我重新需要的那一天。感謝我的母親,你是最美的,我愛你。
還要感謝我生命中最重要的一個女人,她是我的另一半,是我的孩子的母親。毫無疑問,如果沒有她,就不會有我今天生活和事業(yè)上的成就。人們常說,每一個成功男人的背后都有一個偉大的女人。這句古老的格言道出的的確是真理。感謝 Marilyn 給我?guī)砹藰O大的喜悅,并進(jìn)入了我的生活。我愛你。
我的父親 Brian O'Neill 在我生活中給了我巨大的鼓舞,教會了我為人夫、為人父和為人友的許多東西。我愛我的父親,我會一直珍惜我們之間哲學(xué)和精神層面的交流。
感謝 Michael 和 Jade,感謝你們?nèi)绱霜毺睾兔篮玫撵`魂。我愛你們。
最后,要感謝我的3個孩子:Mick、Jayden 和 Jolene。也許有一天你們會讀到這本書,知道你們的父親對計算機略知一二。我會永遠(yuǎn)把你們放在生活的首位。你們3個是令我驚奇的存在,為我的生活帶來了更深刻的意義和愛。
Silvio Cesare 在計算機安全領(lǐng)域是一個傳奇的名字,因為他在許多領(lǐng)域都有高度創(chuàng)新和突破性的研究,從 ELF 病毒,到內(nèi)核漏洞分析方面的突破。非常感謝 Silvio 的指導(dǎo)和友誼。我從你那里學(xué)到的東西要遠(yuǎn)遠(yuǎn)多于從我們行業(yè)其他人處所學(xué)的東西。
Baron Oldenburg 也對本書起了很大的推動作用。好多次由于時間和精力的原因我?guī)缀跻艞壛?#xff0c;幸好 Baron 幫我進(jìn)行了初始的編輯和排版工作。這為本書的編寫減輕了很大的負(fù)擔(dān),并最終促使本書問世。謝謝 Baron!你是我真正的朋友。
Lorne Schell 是一位真正的文藝復(fù)興式的人物——軟件工程師、音樂家、藝術(shù)家。本書的封面就是出自他的聰慧之手。Vitruvian(維特魯威風(fēng)格的)Elf 與本書的描述藝術(shù)性的重合是多么令人驚喜!非常感謝你的才華,以及為此付出的時間和精力。
Chad Thunberg 是我在 Leviathan 安全集團(tuán)工作時的老板,他為我編寫本書提供了所需要的資源和支持。非常感謝!
感謝 Efnet 網(wǎng)站所有在#bitlackeys上的朋友的友誼和支持!
關(guān)于審稿人
Lubomir Rintel 是一名系統(tǒng)程序員,生活在捷克的布爾諾市。他是一位全職的軟件開發(fā)人員,目前致力于 Linux 網(wǎng)絡(luò)工具的開發(fā)。除此之外,他還對許多項目做出過貢獻(xiàn),包括 Linux 內(nèi)核和 Fedora 發(fā)行版。活躍在開源軟件社區(qū)多年之后,他懂得一本好書涵蓋的主題要比參考手冊更加廣泛。他相信本書就是這樣,希望你也能夠像他一樣喜歡這本書。另外,他還喜歡食蟻獸。
截至2015年11月,Kumar Sumeet 在 IT 安全方面已經(jīng)有4年多的研究經(jīng)驗了,在此期間,他開創(chuàng)了黑客和間諜工具的前沿。他擁有倫敦大學(xué)皇家霍洛威分校的信息安全碩士學(xué)位,最近的重點研究領(lǐng)域是檢測網(wǎng)絡(luò)異常和抵御威脅的機器學(xué)習(xí)技術(shù)。
Sumeet 目前是 Riversafe 公司的一名安全顧問。Riversafe 是倫敦的一家網(wǎng)絡(luò)安全和 IT 數(shù)據(jù)管理咨詢公司,專注于一些尖端的安全技術(shù)。該公司也是2015年在 EMEA 地區(qū)的 Splunk Professional Services 的合作伙伴。他們已經(jīng)完成了涉及許多領(lǐng)域(包括電信、銀行和金融市場、能源和航空局)的大型項目。
Sumeet 也是 Penetration Testing Using Raspberry Pi(Packt Publishing 出版)一書的技術(shù)審稿人。
有關(guān)他的項目和研究的更多詳細(xì)信息,可以訪問他的網(wǎng)站https://krsumeet.com,或者掃描右側(cè)的二維碼。
你也可以通過電子郵件contact@krsumeet.com聯(lián)系他。
Heron Yang 一直致力于創(chuàng)造人們真正想要的東西。他在高中時就建立了這樣堅定的信仰。隨后他在臺灣交通大學(xué)和卡內(nèi)基梅隆大學(xué)專注于計算機科學(xué)的研究。在過去幾年,他專注于在人和滿足用戶需求之間建立聯(lián)系,致力于開發(fā)初創(chuàng)企業(yè)創(chuàng)意原型、新應(yīng)用或者網(wǎng)站、學(xué)習(xí)筆記、出書、寫博客等。
感謝 Packt 給我這個機會參與本書的創(chuàng)作過程,并感謝 Judie Jose 在本書的創(chuàng)作過程中給我的很多幫助。此外,感謝我經(jīng)歷過的所有挑戰(zhàn),這讓我成為一個更好的人。本書深入二進(jìn)制逆向的諸多細(xì)節(jié),對于那些關(guān)心底層機制的人來說會是很好的資料。大家可通過heron.yang.tw@gmail.com或者h(yuǎn)ttp://heron.me跟我打招呼或討論圖書內(nèi)容。
前言
軟件工程是創(chuàng)建能夠在微處理器上存在、運行和發(fā)揮作用的造物行為。我們稱這種造物為程序。逆向工程是發(fā)現(xiàn)程序如何運行和發(fā)揮作用的行為,進(jìn)一步講,就是使用反編譯器和逆向工具進(jìn)行組合,并依靠我們的專業(yè)技能來控制要進(jìn)行反編譯的目標(biāo)程序,來理解、解析或者修改程序的行為。我們需要理解二進(jìn)制格式、內(nèi)存布局和給定處理器的指令集的復(fù)雜性,才能控制微處理器上某個程序的生命周期。逆向工程師是掌握了二進(jìn)制領(lǐng)域相關(guān)知識的技術(shù)人員。本書將教會你成為一名 Linux 二進(jìn)制黑客所需要的合理的課程、洞察力和相關(guān)任務(wù)。當(dāng)一個人自稱逆向工程師的時候,他自己其實已經(jīng)超出了工程師的水平。一個真正的黑客不僅可以編寫代碼,還可以解析代碼,反編譯二進(jìn)制文件和內(nèi)存段,他追求的是修改軟件程序的內(nèi)部工作原理。這就是反編譯工程師的動力。
從專業(yè)或者興趣愛好的角度來看,我都會在計算機安全領(lǐng)域(無論是漏洞分析、惡意軟件分析、防病毒軟件、rootkit 檢測,還是病毒設(shè)計)使用自己在逆向工程方面的技能。本書的大部分內(nèi)容專注于計算機安全方面。我們會分析內(nèi)存轉(zhuǎn)儲、進(jìn)程鏡像重建,并對二進(jìn)制分析更深奧的領(lǐng)域進(jìn)行探索,包括 Linux 病毒感染和二進(jìn)制取證分析。我們將會解析被惡意軟件感染的二進(jìn)制文件,還會感染運行中的進(jìn)程。本書旨在解釋 Linux 逆向工程所必需的組件,因此我們會深入學(xué)習(xí) ELF(可執(zhí)行文件和鏈接格式)。ELF 是 Linux 中可執(zhí)行文件、共享庫、核心轉(zhuǎn)儲文件和目標(biāo)文件的二進(jìn)制格式。本書最重要的一個方面是針對 ELF 二進(jìn)制格式的結(jié)構(gòu)復(fù)雜性給出了深入的分析。ELF 節(jié)、段、動態(tài)鏈接等這些概念都是非常重要的,也是逆向工程方面相關(guān)知識的比較有意思的分支。我們將會深入探索 ELF 二進(jìn)制攻擊,并了解如何將這些技能應(yīng)用到更廣泛的工作中。
本書的目標(biāo)是讓讀者成為對 Linux 二進(jìn)制攻防有扎實基礎(chǔ)的少數(shù)人之一,這將會為打開創(chuàng)新性研究的大門提供一個非常廣泛的主題,并將讀者帶領(lǐng)到 Linux 操作系統(tǒng)高級黑客技術(shù)的前沿。你將掌握 Linux 二進(jìn)制修補、病毒工程化/分析、內(nèi)核取證分析和 ELF 二進(jìn)制格式這一套寶貴的知識體系。讀者也會對程序執(zhí)行和動態(tài)鏈接有更深入的了解,對二進(jìn)制保護(hù)和調(diào)試的內(nèi)部原理有更深入的理解。
我是一名計算機安全研究員、軟件工程師,也是一名黑客。本書只是有組織地對我所做過的研究進(jìn)行了文檔性描述,也是對已經(jīng)做出研究結(jié)果的一些基礎(chǔ)知識的描述。
本書所涵蓋的很多知識都無法在互聯(lián)網(wǎng)上找到。本書試圖將一些相關(guān)聯(lián)的主題集中在一起,以便作為 Linux 二進(jìn)制和內(nèi)存攻擊這一主題的入門手冊和參考。雖然不是非常完善,不過也涵蓋了入門需要的很多核心信息。
本書涵蓋的內(nèi)容
第1章,Linux 環(huán)境和相關(guān)工具,簡要介紹了 Linux 環(huán)境和相關(guān)的工具,在整本書中都會用到。
第2章,ELF 二進(jìn)制格式,幫助讀者了解 ELF 二進(jìn)制格式每個主要的組件,在 Linux 和大多數(shù)類 UNIX 系統(tǒng)上都會用到。
第3章,Linux 進(jìn)程追蹤,教會讀者使用 ptrace 系統(tǒng)調(diào)用讀寫進(jìn)程內(nèi)存并注入代碼。
第4章,ELF 病毒技術(shù)——Linux/UNIX 病毒,將會介紹 Linux 病毒的過去、現(xiàn)在和將來,以及病毒的工程化和圍繞病毒進(jìn)行的相關(guān)研究。
第5章,Linux 二進(jìn)制保護(hù),解釋 ELF 二進(jìn)制保護(hù)的基本原理。
第6章,Linux 下的 ELF 二進(jìn)制取證分析,通過解析 ELF 目標(biāo)文件來研究病毒、后門和可疑的代碼注入。
第7章,進(jìn)程內(nèi)存取證分析,將會介紹如何解析進(jìn)程的地址空間,以研究內(nèi)存中的惡意軟件、后門和可疑的代碼注入。
第8章,ECFS——擴(kuò)展核心文件快照技術(shù),是對 ECFS 這一用于深入進(jìn)程內(nèi)存取證分析的新開源產(chǎn)品的介紹。
第9章,Linux/proc/kcore 分析,介紹了如何使用/proc/kcore 進(jìn)行內(nèi)存分析來檢測 Linux 內(nèi)核中的惡意軟件。
閱讀本書的先決條件
閱讀本書的先決條件如下:假定讀者具有 Linux 命令行相關(guān)的操作知識,對 C 語言編程技巧有一定的理解,對 x86 匯編語言知識有基本的掌握(不是必需,但會有很大的幫助)。有句話說得好:“如果你可以讀懂匯編語言,那么一切都是開源的”。
本書讀者對象
如果你是一名軟件工程師或者逆向工程師,想學(xué)習(xí) Linux 二進(jìn)制分析相關(guān)的更多知識,本書將會為你提供在安全、取證分析和防病毒領(lǐng)域進(jìn)行二進(jìn)制分析所需要用到的一切知識。假如你是一位安全技術(shù)領(lǐng)域的愛好者或者是一名系統(tǒng)工程師,并且有 C 語言編程和 Linux 命令行相關(guān)的經(jīng)驗,這本書將非常適合你。
第1章 Linux 環(huán)境和相關(guān)工具
- 1.1 Linux 工具- 1.1.1 GDB
- 1.1.2 GNU binutils 中的 objdump
- 1.1.3 GNU binutils 中的 objcopy
- 1.1.4 strace
- 1.1.5 ltrace
- 1.1.6 基本的 ltrace 命令
- 1.1.7 ftrace
- 1.1.8 readelf
- 1.1.9 ERESI——ELF 反編譯系統(tǒng)接口
 
- 1.2 有用的設(shè)備和文件- 1.2.1 /proc//maps
- 1.2.2 /proc/kcore
- 1.2.3 /boot/System.map
- 1.2.4 /proc/kallsyms
- 1.2.5 /proc/iomem
- 1.2.6 ECFS
 
- 1.3 鏈接器相關(guān)環(huán)境指針- 1.3.1 LD_PRELOAD 環(huán)境變量
- 1.3.2 LD_SHOW_AUXV 環(huán)境變量
- 1.3.3 鏈接器腳本
 
- 1.4 總結(jié)
 
- 1.1 Linux 工具
 
本章將集中介紹 Linux 環(huán)境,因為這將貫穿整本書的始終。本書的重點是對 Linux 二進(jìn)制進(jìn)行分析,那么利用好 Linux 自帶的一些通用的本地環(huán)境工具將會對 Linux 二進(jìn)制分析非常有幫助。Linux 自帶了應(yīng)用普遍的 binutils 工具,該工具也可以在網(wǎng)站http://www.gnu.org/software/binutils/中找到,里面包含了一些用于二進(jìn)制分析和破解的工具。本書不會介紹二進(jìn)制逆向工程的通用軟件 IDA Pro,但還是鼓勵讀者使用它。不過,在本書中不會使用 IDA。然而,通過本書的學(xué)習(xí),你可以利用現(xiàn)有的環(huán)境對任何 Linux 系統(tǒng)進(jìn)行二進(jìn)制破解。由此,便可以欣賞到作為一個真正的黑客可以利用許多免費工具的 Linux 環(huán)境之美。在本書中,我們將會展示各種工具的使用,隨著每個章節(jié)的推進(jìn),也會不斷回顧這些工具的使用方法。現(xiàn)在我們將本章作為參考章節(jié),介紹 Linux 環(huán)境下的相關(guān)工具和技巧。如果你已經(jīng)非常熟悉 Linux 環(huán)境以及反編譯、調(diào)試、轉(zhuǎn)換 ELF 文件的工具,可以跳過本章。
1.1 Linux 工具
在本書中將用到許多公開發(fā)布的免費工具。本節(jié)內(nèi)容將會對其中某些工具進(jìn)行概要闡述。
1.1.1 GDB
GNU 調(diào)試器(GDB)不僅可以用來調(diào)試有 bug 的應(yīng)用程序,也可以用來研究甚至改變一個程序的控制流,還可以用來修改代碼、寄存器和數(shù)據(jù)結(jié)構(gòu)。對于一個致力于尋找軟件漏洞或者破解一個內(nèi)部非常復(fù)雜的病毒的黑客來講,這些都是非常常見的工作。GDB 主要用于分析 ELF 二進(jìn)制文件和 Linux 進(jìn)程,是 Linux 黑客的必備工具,在本書中我們也會在各種不同的例子中使用到 GDB。
1.1.2 GNU binutils 中的 objdump
object dump(objdump)是一種對代碼進(jìn)行快速反編譯的簡潔方案,在反編譯簡單的、未被篡改的二進(jìn)制文件時非常有用,但是要進(jìn)行任何真正有挑戰(zhàn)性的反編譯任務(wù),特別是針對惡意軟件時,objdump 就顯示出了它的局限性。其最主要的一個缺陷就是需要依賴 ELF 節(jié)頭,并且不會進(jìn)行控制流分析,這極大地降低了 objdump 的健壯性。如果要反編譯的文件沒有節(jié)頭,那么使用 objdump 的后果就是無法正確地反編譯二進(jìn)制文件中的代碼,甚至都不能打開二進(jìn)制文件。不過,對于一些比較平常的任務(wù),如反編譯未被加固、精簡(stripped)或者以任何方式混淆的普通二進(jìn)制文件,objdump 已經(jīng)足夠了。objdump 可以讀取所有常用的 ELF 類型的文件。下面是關(guān)于 objdump 使用方法的一些常見例子。
- 查看 ELF 文件中所有節(jié)的數(shù)據(jù)或代碼:
- 只查看 ELF 文件中的程序代碼:
- 查看所有符號:
在第2章介紹ELF二進(jìn)制格式時,我們將更加深入地介紹objdump和其他相關(guān)工具。
1.1.3 GNU binutils 中的 objcopy
object copy(objcopy)是一款非常強大的小工具,很難用一句話對其進(jìn)行概述。推薦讀者參考o(jì)bjcopy的使用手冊,里面描述得非常詳細(xì)。雖然objcopy的某些特征只針對特定的ELF目標(biāo)文件,但是,它還可以用來分析和修改任意類型的ELF目標(biāo)文件,還可以修改ELF節(jié),或?qū)LF節(jié)復(fù)制到ELF二進(jìn)制中(或從ELF二進(jìn)制中復(fù)制ELF節(jié))。
要將.data節(jié)從一個ELF目標(biāo)文件復(fù)制到另一個文件中,可以使用下面的命令:
objcopy –only-section=.data <infile> <outfile>objcopy工具會在本書的后續(xù)內(nèi)容中用到。現(xiàn)在只要記住有這樣一個工具,并且知道這是對 Linux 二進(jìn)制黑客來說非常有用的一個工具就可以了。
1.1.4 strace
system call trace(strace,系統(tǒng)調(diào)用追蹤)是基于ptrace(2)系統(tǒng)調(diào)用的一款工具,strace通過在一個循環(huán)中使用PTRACE_SYSCALL請求來顯示運行中程序的系統(tǒng)調(diào)用(也稱為 syscalls)活動相關(guān)的信息以及程序執(zhí)行中捕捉到的信號量。strace在調(diào)試過程中非常有用,也可以用來收集運行時系統(tǒng)調(diào)用相關(guān)的信息。
使用strace命令來跟蹤一個基本的程序:
strace /bin/ls –o ls.out使用strace命令附加到一個現(xiàn)存的進(jìn)程上:
strace –p <pid> -o daemon.out原始輸出將會顯示每個系統(tǒng)調(diào)用的文件描述編號,系統(tǒng)調(diào)用會將文件描述符作為參數(shù),如下所示:
SYS_read(3, buf, sizeof(buf));如果想查看讀入到文件描述符3中的所有數(shù)據(jù),可以運行下面的命令:
strace –e read=3 /bin/ls也可以使用–e write=fd命令查看寫入的數(shù)據(jù)。strace是一個非常有用的小工具,會在很多地方用到。
1.1.5 ltrace
library trace(ltrace,庫追蹤)是另外一個簡潔的小工具,與strace非常類似。ltrace 會解析共享庫,即一個程序的鏈接信息,并打印出用到的庫函數(shù)。
1.1.6 基本的 ltrace 命令
除了可以查看庫函數(shù)調(diào)用之外,還可以使用-S標(biāo)記查看系統(tǒng)調(diào)用。ltrace命令通過解析可執(zhí)行文件的動態(tài)段,并打印出共享庫和靜態(tài)庫的實際符號和函數(shù),來提供更細(xì)粒度的信息:
ltrace <program> -o program.out1.1.7 ftrace
function trace(ftrace,函數(shù)追蹤)是我自己設(shè)計的一個工具。ftrace 的功能與ltrace類似,但還可以顯示出二進(jìn)制文件本身的函數(shù)調(diào)用。我沒有找到現(xiàn)成的實現(xiàn)這個功能的 Linux 工具,于是就決定自己編碼實現(xiàn)。這個工具可以在網(wǎng)站https://github.com/elfmaster/ftrace找到。下一章會對這個工具的使用進(jìn)行介紹。
1.1.8 readelf
readelf命令是一個非常有用的解析ELF二進(jìn)制文件的工具。在進(jìn)行反編譯之前,需要收集目標(biāo)文件相關(guān)的信息,該命令能夠提供收集信息所需要的特定于ELF的所有數(shù)據(jù)。在本書中,我們將會使用readelf命令收集符號、段、節(jié)、重定向入口、數(shù)據(jù)動態(tài)鏈接等相關(guān)信息。readelf命令是分析ELF二進(jìn)制文件的利器。第2章將對該命令進(jìn)行更深入的介紹,下面是幾個常用的標(biāo)記。
- 查詢節(jié)頭表:
- 查詢程序頭表:
- 查詢符號表:
- 查詢 ELF 文件頭數(shù)據(jù):
- 查詢重定位入口:
- 查詢動態(tài)段:
1.1.9 ERESI——ELF 反編譯系統(tǒng)接口
ERESI 工程(http://www.eresi-project.org)中包含著許多 Linux 二進(jìn)制黑客夢寐以求的工具。令人遺憾的是,其中有些工具沒有持續(xù)更新,有的與64位 Linux 不適配。ERESI 工程支持許多的體系結(jié)構(gòu),無疑是迄今為止最具創(chuàng)新性的破解 ELF 二進(jìn)制文件的工具集合。由于我個人不太熟悉 ERESI 工程中工具的用法,并且其中有些不再更新,因此在本書中就不再對該工程進(jìn)行更深入的探討了。不過,有兩篇 Phrack 的文章能夠說明 ERESI 工具的創(chuàng)新和強大的特性:
- Cerberus ELF interface(http://www.phrack.org/archives/issues/61/8.txt)
- Embedded ELF debugging(http://www.phrack.org/archives/issues/63/9.txt)
1.2 有用的設(shè)備和文件
Linux 有許多文件、設(shè)備,還有/proc入口,它們對狂熱的黑客還有反編譯工程師來說都非常有用。在本書中,我們將會展示其中許多有用的文件。下面介紹本書中常用的一些文件。
1.2.1 /proc/<pid>/maps
/proc/<pid>/map文件保存了一個進(jìn)程鏡像的布局,通過展現(xiàn)每個內(nèi)存映射來實現(xiàn),展現(xiàn)的內(nèi)容包括可執(zhí)行文件、共享庫、棧、堆和 VDSO 等。這個文件對于快速解析一個進(jìn)程的地址空間分布是至關(guān)重要的。在本書中會多次用到該文件。
1.2.2 /proc/kcore
/proc/kcore是proc文件系統(tǒng)的一項,是 Linux 內(nèi)核的動態(tài)核心文件。也就是說,它是以 ELF 核心文件的形式所展現(xiàn)出來的原生內(nèi)存轉(zhuǎn)儲,GDB 可以使用/proc/kcore來對內(nèi)核進(jìn)行調(diào)試和分析。第9章會更深入地介紹/proc/kcore。
1.2.3 /boot/System.map
這個文件在幾乎所有的 Linux 發(fā)行版中都有,對內(nèi)核黑客來說是非常有用的一個文件,包含了整個內(nèi)核的所有符號。
1.2.4 /proc/kallsyms
kallsyms與System.map類似,區(qū)別就是 kallsyms 是內(nèi)核所屬的/proc的一個入口并且可以動態(tài)更新。如果安裝了新的 LKM(Linux Kernel Module),符號會自動添加到/proc/kallsyms中。/proc/kallsyms包含了內(nèi)核中絕大部分的符號,如果在CONFIG_KALLSYMS_ALL內(nèi)核配置中指明,則可以包含內(nèi)核中全部的符號。
1.2.5 /proc/iomem
iomem是一個非常有用的 proc 入口,與/proc/<pid>/maps類似,不過它是跟系統(tǒng)內(nèi)存相關(guān)的。例如,如果想知道內(nèi)核的 text 段所映射的物理內(nèi)存位置,可以搜索Kernel字符串,然后就可以查看 code/text段、data段和bss段的相關(guān)內(nèi)容:
$ grep Kernel /proc/iomem 01000000-016d9b27 : Kernel code 016d9b28-01ceeebf : Kernel data 01df0000-01f26fff : Kernel bss1.2.6 ECFS
extended core file snapshot(ECFS,擴(kuò)展核心文件快照)是一項特殊的核心轉(zhuǎn)儲技術(shù),專門為進(jìn)程鏡像的高級取證分析所設(shè)計。這個軟件的代碼可以在https://github.com/elfmaster/ecfs看到。第8章將會單獨介紹 ECFS 及其使用方法。如果你已經(jīng)進(jìn)入到了高級內(nèi)存取證分析階段,你會非常想關(guān)注這一部分內(nèi)容。
1.3 鏈接器相關(guān)環(huán)境指針
動態(tài)加載器/鏈接器以及鏈接的概念,在程序鏈接、執(zhí)行的過程中都是避不開的基本組成部分。在本書中,你還會學(xué)到更多相關(guān)的概念。在 Linux 中,有許多可以代替動態(tài)鏈接器的方法可供二進(jìn)制黑客使用。隨著本書的深入,你會開始理解鏈接、重定向和動態(tài)加載(程序解釋器)的過程。下面是幾個很有用處的鏈接器相關(guān)的屬性,在本書中將會用到。
1.3.1 LD_PRELOAD 環(huán)境變量
LD_PRELOAD環(huán)境變量可以設(shè)置成一個指定庫的路徑,動態(tài)鏈接時可以比其他庫有更高的優(yōu)先級。這就允許預(yù)加載庫中的函數(shù)和符號能夠覆蓋掉后續(xù)鏈接的庫中的函數(shù)和符號。這在本質(zhì)上允許你通過重定向共享庫函數(shù)來進(jìn)行運行時修復(fù)。在后續(xù)的章節(jié)中,這項技術(shù)可以用來繞過反調(diào)試代碼,也可以用作用戶級 rootkit。
1.3.2 LD_SHOW_AUXV 環(huán)境變量
該環(huán)境變量能夠通知程序加載器來展示程序運行時的輔助向量。輔助向量是放在程序棧(通過內(nèi)核的 ELF 常規(guī)加載方式)上的信息,附帶了傳遞給動態(tài)鏈接器的程序相關(guān)的特定信息。第3章將會對此進(jìn)行進(jìn)一步驗證,不過這些信息對于反編譯和調(diào)試來說非常有用。例如,要想獲取進(jìn)程鏡像 VDSO 頁的內(nèi)存地址(也可以使用maps文件獲取,之前介紹過),就需要查詢AT_SYSINFO。
下面是一個帶有LD_SHOW_AUXV輔助向量的例子:
$ LD_SHOW_AUXV=1 whoami AT_SYSINFO: 0xb7779414 AT_SYSINFO_EHDR: 0xb7779000 AT_HWCAP: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmovpat pse36 clflush mmx fxsr sse sse2 AT_PAGESZ: 4096 AT_CLKTCK: 100 AT_PHDR: 0x8048034 AT_PHENT: 32 AT_PHNUM: 9 AT_BASE: 0xb777a000 AT_FLAGS: 0x0 AT_ENTRY: 0x8048eb8 AT_UID: 1000 AT_EUID: 1000 AT_GID: 1000 AT_EGID: 1000 AT_SECURE: 0 AT_RANDOM: 0xbfb4ca2b AT_EXECFN: /usr/bin/whoami AT_PLATFORM: i686 elfmaster第2章將會進(jìn)一步介紹輔助向量。
1.3.3 鏈接器腳本
鏈接器腳本是我們的一個興趣點,因為鏈接器腳本是由鏈接器解釋的,把程序劃分成相應(yīng)的節(jié)、內(nèi)存和符號。默認(rèn)的鏈接器腳本可以使用ld–verbose查看。
ld鏈接器程序有其自己解釋的一套語言,當(dāng)有文件(如可重定位的目標(biāo)文件、共享庫和頭文件)輸入時,ld鏈接器程序會用自己的語言來決定輸出文件(如可執(zhí)行程序)的組織方式。例如,如果輸出的是一個 ELF 可執(zhí)行文件,鏈接器腳本能夠決定該輸出文件的布局,以及每個段里面包含哪些節(jié)。另外舉一個例子:.bss節(jié)總是放在data段的末尾,這就是鏈接器腳本決定的。你可能很好奇,這為什么就成了我們的一個興趣點呢?一方面,對編譯時鏈接過程有一定深入的了解是很重要的。gcc依賴于鏈接器和其他程序來完成編譯的任務(wù),在某些情況下,能夠控制可執(zhí)行文件的布局相當(dāng)重要。ld命令語言是一門相當(dāng)深入的語言,盡管它超出了本書的范圍,但是非常值得探究。另一方面,在對可執(zhí)行文件進(jìn)行反編譯時,普通段地址或者文件的其他部分有時候會被修改,這就表明引入了一個自定義的鏈接器腳本。gcc通過使用–T標(biāo)志來指定鏈接器腳本。第5章會介紹一個使用鏈接器腳本的例子。
1.4 總結(jié)
本章僅介紹了 Linux 環(huán)境和工具相關(guān)的一些基本概念,在后續(xù)的每個章節(jié)中都會經(jīng)常用到。二進(jìn)制分析主要是了解一些可用的工具和資源并進(jìn)行相關(guān)的整合。目前,我們只簡要介紹了這部分工具,在接下來的章節(jié)中,隨著對 Linux 二進(jìn)制破解這個廣闊領(lǐng)域進(jìn)行更進(jìn)一步的探索,我們會有機會對每一個工具進(jìn)行深入介紹。下一章將會對 ELF 二進(jìn)制格式進(jìn)行更深入的探索,也會涉及其他一些有趣的概念,如動態(tài)鏈接、重定位、符號和節(jié)(section)等。
第2章 ELF 二進(jìn)制格式(上)
第2章 ELF 二進(jìn)制格式(下)
第3章 Linux 進(jìn)程追蹤(上)
第3章 Linux 進(jìn)程追蹤(下)
第4章 ELF 病毒技術(shù)——Linux/UNIX 病毒
第5章 Linux 二進(jìn)制保護(hù)
第6章 Linux 下的 ELF 二進(jìn)制取證分析
第7章 進(jìn)程內(nèi)存取證分析
第8章 ECFS——擴(kuò)展核心文件快照技術(shù)(上)
第8章 ECFS——擴(kuò)展核心文件快照技術(shù)(下)
第9章 Linux/proc/kcore 分析
閱讀全文: http://gitbook.cn/gitchat/geekbook/5ba9eb5b0110e7701d264575
總結(jié)
以上是生活随笔為你收集整理的Linux 二进制分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于JavaWeb的网上书店系统
- 下一篇: swiftyjson_是时候放弃Swif
