首先:
是用ida看出來的。這個(gè)是一個(gè)很bug的工具。。
然后,為什么會看煩起來:
因?yàn)?objdump -d 命令出來的代碼是只有 elf文件的.text段的吧,就漏掉了其他段,那些初始化的 .data段 .rodata段 里面都是答案?。。?!
因?yàn)橹囟ㄎ坏臅r(shí)候,那些符號全都變成了絕對地址?吧。 在-d選項(xiàng)出來的匯編文件中,可以經(jīng)??吹絤ov 一個(gè)地址到一個(gè)寄存器里面去,但是怎么搜都搜不到這個(gè)地址。。。。。
objdump居然沒有給我看其他的段。。。。。。
雖然我只知道他的-d選項(xiàng)。。。。。。。。。
然后就是,我寫的是32位版本:
發(fā)現(xiàn)里面的每個(gè)函數(shù)都是獨(dú)立的,參數(shù)都是通過棧幀來傳遞的,就是說,想了解哪個(gè)函數(shù)是干什么的,只要找到這個(gè)函數(shù)所在的位置就好了。
如果看到ebp+8 ebp+12 什么的,想知道傳了什么參數(shù),就到調(diào)用函數(shù)里面去找他mov了什么進(jìn)去,
還有一個(gè)棧幀的esp通常都是在進(jìn)入這個(gè)函數(shù)之后就被確定了,把這個(gè)esp減去多少個(gè)數(shù)之后,這個(gè)esp就不會再改變了,期間,向這個(gè)棧幀里面填東西,讀東西,都是用esp或者ebp加減偏移量來實(shí)現(xiàn)的。
不知道這個(gè)是老師把程序優(yōu)化了之后的結(jié)果,還是gcc就是這么的nice。
不知道64位的是不是用寄存器來傳的。
下面都是廢話了
剛開始看的時(shí)候,沒有什么思路,就從 _start 開始看,然后發(fā)現(xiàn)還有個(gè)main。。。。就不知道從哪里開始看起。
幾天后老師上到elf文件的格式的時(shí)候,知道可以用readelf命令看下elf文件的頭,里面可以看出整個(gè)程序的入口。雖然知道之后也沒有什么卵用。
所以我還是按照從入口開始之后的順序,看到j(luò)ump就跟著他跳。。。。。。
結(jié)果發(fā)現(xiàn)很煩,因?yàn)閖ump跳來跳去的,然后跳到像:

這種地方的時(shí)候,就不知道他要跳到哪里去了。
心里是有感覺應(yīng)該是跳到系統(tǒng)調(diào)用的內(nèi)存去了,但是那塊知識很模糊,反正最后就是很煩。
后來,慢慢去看老師給的bomb.c文件。
里面開頭的介紹英語,翻譯出來之后,好像是說,那個(gè)邪惡博士提到什么逆向工程。。
然后百度到了看雪論壇,雖然里面的東西基本看不懂,但是知道了ida和他的f5。
然后在虛擬機(jī)里面安了個(gè)盜版的ida pro。
沒有下到漢化版的,于是就不知道安裝的時(shí)候都同意了哪些東西,反正成功導(dǎo)入了bomb,然后找到main。按下f5,結(jié)果出來的代碼和老師給的差不多。。。。
厲害了。
然后就是第一個(gè)phase1,f5直接就給出了答案。。。就是一個(gè)放在.rodata的字符串。。。。
之后的幾個(gè)密碼,幾乎是按著書上的知識點(diǎn)來設(shè)置的。。。。
最后的地方是有一個(gè)隱藏的密碼的,用的是二叉樹?感覺是二叉樹。他調(diào)用了一個(gè)叫 <__strtol_internal@plt >的函數(shù),百度不怎么好找這個(gè)函數(shù)是干什么的,
這個(gè)函數(shù)是把輸入的指針指向的字符給變成數(shù)字的,如果里面就是一個(gè)表達(dá)數(shù)字的字符串的話,就不會出錯(cuò)。
其他的介紹就沒有看了。是函數(shù)(atoi() )調(diào)用的他。
最后 我的答案。不唯一。。。

ps:crack me 看起來很厲害的樣子。