猿人學內部練習平臺1~3題

脱下长日的假面發表於2024-04-26

第1題. 無混淆js加密

抓包可以看到,有一個請求頭引數 safe 加密。
根據呼叫堆疊很容易找到加密引數位置:


可以看到,safe 是由固定字串 a = '9622' 加 時間戳,經base64編碼後,傳入 hex_md5 方法得到。
進入 hex_md5 ,直接複製 md5.js 到本地,呼叫 hex_md5 方法即可。(報window未定義,把那行及下方fetch行刪掉即可)

// md5.js 的內容
var a = '9622';
var timestamp = String(Date.parse(new Date()) / 1000);
var tokens = hex_md5(global.btoa(a + timestamp));
console.log(tokens)

第2題. 簡易動態js加密解析

首先刪除cookie中的sign:

然後注入hook_cookie程式碼,此處我選擇的是 v_jstools 外掛。(專案地址:https://github.com/cilame/v_jstools)

重新整理頁面,可以看到,成功斷到了生成點,檢視呼叫堆疊即可找到對應位置:


透過控制檯列印,可以看到,生成cookie的程式碼及結果格式如下:

此時可以右鍵該js檔案,選擇“替換內容”,然後將檔案中的var c = new Date()_$ob('0x2a'); 改為 var c = 1587102734000;

刪除cookies中的sign,重新整理頁面,即可得到1587102734000下的sign值:

第3題. js第六節實戰例題

本題主要考察cookie中的m生成。
根據上一題思路hook_cookie,發現hook不到m,這時可以透過如下選擇,讓其在每一個js檔案都斷住:

經一步步斷點除錯發現,3檔案是生成m引數的檔案,將其程式碼複製到本地並執行,發現會卡住,此時可使用本地瀏覽器環境除錯該js程式碼:
命令列執行 node --inspect-brk xx.js

然後在瀏覽器控制檯左上角會有個綠色的nodejs的圖示,點選即可開啟除錯:

開啟除錯後逐步除錯,看是哪行程式碼卡住的:
第一個卡住的地方是:

var j = g['updateCookie']();
if (!j) {
            g['setCookie'](['*'], 'counter', 0x1);
        } else if (j) {
            i = g['getCookie'](null, 'counter');
        }

本地環境程式碼 j 為false,執行了g['setCookie'](['*'], 'counter', 0x1); 而題目裡的程式碼 j 為true,執行了 i = g'getCookie';
因此原生代碼修改為 var j = true; 繼續本地執行程式碼,發現還是會卡住,命令列關掉調式模式並重啟(node --inspect-brk xx.js),繼續單步除錯,排查卡住的程式碼並對比瀏覽器環境;
如此迴圈往復;
最後一個卡住的程式碼位置在 return !a9['\x74\x65\x73' + '\x74'](a2);,該行程式碼利用正規表示式的查詢特性故意寫了一個查詢效率很低的正則導致卡住,重寫對應的方法即可:

RegExp.prototype.test = function(str) {
    // console.log('Hooked!');
    return true;
};

排除掉所有導致程式碼卡頓的點後,再次執行,程式碼即正常報錯,簡單補環境即可:

location那行報錯由於是重新整理頁面,因此可以直接把那行程式碼刪掉,另外也存在console.log的重寫需要處理,最終的補環境程式碼如下:

RegExp.prototype.test = function(str) {
    // console.log('Hooked!');
    return true;
};
document = {}
navigator = {}
h_log = console.log
// 3 檔案的js程式碼(排除檢測程式碼後的)
h_log(document.cookie)

輸出格式如下:

然後就可以透過python正則處理後呼叫。

相關文章