為了CTF比賽,如何學習逆向和反彙編?

以及相關書籍,請推薦。


元旦節馬上就要過去,趕緊趁著12點之前寫完回答。

====

如果覺得本文對你有用,請點個贊並關注一下我吧~

====

我做逆向大概四年左右,雖然我沒有參加過CTF,但還是可以寫一些關於如何學習逆向方面的內容~

逆向實際上是很枯燥的工作,我能從枯燥中感到快樂,這就是支撐我學習逆向的動力了。

學習逆向後有什麼用?難道就僅僅能用來比賽?破解啊!網上下載的破解版軟體總是怕有毒,我就自己瞎折騰,技術提升了,軟體也免費用了。女神愛玩捕魚達人這類的遊戲,破解工作就由我代勞了,女神說:「哇好厲害哦~」。另外還有一個用處,錢多,這裡我不多談,怕查水表。有人可能又會說到外掛,會逆向比那些不會逆向的外掛作者不知道高到哪裡去了。一般的外掛作者靠CE之類的工具暴力搜索,顯然這樣做很容易出現一些百思不得其解的東西,而這些東西通過逆向手段是很容易找到答案的。偶爾分析分析遊戲,累了還可以把別人的外掛給逆了,多爽?要多爽有多爽,黑吃黑。黑!真的是太黑了!

CTF中有多種平台的逆向,比較常見的是x86指令集的windows PC逆向和ARM指令集的Android 逆向,我建議先從PC逆向開始。Android逆向的水深,涉及不少東西,我會在後面大概講解。

為什麼要從PC逆向開始?因為這方面的資料很多,前面回答提到的書籍也都是PC的,所以我建議從PC逆向開始學習,常用書《加密與解密》。

PC逆向學習路線:

1、先學彙編!!必須學!!從8086彙編開始學,再到32位,有興趣可以玩玩64位。

2、調試技能(OD、Windbg這些)

3、編程技能(WinAPI多多少少要知道一點,MSDN文檔一定要會看)

4、脫殼

5、漏洞分析

PC逆向學習書籍推薦:

8086彙編(王爽)-&> x86從實模式到保護模式(可選)-&> 加密與解密 -》0day安全:軟體漏洞分析技術

真正的逆向水平通過看書是無法提升的!

我個人認為逆向不存在學習路線和學習套路的說法,也沒有捷徑可走,唯一的捷徑就是多練習!多練習!多練習!Practice Makes Perfect!

逆向完盡量寫分析文章整理思路,文章可以發表在看雪、吾愛這類的論壇,也可以發在自己的博客,這屬於學習總結的一個過程吧。平時沒事的時候多看一點其他大神發的分析文章。除了吾愛看雪這類的老論壇,各大安全公司也有自己博客,文章都是經過精選的,非常不錯!

安全博客-阿里聚安全

百度安全應急響應中心

安全客 - 有思想的安全新媒體

===============================================================

現在我們來談Android逆向。

眾所周知,Android是基於Linux內核的,App大部分要用Java開發,小部分會用到jni,其中涉及到Java、C/C++,意味著你需要學習多門「彙編」語言。

Android App 大部分是基於Java開發的,實際上並不是用的Java的原生虛擬機,Android的解釋器是Google自己開發的,叫做Dalvik(不談ART), 名字由來很玄學,這裡不過多探討。Dalvik虛擬機跑的指令集是Dalvik指令集,一般反編譯後用smali語法來表示。所以學習Android逆向的第一件事情就是學習Smali語法。

如何反編譯一個APK? 如果你去網上搜索的話,一般博客都會寫各種牛X命令行工具,一言以蔽之就是要用N多工具才能成功反編譯一個APK文件。

其實網上有很多集成化工具,比如:Android Killer,拖入Apk即可反編譯。JEB也是一門不錯的工具,拖入APK即可,在彙編區域按下Tab鍵就可以得到Java源碼,JEB反編譯出來的源碼很美!

學習資料整理:

Android 逆向終極版,移動平台,加密與解密,魚C論壇

看完後,破解幾個小遊戲沒什麼問題的。

學習完Smali逆向之後呢? 你如果想深入學習不想止步於破解幾個小遊戲,那就要去學習ARM彙編!

ARM才是移動平台的老大!

ARM是一種指令集,這種指令集的CPU普遍用於移動設備、嵌入式設備,也就是說,我們使用的手機絕大部分都是用ARM指令集的處理器,所以學習ARM錢途光明啊~

實用性不多講,ARM逆向能賺很多錢是真的,這個不多講了。

移動逆向交流群:471525564

偶爾討論撩妹技術~

個人總結:

學習逆向一定要多練習,紙上談兵卵用沒有,浪費時間!在實際分析程序的時候頭腦要清晰,建議用草稿紙畫一畫流程,我在夜間頭腦很清晰,所以實際分析工作我都在晚上做,白天學習理論知識或寫點代碼。遇到困難千萬不要退縮,積極尋找解決方案。 逆向破解往往會有很多種方法,不要因為一種方法的成功而沾沾自喜,嘗試所有你想到的方法!最後,珍惜生活,多關心身邊的朋友,他們真的不一樣!

========================= 附帶一遍我曾經寫的關於如何學習彙編 ====================

最近有不少彙編初學者來問筆者:彙編怎麼學?先學彙編還是先學C?彙編學了有什麼用?學了彙編對理解編程有幫助嗎?筆者接觸彙編也不過兩三年,寫不出高深的文章,但是筆者也是過來人,也曾遇到過這些問題,筆者希望用通俗的語言給讀者講解我是如何看待這些問題的。注意這是春節在高速路上堵著無聊之作。

首先,恭喜你,知道」彙編」這個名詞已經說明你對計算機有一定的了解程度,你想通過學習」彙編」這個途徑來深入了解計算機的運作原理。」深入了解計算機運作原理」這個概念很泛,學習彙編最多是讓你了解軟體層面的原理,以及如何利用硬體罷了。然而計算機是由硬體和軟體組成,彙編是彙編,硬體是硬體.就算你彙編再牛,你也有可能完全不知道什麼是馮諾依曼,哈佛,什麼是流水線,MMU,什麼是段頁式,什麼是三態門。彙編,只是眾多工具中的一種,它很重要,但只是對機器而言,對程序員來說,未必.一個寫Android APP的工程師不懂彙編也能開發出很好的應用,一個寫協議棧的工程師不懂彙編也能做出很優雅的協議.對於大部分的程序員來說,了解,是他們對彙編最高的理解層次,從進化論的角度來講,這可能就說明了彙編對非BSP的程序員來說並不是十分重要.

所以,想學習硬體原理,彙編或許不是很好的途徑。

彙編有很多種,不同的處理器都有一套自己的彙編語言,我們該如何選擇? 如果你想做一名Windows平台安全工程獅,那麼就需要學習x86彙編,因為Windows是運行在x86架構上的操作系統。x86又有16位,32位,64位,看著心都涼了半截。前輩認為我們應該從8086彙編開始學,8086彙編實際上就是16位的x86彙編。雖然現在8086處理器已經絕種了,但是我也認為應該從8086開始學習。相比32位的x86,16位更加簡單,很容易學的,而且16位的彙編是32位的一個子集,學了並不是一無用處。在學習32位彙編時就很輕鬆,你會有一種海闊天空,會當雲絕頂的感覺。地址空間從1M變成4G的,就像你一夜暴富一樣。再也不用仔細考慮小運算是否會溢出。。。x86 32位引入了保護模式,引入了分頁機制,這是實現現代操作系統的基礎,大家學有餘力可以深入了解,如果是定位是內核工程獅,那麼這些就是基本功了。假如有一天你對你家的路由器感興趣了,你想對它進行XXOO,那麼你有可能需要學習MIPS彙編 ,市場上的大部分路由是MIPS架構的 。還是有些人,比較喜歡非主流,去跑去學習一些根本觸碰不到的東西,往往只能紙上談兵,掛載到嘴上,吹幾個牛逼罷了,其實我是想說學習自己需要的方面,不要把精力浪費在沒用的方向。有些人對我說彙編算個什麼卵,用機器碼編程的才牛逼,對於這種人,我也只有呵呵呵的笑。

在學習完一門彙編語言後再去學習其他平台彙編就會很容易了,或許只要一周一天甚至幾個小時就能掌握新的彙編語言,筆者學習arm彙編時就是這樣的。這是因為彙編難,是難在彙編生硬的思想,彙編簡單,是指令簡潔,比起學習一門高級語言容易很多!彙編是枯燥的,但是彙編代碼能更好的體現一個人的思維!目標使你看清使命,產生動力!這句話很贊,特別適合彙編初學者,如果沒有目標,你就像是無頭蒼蠅一樣,找不著北。我有個朋友,三年前認識的,這位朋友看我寫彙編代碼覺得很牛逼,就讓我教他。 我愉快的答應了並且還給了他《彙編語言》這本神書,然而他沒有目標,三年後,前幾天的事情吧,他依然在問我如何搭建彙編環境,怎麼用OD。 這就是沒有目標造成的,對彙編盲目崇拜,學習彙編不是因為別人也學習了彙編。

如何定目標? 對於極客來說,DIY什麼的再好不過了,這和彙編有什麼關係呢? 學習彙編,你能編寫自己的「操作系統」,雖然稱它為「操作系統」有點過了,當這何嘗不是一種鼓勵呢?別人問你為什麼學習彙編,你回答說:"我研究系統內核的!" 檔次瞬間就上去了。 編寫「操作系統」的樂趣很多啊,筆者也是開發過自己的「操作系統」黑漆漆的屏幕上輸出了歷史性的「Hello world」,第一次讀取硬碟,訪問神秘莫測的顯存,都充滿了無限的樂趣。學習彙編可以賺錢!可以賺錢!可以賺錢!是的我沒有開玩笑,但是這似乎有些不符合天朝的法律,僅供參考。賺錢其實只是為了吸引你的眼球罷了,做技術的,就不應該把金錢放在第一位! 對於做逆向來學,彙編是基礎功,對彙編的熟練程度決定了你在工作崗位是否吃香。吾愛論壇也有很多用RMB求破解的,作為一名Cracker,對彙編的熟練程度也直接決定了你的吃香程度。為什麼有人願意花大價錢求破解?因為彙編難啊,演算法難啊,他們看不懂啊,而你掌握了核心技術,你看得懂啊,這些就是給你送錢的啊。偶爾寫一篇破文發在吾愛看雪,騙一篇精華不是挺有成就感的嗎?

學習彙編能幫助理解編程?這個論點是正確的!但是對於解釋性的腳本語言來說就有點不適用了,因為腳本都是解釋執行的,解釋器是中介 。你學習了彙編,C語言中的指針對你來說只能算是小菜。你會感嘆用著C指針好幸福啊! 如果此時你在去用一些高級內存管理,什麼垃圾回收一類的,你會感覺好繁瑣好繁瑣! 如今編譯優化很牛逼了,偷梁換柱,移星大法的事情是很常有的,要調試這樣的代碼是很蛋疼,有時候你根本找不到出錯的原因,這時候你就需要對程序進行反彙編,從彙編的角度思考你的程序。BUG常有,而Debugger不常有。Debugger指的是調試技術很精湛的人。所以學習彙編能增加你的調試技術,早日成為調戲師!不過換句話說,你總會在某些黑暗的地方被迫閱讀彙編代碼..........還有一點好處便是你在寫代碼的時候隨時都會從彙編的角度來考慮代碼的效率問題。學了彙編可以盜竊別人的智慧啊,說好聽的我們是借鑒別人的智慧,學習別人的智慧,這和法律並不衝突,比如哪天你發現一個壓縮演算法好牛逼啊,可以將1G壓縮成10M,然而這個軟體又是閉源軟體,甚至是收費軟體,這時候就能通過逆向分析的手段來破解這個程序,或者用逆向分析的手段來學習壓縮演算法的原理,最後你的智商爆表或者受到祖上仙人保佑,你研究出可以將1G壓縮到1M的超級逆天級演算法,得了圖領獎務必請我吃飯。

來一個大跳躍吧。比如有一天你看到了這種反人類的代碼: a[i]=i++ 你會如何思考?一般程序猿會想,應該是先算 a[i] 的地址吧,一些學過一點彙編的人可能會想,應該從右邊開始計算吧?CPU寄存器就那麼幾個,按照運算順序貌似符合邏輯。但是這條語句在不同編譯器下編譯的結果是千奇百怪的,所以還是得需要通過反彙編,來看編譯器是如何來編譯a[i]=i++這句代碼的。學習彙編!不要被編譯器蒙蔽了雙眼!

有的人可能還擔心自己太老不適合學習彙編。其實並不是這樣的,你看看教彙編的教授哪個不是老骨頭啊,彙編下至6歲上至80歲都適合學習!


表示推薦幾本書吧

《程序員的自我修養》,一定要反覆閱讀;

《深入理解計算機系統》

《密碼學實踐》,有助於理解很多題目

當然這個領域太豐富了,慢慢來吧,有興趣的話可以看看國內很多CTF選手的writeup


為了打比賽學習,那你還是別學了。


之前看加解密入門的,後來發現RE For Beginners 真的是不錯。


需要看的書籍:

1.Intel 微處理器.

2.Windows環境下32位彙編語言程序設計

3.WindowsPE權威指南

4.C++反彙編與逆向分析技術揭秘

5.加密與解密第三版

6.IDA Pro權威指南

需要掌握的工具:

靜態反彙編工具: IDA Pro

動態反彙編工具: ollydbg

Windows內核調試工具: windbg

看這些書的基礎:熟悉C++,熟悉編程.針對不同的語言,你也要知道一些.至此,軟體逆向你就入門了.此時參加CTF我想是沒有問題的.

我始終認為,要在逆向與反彙編上有大的成就,編程是必須會的.再接著就是必須熟悉密碼學.熟悉軟體工程.因為越往後走,你會越發現,軟體逆向並不是簡單的反彙編,而是需要很多的知識.其中編譯器的知識是需要的.軟體逆向是會走向工程化的.很多時候一個人是在短時間內無法完成的.這個時候借鑒軟體工程的方法,會有好處.目前在國內外對於軟體逆向的研究並不是很成熟,軟體逆向工程性的方法理論目前也沒有成熟.因此在軟體逆向領域是非常有挑戰性的.這是一門新興的領域,需要廣大愛好者的研究和投入.

其次軟體逆向是針對不同的語言,難易程度不同.對於非編譯型語言,逆向的難度要小很多.目前我認為編譯型語言逆向最難的是C++.對於C++的逆向,我十分推薦上面提到的4.C++反彙編與逆向分析技術揭秘這本書.

國外也有兩篇極佳的論文/文章:

黑帽大會上的演講:https://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf

Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI. igorsk .http://www.openrce.org/articles/full_view/23

國內論壇上也有一些文章:

【原創】RTTI結構詳細分析(VC++)

【原創】易語言消息機制分析(消息攔截原理)

【原創】MFC消息攔截分析(+示常式序分析)

【原創】逆向分析 C++繼承內存分布(帶虛函數) 及動態綁定實現

密碼學在逆向中的應用:

【原創】UltraISO註冊演算法keygen分析(已算出一組註冊碼)


可惜我認識的牛人都不玩知乎,我就算是代答了。

自己不玩CTF,但是身邊都是玩CTF的,我也參加過一些他們的培訓。

個人意見是,去做CTF的題,看他們的解題報告。

有一個很好玩的適合初級者的比賽picoCTF 2014,在網上也可以找到解答 http://ehsandev.com/pico2014/

另外不用恐懼太難了,任何CTF都有簡單題。


一個巧合的機會,成為了CTF奪旗愛好者,一個ctf小白。從12年開始國內大大小小的CTF比賽我都看過,那會還沒有統一叫CTF,都是叫 網路攻防賽、信息安全賽之類的,目的就是為了通過技術手段找到最終的key(現在的CTF中叫做flag)。只是到了後來慢慢的可能受到DEFCON CTF的影響國內所有的安全競賽也統一叫做CTF競賽了。

國內外比較知名的比賽:XCTF聯賽、DEFCON CTF、首都網路安全日

做為CTF小白用戶,這四年跳過的坑真心不少。尤其是加密、隱寫、逆向破解和web這幾個方向的坑,基本是跳一個栽一個。

不過還是靠著:實驗吧、決鬥場等免費的線上模擬平台,終於成功脫坑,技術也越來越熟練。

在這四年的學習中,我總結了一些值得CTF新手和CTF剛剛入門愛好者,學習的乾貨。

一、首先推薦:常去的【學習交流站點】

實驗吧www.shiyanbar.com/courses
安全類實操課程比較全,實驗和CTF題庫都可以免費學,做公益的平台真心不多見!

CTF領域指南 | IDF實驗室 博譯有道

百度信息安全吧 有時可以探到一些小道內幕

I春秋 安全課程比較多,但能動手實操的少,課程收費有點小貴


XCTFtime 國內CTF聯賽查詢網站

Modern Binary Exploitation bin 乾貨區

吾愛破解?2016?安全挑戰賽 『2016安全挑戰賽』

除了線上練習,看大牛們出的那些難解的題目,練手之外,加一些ctf的群(384182116、222359598、517164205),和別的朋友交流解題思路與經驗,也是必不可少的,能讓自己對CTF的解題思路更加廣泛。

二、常去的一些ctf的【線上練習平台】

ctf奪旗訓練_CTF訓練營 實驗吧的決鬥場,題庫全更新快,基本每題都有WriteUP,免費練習的好地方

網路安全實驗室 網路信息安全練習平台,很早的平台,近兩年不怎麼更新了

index of / ctf題目

夢之光芒/Monyer——Monyer"s
Little Game
夢之光芒的小遊戲

黑客遊戲 Let"s Hack 習科黑客遊戲

Jlu.CTF首頁 Jlu.CTF

IDF實驗室 CTF訓練營 idf 實驗室,比較早做CTF訓練的平台,現在也不咋維護了

歡迎參加比賽~ 米安網ctf

黑吧安全網-紅客闖關遊戲
黑吧安全網-紅客闖關遊戲

http://202.108.211.5/ 實訓競賽系統

信息安全鐵人三項賽官網 訓練營的內容很棒,期待早日開放出來

三、其他相關,挖洞人員【漏洞平台】

Offensive Security Exploit Database Archive

www.sebug.org

補天 - 企業和白帽子共贏的漏洞響應平台,幫助企業建立SRC,庫帶計劃

SOBUG漏洞懸賞平台

Exploit-ID

CVE -

SecuriTeam.com

Computer Security vulnerabilities and exploits database

SecurityFocus

http://marc.info/?l=bugtraq

SecurityTracker.com

經常去漏洞平台,可以讓你隨時了解國內外那些漏洞大事件。也可以嘗試著提交一些漏洞,既鍛煉技術還有額外獎勵。

四、常用【在線類工具】

Objectif S??curit?? 在線LMHASH破解

https://www.hashkiller.co.uk/ hash破解

https://github.com/ 全球知名在線管理開發平台

http://astalavista.box.sk 最好的註冊碼、註冊機、序列號搜索引擎

http://www.s0ftpj.org/ 義大利老站

http://recover-weblogic-password.appspot.com/ 在線weblogic密文破解

http://tools88.com/safe/vnc.php 在線VNC密文破http://www.vpnhunter.com/ 在線查找VPN,mail介面

http://mailinator.com 一次性郵箱

http://www.yopmail.com/zh/ 一次性郵箱

五、國內外安全大牛的【個人博客】

http://www.insecure.org (Fyoderr的個人站點,即Nmap的老家)  

http://www.guninski.com/ 安全專家Guninski的主頁,有大量系統漏洞工具具及源代碼   

http://blog.gentilkiwi.com/ mimikatz

https://www.schneier.com/ Bruce,Schneier的博客(專業Blackhat會棍)

http://an7isec.blogspot.co.il/ "整蠱小黑必備" 博客 發現了WVS8版本遠程溢出漏洞

https://fail0verflow.com/blog/index.html 一個硬體牛的BLOG

https://blog.0x80.org/ 破解過jeep車鎖的大牛

https://www.netspi.com/blog 對MSSQL滲透有研究的大牛

http://hakin9.org

http://websec.ca/blog 滲透tips

http://www.derkeiler.com/

http://www.xssed.com/

http://adsecurity.org/ 內網滲透、域滲透牛人

http://securityxploded.com

http://www.devttys0.com/blog/ 國外路由器安全大牛

這些國內外大牛的個人博客,是一定要關注的,不管想當職業賽棍,還是僅僅是對ctf感興趣,從中學些安全技術,這些是最寶貴的經驗。

六、最後給大家推薦一些【綜合類型網站】

http://www.blackhat.com/

http://shiyanbar.com(線上資源均免費,經常性的舉辦各種有獎活動)

http://packetstormsecurity.com (有大量exploit程序)

http://www.ussrback.com/ 比較活躍的安全站

http://www.attrition.org/ 內容全面的安全站  (更新至2013年)

http://www.social-engineer.org/ 社會工程學研究所

https://www.soldierx.com

http://www.windowsecurity.com/(windowsnetworking.com)包含論壇、博客、新聞、工具windowsnetworking.com

http://www.blackmoreops.com

http://www.securitytube.net 大量視頻


寫個奇葩點的小程序,VS調試開彙編+源碼,了解每一步的作用,了解常用的調用規約。

似乎就可以了。

然後取適量CrackMe,放入調試器中搖勻(胡扯

跟著CrackMe的作者的答案學習。

其實我是看《Windows 核心編程》學的。(辶兆

update: 有一本封面是動物的,叫《軟體加密與解密》挺有趣的,破解xbox什麼的有簡介,看了讓我充滿各種幻想


看雪的《加密與解密》《0day》 還有就是看雪的ctf比賽:基本上每個季度都有。網址:首頁 - 看雪CTF


《黑客反彙編技術揭密》,《黑客調試技術揭密》


加密與解密一類吧。像看雪,吾愛等知名論壇都有一些精華整理版,很好的學習資料。剛入門的話我感覺先去一些不太知名的論壇,那些論壇基礎知識發的比較多點


學習固然必不可少,但很大程度上要靠天賦。有些時候要硬看,有些時候要想想:如果是我,我會怎麼做,我會如何改進。


RE For Beginners 中文版


推薦閱讀:

破解遊戲或軟體是個什麼樣的體驗?
小馬oem是如何做到windows激活的?
如何看待《尼爾》《仙女座》等遊戲使用的最新版的Denuvo 64位防篡改技術被破解?
zip密碼破解相比RAR為什麼那麼快?

TAG:破解 | 黑客Hacker | 信息安全 | 反彙編 | CTFCaptureTheFlag |