前言:
一直在群里聽別人說,某某公司招人,要高級的,要將某里的UA,某驗(yàn),某數(shù)這種級別的逆向問題玩弄于股掌之間才行。所以今天就看一下這個UA到底是個什么玩意。
我們將通過一個大數(shù)據(jù)網(wǎng)站的登錄接口,一步一步的把這個小東西找出來。
廢話不多說,直接開始吧~~
目標(biāo)網(wǎng)站:aHR0cHM6Ly93d3cubmV3cmFuay5jbi91c2VyL2xvZ2lu
正文:
打開目標(biāo)網(wǎng)址,選擇賬號登錄,會出現(xiàn)一個滑塊。
我們輸入錯誤的賬號和密碼,然后將滑塊劃到右端。會在調(diào)試工具中出現(xiàn)兩個請求。
我們點(diǎn)擊第一個網(wǎng)絡(luò)請求,從圖二中可以看到請求參數(shù)中,有一個n參數(shù)特別長。憑借我那么些許的直覺來看,這個n里面應(yīng)該包含了很多貓膩。那么接下來,我們來就追溯一下,這個參數(shù)是怎么生成的。
將鼠標(biāo)移至圖三紅色框位置,會顯示該請求的調(diào)用棧,可以看到有五處調(diào)用。一次點(diǎn)擊,然后打開js文件相應(yīng)位置打上斷點(diǎn)。類似于圖四所示。
再次滑動滑塊。當(dāng)鼠標(biāo)碰到滑塊的那一剎那,程序已經(jīng)被斷住了。可以看到上面黃色背景色的部分表示的是鼠標(biāo)事件。這個是后面某個函數(shù)的參數(shù),有興趣的同學(xué)可以自己研究下,我們這里主要找n參數(shù)。
那么,這里沒有n參數(shù),那么我們繼續(xù)跳到下一個斷點(diǎn)。
我們點(diǎn)擊繼續(xù)按鈕,這時鼠標(biāo)事件繼續(xù)執(zhí)行
我繼續(xù)跳到下一個斷點(diǎn),發(fā)現(xiàn)這里也沒有提到n的事,那就繼續(xù)到下一個斷點(diǎn)。
我們來到4067行,這里黃色背景部分給了我們很多提示信息。我們也可以看到紅色箭頭部分,好像是在給一個n的參數(shù)賦值,那么這個n是不是就我們找的n呢?
我們繼續(xù)點(diǎn)擊調(diào)試按鈕,來到下一個斷點(diǎn)處。我們從控制臺輸出參數(shù)t,發(fā)現(xiàn)t.data里就是我們在剛開始分析請求時遇到的參數(shù),n也位列其中。那么這個n是怎么生成的呢?
想必大家也已經(jīng)看到了,4566行通過邏輯表達(dá)式給參數(shù)n賦值。賦值的函數(shù)叫:me.__uab.getUA,對,這就是文章標(biāo)題里說的某里的UA。
我們跟進(jìn)去看一下這個到底是個什么東西。發(fā)現(xiàn)是e函數(shù)傳了兩個參數(shù),一個是數(shù)字:23;一個是一個o對象。繼續(xù)跟進(jìn)去看一下e函數(shù)長什么樣子
發(fā)現(xiàn)e是這個函數(shù),將這個函數(shù)整個拷貝出來,放到vscode里
好嘛, 一個函數(shù)一萬三千行。
這個函數(shù)里面有20多個case,他調(diào)用的另一個函數(shù)有40多個case。
其實(shí)這就是控制流平坦化。將本來按照邏輯執(zhí)行的代碼,改成switch..case的形式。從而阻礙了我們的逆向調(diào)試。
總結(jié):
本案例通過請求追溯的方式,一步步的找到加密函數(shù)位置,然后發(fā)現(xiàn)加密函數(shù)為一個經(jīng)過控制流平坦化后的函數(shù)。這也就是某里的UA難以搞定的原因。如果用同學(xué)想進(jìn)一步研究下如何解決這類問題,推薦去看“菜鳥學(xué)Python編程”的關(guān)于AST的文章。