在上一篇的博客中已經解到第四關了,如今繼續挑戰~~html
【 第四關】java
在上一關解壓成功後,生成了一個file文件。用vim的二進制格式打開,轉成十六進制,發現文件頭格式以下:python
是個以ELF字符開頭的文件,那就是個可執行的文件(ps:關於這點一樣能夠用file命令或者binwalk工具分析,下面是file命令分析的截圖,能夠發現仍是x64平臺下的)。linux
給這個file文件加上執行權限:「chmod +x ./file」,執行一下,發現生成了一個data文件,一樣用vim二進制打開轉十六進制,發現以下字符串:vim
我嘞個X,java都來了@_@,再用file命令分析一下,發現是一個java class文件,版本是52.0的。google搜索了一下,說是javac將 .java 源文件編譯爲 .clsss 文件,最後由java 來運行 這個.class的目標文件。注意到上圖第1、二行中包含了「SourceFile、tip.java」這些字符串。說明它的源文件是tip.java,因此須要將這個data目標文件再重命名爲tip.class文件(ps:java中的共有類,其文件名必須和類名一致,否則就找不着類名了)。如今就能夠直接執行這個.class文件咯,執行發現出錯-_-數組
提示信息說「Exception in thread "main" java.lang.UnsupportedClassVersionError: tip : Unsupported major.minor version 52.0」,搜索了下,說是java的版本不支持,也就是說我這機子上的java版本過低了,用「java -version」看了下,本機是1.6的版本,搜一下java最新版本,已經到1.8了~_~,找其餘同窗的1.8版本的java跑一下試試,發現能夠運行:微信
生成了一堆的字符串,一看仍是比較熟悉的,是unicode編碼,懶得寫腳本,直接在線解碼吧~app
關於上面的tip.class文件,0xcch大牛說,可使用jd-gui(java反彙編工具)打開。直接看到這個class文件的源碼,複製出來再從新編譯一下就好了:微信公衆平臺
根據提示「請把源程序的strcmp()返回值+1處理」,試着再執行如下這個file源程序。竟然發現沒有權限,咋回事?剛纔不是加的執行權限麼,ls查看了下,發現如今這個file文件確實沒有執行權限。加上執行權限,執行發現報錯:函數
好像是缺乏一個共享的動態連接庫,用ldd命令看看:
果真是缺乏libstrlen.so這的動態連接庫,google狂搜了一堆,發現不少相似的動態連接庫都是本身實現的。莫非,還須要本身來寫一個???先查看一下這個動態連接庫都調用了那些函數吧,使用readelf查看這個file程序的文件符號表區中的條目,發現條目太多,考慮到連接庫函數都是經過「UND」關鍵詞定義的,因此使用條件過濾:
除了調用GLIBC的連接庫以外,好像並無調用其餘的連接庫哎。可是既然程序須要這個庫,就隨便生成這個庫吧,用vim隨便寫個C代碼:int foo(const char* s) {return 1;
} 使用gcc編譯鏈接生成libstrlen.so動態連接庫:
添加指定的所需動態連接庫路徑,使用ldd查看一下發現這個libstrlen.so已添加成功:
運行程序,竟然能夠運行成功哎^_^
其中的 tip:data 讓想起了以前那個data的java文件的提示,看來須要反編譯一下這個file程序了,使用objdump查看反編譯後的代碼:
發現這個程序中自定義了兩個函數:outputdata函數和output函數。
首先開始從main()函數開始分析:它調用了自定義的outputdata函數,可是貌似並無調用那個output函數。果斷地使用gdb調試看看:
發現真沒有調用那個output()函數,使用gdb打印這個output()函數,發現通關連接:
【 第五關】
打開連接(http://xiyoulinux.idina.cn)以下圖,有兩張圖片,第一張是個很複雜的有向圖,第二張看樣子是權值表了,下面還有一個連接,點了下,下載了個文件,打開看是一大串的01字符串~~,習慣性的查看了下網頁源碼,發現這個「<!-- 解出此關後請帶着密鑰調戲微信小妞哦~~~~~~~~ -->」,看來已經到最後一關了,心好累 (~_~)。
先從那個01字符串入手吧,複製了開頭一小部分,在線編碼(https://paulschou.com/tools/xlate/)試試,發如今文本編碼處,有英文字符串,用百度翻譯了下,有明顯的「肖申克的救贖......」。
應該是將01的二進制數轉換成ASCII值,將二進制數8位一截,轉換一下,python腳本:
#!/usr/bin/env python # coding=utf-8 f = open('a8a0dd247b3ed742').read() f = f.replace('\n','') list = [] text = [] count = 0 for i in f: count += 1 list.append(i) if count%8 == 0: bin = ''.join(list) list = [] ch = chr(int(bin,2)) text.append(ch) txt = ''.join(text) f2 = open('article.txt','w') f2.write(txt) f2.close()
vim打開這篇文章,找找看有啥東西咯,在文章的末尾發現了提示字符串:
翻譯了下,應該是找最長的重複句子。呵呵,這用python不是分分鐘的事麼?根據上圖的分析,分割句子直接使用字符串內建函數string.split('. '),須要注意的是分割符是「. 」(即:點加空格,而不是點)。python代碼:
#!/usr/bin/env python # coding=utf-8 text = open('article.txt').read() sen = text.split('. ') dict = {} max = 0 for i in sen: if sen.count(i) > 1 and len(i) > max: max = len(i) count = 0 for i in sen: if len(i) == max: print 'len = %d\n%s' % (len(i),i) break count += 1
一共13行代碼就搞定了^_^ 因此說,人生苦短,快用python!!下面是找出來的最長的重複句子:
「I wish I was young again」, 是啊,大學,更須要一顆永葆青春的心!!由於從這裏,你開始走向成熟。。。
繼續分析吧~~貌似這句話也沒啥提示,可能以後會用到的,再分析那個有向圖吧。分析一下那個權值表,數值在幾十到幾百之間,根據上面得出的句子,容易猜測到應該是ASCII值,根據ASCII表將可顯示的字符值標到有向圖上。
從v1開始,試着根據已存在權值的路徑走一下這張圖。從v1開始只能走v11,v11能夠走到v12和v18,可是v12到v13沒有給權值,估計是沒法走通,因此從v11走到v18試試,根據上面的分析思路,v18也只能走v26,v26只能走v35,v35能夠走的路線有v44,v20。但v44沒有前路,只能走v20,v20只能走v28,若是v28向v21方向走下去,基本是不會了,應爲走到這應該發現,那個s[ ]數組很重要(其實這一開始就應該想到,那個s[ ]數組應該很重要!)。
根據上面分析的思路,走完的路徑是:v1->v11->v18->v26->v35->v20->v28->v37->v22->v30->v45->v51->v63->v55->v47->v64。將所走路徑的權值字符串連起來就是:s[9]、L、s[1]、V、E、x、I、s[0]、O、s[2]、L、I、s[3]、u、X。哈哈,這會兒應該能夠想到是啥了吧: i love xiyou linux! 還有5個大小寫未知的字符,窮舉也就2^5=32個,固然一個個試的話確定能成功的,可是貌似以前找出來的那個最長的重複句子還沒用上。根據s[ ]數組中的字母(i、o、y、u、n)和對應下標在上面的句子中匹配,很容易發現是在「young again」字符串中。因此最終的結果就是:iLoVExIyOuLInuX。發送到微信公衆平臺,返回通關成功!!!