Author: Ali0th
Date : 2018-03-19
0.1. 前言
這一篇是我之前發在先知上的文章,今天把它移過來。當時一開始做爬蟲通過解析 js 的形式去破解,感覺有點費力,現在一般不會這麼搞,所以這篇文章大概看看就好。
0.2. 第一關:拿到javascript內容
一開始瀏覽器看不到反爬蟲的js代碼。
難點:
一開始打開這個網站,比較難留意到有個狀態是521頁面的跳轉。因爲這個頁面一小時只出現一次,並且爲1500毫秒。
過關技巧:
阻止cookie來獲得javascript
具體實現:
刪除cookie並阻止
查看源碼
0.3. 第二關:獲得真實代碼
難點:
將真正的代碼隱藏起來,阻止了那些直接一上來就解碼的人。
過關技巧:
找到最終輸出點爲eval
具體實現:
1)美化
使用【http://jsbeautifier.org/】
2)理解代碼
可以看到eval是最後一步,說明這裏最後是通過eval來拼接並執行程序。所以這裏可以把eval改爲【console.log】放到F12的console口裏看一下結果。
可以看到黃色部分爲運行結果,說明是二次混淆了,這個黃色部分纔是真實代碼。複製出來看。如下:
把頭尾的東西去掉,沒用的。再美化之後:
0.4. 第三關:修正代碼
難點:
如果你看到上面有個eval就使用第二關的方法,那就錯了,這裏的eval在代碼中間,只是用來拼接用的。而且這裏還有個故意留下的坑,就是讓程序運行錯誤,所以這裏要好好理解代碼,弄懂其邏輯。
過關技巧:
放到IDE裏梳理代碼。(這裏使用ecilpse)
具體實現:
1)代碼貼到ecilpse裏
使用eclipse搭建一個js的測試頁面,隨時用瀏覽器刷新查看結果。
2)理清代碼總體邏輯,並去掉不重要代碼
如圖爲整體代碼的大邏輯,於是我們可以去掉不重要的代碼,留下重要部分,放到eclipse裏調試。
代碼爲:
最後的dc即輸出了我們要的結果。
3)輸出dc出來
在最後寫上一句【console.log(dc);】然後放到F12裏:
看,這就是我們得到要的結果。
但是,放在python裏,這樣流程走下來的結果偶爾會對,偶爾又不行了。爲什麼呢?還要繼續深挖。
0.5. 第四關:jsfuck
難點:
特殊字符
過關技巧:
細心
具體分析:
cd數組,沒錯我們要搞cd數組。看起來應該是jsfuck,打CTF經常會遇到。但這裏的話要怎麼去分解他呢?看到這個地方:
再仔細看看:f.reverse()[[-~[]]](cd[i])
其中,reverse()是逆序的意思,可以先去掉,就剩下:f[[-~[]]](cd[i])
這個的形式其實就是f[ ]( )
,就是調用上面的f函數的形式,那麼最奇怪的點就在這裏[ ]
裏的[-~[]]
,它是直接用的!
於是我試着直接看它是值是什麼:
它直接就是值爲1的數組。那麼直接看cd的值試試:
沒錯是一堆數組。用python看,裏面是有幾層數組:
爲什麼會這樣呢?js的什麼特性導致了?想了半天,想到了很多年前看到的一篇文章【http://www.freebuf.com/sectool/5352.html】:
好了,過了這一關,基本上算是轉折點,快接近終點了。
0.6. 第五關:列表裏的列表
難點:
f函數邏輯。
過關技巧:
看懂f函數邏輯,慢慢調試才知每部分的功能。
具體分析:
上一關我們看到數組裏面還要數組,那麼我們就要看各個數組對應的是什麼值。
經過調試,發現最多出現三層數組。我們分別命令爲x、y、z層。其中:
x層直接爲字符串,只要拼接就行了。
y1層爲ascii碼。
y2層和z層爲對應當前url的第n個字符。這就是爲什麼上面第三關還不算成功的原因。
再具體說明一下z層,下面這個函數可以獲得當前的頁面的url,所以每個網站都不一樣的。所以這一層個人認爲是個相當棒的設計。
比如這裏訪問的是http://localhost/
,那麼先過濾出來localhost/
,然後如果cd裏這個z層數組值是4,那麼得到的字符是a
。所以最終,這個cd數組根據每一層的轉換,就能變爲:
然後拼接dc就是最終我們要的結果了啦啦啦: