2019年末逆向复习系列之努比亚Cookie生成逆向分析
鄭重聲明:本項(xiàng)目的所有代碼和相關(guān)文章, 僅用于經(jīng)驗(yàn)技術(shù)交流分享,禁止將相關(guān)技術(shù)應(yīng)用到不正當(dāng)途徑,因?yàn)闉E用技術(shù)產(chǎn)生的風(fēng)險(xiǎn)與本人無關(guān)。
這篇文章是《2019年末逆向復(fù)習(xí)系列》的第二篇:《努比亞Cookie生成逆向分析》
本次案例的代碼都已上傳到Review_Reverse上面,后面會(huì)持續(xù)更新,大家可以Fork一波。
逆向網(wǎng)址
努比亞-牛仔俱樂部:https://bbs.nubia.cn/
逆向背景
努比亞俱樂部的逆向有意思在它的Cookie是動(dòng)態(tài)生成的,是由Js生成Cookie的案例,并且這個(gè)網(wǎng)站還有前端反調(diào)試的機(jī)制,對(duì)于新手爬蟲工程師來說很值得學(xué)習(xí)和研究。
分析流程與逆向破解
我們以這個(gè)鏈接為例努比亞-牛仔俱樂部,訪問并打開開發(fā)者工具,讀者會(huì)發(fā)現(xiàn)并沒有遇到什么異常情況。
等等,我們這次講的是生成Cookie,我們首先需要把該網(wǎng)站的緩存、Cookie清除才行,不過我們先分析分析它們的Cookie的關(guān)鍵點(diǎn)。
看到Cookie的組成,覺得acw_sc__v2和acw_sc__v3參數(shù)比較可疑,這個(gè)疑問我們先存在,之后再看看。
之后我們照例在Application->Clear Storage清除數(shù)據(jù)。
清除完之后我們依舊打開開發(fā)者工具重新刷新頁面進(jìn)行訪問,可以發(fā)現(xiàn),網(wǎng)站彈出debugger
知識(shí)點(diǎn)1:前端反調(diào)試
隨著現(xiàn)在爬蟲課程的普及,越來越多人都掌握了基本的爬蟲用法,類似利用開發(fā)者工具尋找網(wǎng)站接口或者進(jìn)行調(diào)試逆向?qū)ふ壹用芊椒?#xff0c;對(duì)于網(wǎng)站本身來說,如何簡(jiǎn)單又有效地減緩這種行為是應(yīng)該考慮的,所以一些網(wǎng)站在代碼中注入了檢測(cè)開發(fā)者工具是否打開的Js代碼,這樣,當(dāng)我們想要打開開發(fā)者工具的時(shí)候我們就會(huì)陷入網(wǎng)站的無限循環(huán)的debugger地獄,而且這樣還會(huì)造成Js的內(nèi)存泄漏,你可以在遇到這種情況的時(shí)候檢查你的chrome頁面進(jìn)程,會(huì)發(fā)現(xiàn)內(nèi)存占用量越來越高,可你什么都沒干?所以,對(duì)于這種反調(diào)試手段,我們需要學(xué)習(xí)如何繞過。
1. 繞過debugger地獄
我們首先查看右邊的Call Stack調(diào)用棧,我們一一分析,可以追溯到如圖所示的地方。
關(guān)鍵代碼是這樣的,也就是一開始會(huì)執(zhí)行_0x4db1c這個(gè)函數(shù)(初步理解是上文所說的檢測(cè)開發(fā)者工具是否打開的函數(shù),之后setInterval函數(shù)是每隔一定時(shí)間執(zhí)行)
我們?cè)倏確0x4db1c的函數(shù),它停在_0x355d23這個(gè)函數(shù)上面
面對(duì)這樣的情況,我們可以直接在Console里面對(duì)這個(gè)函數(shù)進(jìn)行重寫
重寫好之后我們執(zhí)行下,會(huì)發(fā)現(xiàn)這個(gè)頁面就直接生成好Cookie去訪問頁面了,這樣達(dá)不到我們之前想研究它Cookie生成的邏輯的目的。
目前我們繞過了debugger反調(diào)試,那我們?cè)撛趺传@取生成Cookie的邏輯呢?我們接著分析
2. 破解Cookie生成邏輯
為了我們分析的方便,我們可以直接把這個(gè)debugger的代碼保存下來,在我們本地代碼中刪除debugger的邏輯之后進(jìn)行調(diào)試。
我們直接打開這個(gè)html文件,我們會(huì)發(fā)現(xiàn)網(wǎng)頁一直卡在Sources不動(dòng),為什么會(huì)出現(xiàn)這種情況?
仔細(xì)分析代碼,發(fā)現(xiàn)有些Regexp的檢測(cè)代碼,根據(jù)以往的經(jīng)驗(yàn)可能是檢測(cè)代碼是否長(zhǎng)開?防止有人本地調(diào)試?我們使用壓縮后的代碼,大家可以用Js壓縮/解壓工具進(jìn)行壓縮
果然,壓縮之后還是正常的,那么可以驗(yàn)證我們剛才的想法了。
我們刪除debugger相關(guān)的代碼,也就是
打開網(wǎng)頁后發(fā)現(xiàn)頁面一直在閃?html代碼不長(zhǎng),我們?cè)僮屑?xì)看看,注意到一個(gè)細(xì)節(jié)setTimeout
setTimeout是延后幾秒執(zhí)行一次,我們看一下’\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29’是什么意思,我們把它放在Console里看看。
可以看到,setTimeout執(zhí)行reload函數(shù),我們看看reload函數(shù)
里面的邏輯是先設(shè)置Cookie再重載頁面,所以我們這里一直閃的原因是先執(zhí)行setTimeout再重載頁面又執(zhí)行setTimeout,所以又是一個(gè)循環(huán)地獄,我們刪除setTimeout這段代碼就行。等等,我們?cè)倏纯瓷厦鍯onsole中的結(jié)果reload(arg2),然后到reload函數(shù)中,acw_sc__v2是由arg2這個(gè)函數(shù)得來的,好,我們現(xiàn)在明白了哪個(gè)地方生成的Cookie了,我們?cè)趆tml代碼中搜索arg2,然后對(duì)它打上斷點(diǎn)。
3. 分析加密算法
我們先總體看下arg2函數(shù)的構(gòu)成
也就是需要_0x23a392和_0x5e8b26這個(gè)兩個(gè)關(guān)鍵參數(shù),_0x23a392來自arg1的方法生成,它們都是有_0x55f3這同一個(gè)方法,所以我們的思路就清晰了。
我們先看看_0x55f3這個(gè)方法,并且做一些調(diào)試,可以發(fā)現(xiàn)_0x55f3通過傳入的參數(shù)不同使用不同的方法,有些類似于控制流平坦化。
知識(shí)點(diǎn)2:控制流平坦化
直接上圖
首先_0x5e8b26這個(gè)參數(shù)我們多次調(diào)試后發(fā)現(xiàn)是個(gè)變量,可以先確定,"3000176000856006061501533003690027800375",當(dāng)然我們也可以直接搜索_0x5e8b26
而我們獲取到_0x23a392和_0x5e8b26之后進(jìn)行加密的方法如下
大致的加密就是如上這樣,因?yàn)檎w代碼量也不大,可以直接改寫或者使用python加載Js都行。
4. 總結(jié)思路
這次的案例主要是可以學(xué)習(xí)到兩點(diǎn),第一點(diǎn)就是我們懂得有些網(wǎng)站會(huì)進(jìn)行前端反調(diào)試,手段之一就是會(huì)檢測(cè)開發(fā)者工具是不是打開,而且如果我們把代碼拿到本地,竟然還會(huì)檢測(cè)本地代碼是否是展開的?第二點(diǎn)我們需要習(xí)慣這種代碼混淆的方式,有些網(wǎng)站會(huì)用_0xxxx等無意義的符號(hào)進(jìn)行混淆,以及使用16進(jìn)制來做混淆惡心我們,我們想要還原的話直接把代碼放到Console里面執(zhí)行一下就可以了,因?yàn)镴s也能讀取原始的16進(jìn)制碼。
代碼實(shí)戰(zhàn)
有了上面這個(gè)分析流程,我們就可以開始Coding了,以下是acw_sc__v2加密的流程。
獲取arg1參數(shù)的代碼
獲取arg2參數(shù)的代碼
測(cè)試的代碼,先訪問官網(wǎng)動(dòng)態(tài)獲取Cookie再在請(qǐng)求頭的Header中加入這個(gè)acw_sc__v2參數(shù)去重載URL訪問官網(wǎng)。
復(fù)習(xí)要點(diǎn)
從這個(gè)復(fù)習(xí)的案例我們可以總結(jié)下思路:
總結(jié)
以上是生活随笔為你收集整理的2019年末逆向复习系列之努比亚Cookie生成逆向分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年末逆向复习系列之淘宝M站Sig
- 下一篇: 2019年末逆向复习系列之今日头条WEB