<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Android爬蟲比賽 第一關解析

    VSole2023-01-14 11:11:54

    一、環境

    frida 12.8.20

    python 3.8.10

    jadx-gui-1.2.0

    fiddler

    二、實戰步驟

    1、安裝APP,來到第一關,翻頁時抓包。

    jadx打開APP ,根據page= 查找到 com.yuanrenxue.match2022.fragment.challenge.ChallengeOneFragment 類。

    此處有sign函數,很大幾率為翻頁調用函數,hook當前函數查看 this.page 和 oooOO0O.OooO00o().longValue()的值:

    function hook_ChallengeOneFragment(){    //訪問內部類函數    Java.perform(function(){          var InnerClasses = Java.use("com.yuanrenxue.match2022.fragment.challenge.ChallengeOneFragment");        // console.log(InnerClasses);        InnerClasses.lambda$initListeners$2.overload('o00O000.OooOO0O').implementation = function(age){            console.log("this.page.value:",this.page.value);//查看page的值            console.log("age.OooO00o().longValue() :",age.OooO00o().longValue());//查看值            console.log("age:",age)//查看參數              var res = this.lambda$initListeners$2(age)//運行函數            console.log("res:",res,"type:",res.$className);//返回值和返回值類型              var Map = Java.use('retrofit2.adapter.rxjava2.BodyObservable');//根據返回值類型創建對象            var NewP = Java.cast(res, Map); //將返回值轉成相應類型            console.log("NewP:",NewP.toString());//輸出返回值            return res;        };      });}
    

    分析代碼:

    StringBuilder 為可變字符串。

    根據代碼得出 sb的值為頁碼+時間戳 "page=21652931584"。

    再次hook Sign函數查看參數和返回值并與fiddler對比。

    function hook_SignClass(){    //訪問內部類函數    Java.perform(function(){          // 訪問內部類時,在當前類后加$符號,后跟內部類名        var InnerClasses = Java.use("com.yuanrenxue.match2022.security.Sign");        // console.log(InnerClasses);        InnerClasses.sign.overload('[B').implementation = function(arge1){            console.log("參數和參數類型:",arge1,arge1.$className);//數組類型一般會返回null            console.log("數組類型轉碼:",JSON.stringify(arge1));//數組類型可嘗試使用json解析            var res = this.sign(arge1);//運行函數            // return true;            console.log("res",res);//返回值            return res;        };      });}
    

    此時已經可以斷定,這個Sign就是翻頁的加密函數 。

    根據jadx反匯編代碼:

    new Sign().sign(sb.toString().getBytes(StandardCharsets.UTF_8))
    

    我們用python實現一下。

    time_ = '1652932157's = 'page=1' + time_print("s:",s)bArr = [x for x in bytearray(s,'utf_8')]print("bArr:",bArr)  #s: page=11652932157#bArr: [112, 97, 103, 101, 61, 49, 49, 54, 53, 50, 57, 51, 50, 49, 53, 55]
    

    此時直接調用sign生成加密參數,抓取100頁的值相加得出flag:

    #!/usr/bin/env python# -*- coding: utf-8 -*-  import fridaimport requestsimport time  #發送接收frida_js信息def on_message(message, data):    if message['type'] == 'send':        print("[*] {0}".format(message['payload']))    else:        print(message)  js = open('hook.js', 'r', encoding='utf8').read()   #讀取frida腳本  session = frida.get_remote_device().attach('com.yuanrenxue.match2022')#根據包名啟動APP  script = session.create_script(js)script.on('message', on_message)script.load()#加載frida腳本    if __name__ == '__main__':      time_ = int(time.time())#獲取世家戳      header2 = {         'Accept-Language':'zh-CN,zh;q=0.8',         'User-Agent':'Mozilla/5.0 (Linux; U; Android 10; zh-cn; Mi9 Pro 5G Build/QKQ1.190825.002) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1',         'Content-Type':'application/x-www-form-urlencoded',         'Content-Length':'57',         'Host':'appmatch.yuanrenxue.com',         'Connection':'Keep-Alive',         'Accept-Encoding':'gzip',         'Cache-Control':'no-cache',    }    count = 0  #記數    for i in range(1,101):          s = f'page={i}' + str(time_)        bArr = [x for x in bytearray(s,'utf_8')]        res = script.exports.callsecretfunctionedy(bArr) #調用frida_js函數獲取加密參數          payload = {            'page': str(i),            'sign': res,            't': time_,        }          r = requests.post("https://appmatch.yuanrenxue.com/app1", data=payload, headers = header2, verify = False )          data = r.json()['data']        for v in data:            count += int(v['value'])      print("flag count:",count)
    var result;function callDYFun(bArr) { //定義導出函數    Java.perform(function () {        console.log("bArr:",bArr);        var ss = Java.use('com.yuanrenxue.match2022.security.Sign');        var str = Java.use("java.lang.String");        var res = str.$new(ss.$new().sign(bArr));        result = str.valueOf(res)        console.log("result:",result);      });    return result;//返回值給python}rpc.exports = {    callsecretfunctionedy: callDYFun,};
    

    類中有兩個函數一模一樣lambda$initListeners$2和lambda$initListeners$0 。

    經測試調用的是 lambda$initListeners$2。

    sign解析函數
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    首先使用jadx對apk進行逆向。?搜索關鍵字 QDSign,可以直接找到對應的類,可以看到參數經過加密得到。??進一步跟蹤,發現了c類中有如下三個so方法,還有3個loadlibrary,分別進行了hook,發現c-lib動態注冊了sign,sos動態注冊了s,沒有發現crypto有動態注冊。
    根據代碼得出 sb的值為頁碼+時間戳 "page=21652931584"。再次hook Sign函數查看參數和返回值并與fiddler對比。此時已經可以斷定,這個Sign就是翻頁的加密函數 。我們用python實現一下。此時直接調用sign生成加密參數,抓取100頁的值相加得出flag:#!
    無意中看到ch1ng師傅的文章覺得很有趣,不得不感嘆師傅太厲害了,但我一看那長篇的函數總覺得會有更騷的東西,所幸還真的有,借此機會就發出來一探究竟,同時也不得不感慨下RFC文檔的妙處,當然本文針對的技術也僅僅只是在流量層面上waf的繞過。Pre很神奇對吧,當然這不是終點,接下來我們就來一探究竟。前置這里簡單說一下師傅的思路部署與處理上傳war的servlet是?
    大廠基本為了程序的安全,會使用大量內聯SVC去調用系統函數,以此來保護程序的安全。如何實現SVC指令的IO重定向,成為最大的問題。內核態是當Linux需要處理文件,或者進行中斷IO等操作的時候就會進入內核態。當arm系列cpu發現svc指令的時候,就會陷入中斷,簡稱0x80中斷。
    Java命名和目錄接口是Java編程語言中接口的名稱( JNDI )。它是一個API(應用程序接口),與服務器一起工作,為開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口。 可以使用命名約定從數據庫獲取文件。JNDI為Java?戶提供了使?Java編碼語?在Java中搜索對象的?具。 簡單來說呢,JNDI相當與是Java里面的一個api,它可以通過命名來查找數據和對象。
    它通過解壓縮 APK 并應用一系列規則來檢測這些漏洞來做到這一點https://github.com/SUPERAndroidAnalyzer/super9、AndroBugs 框架是一種高效的 Android 漏洞掃描程序,可幫助開發人員或黑客發現 Android 應用程序中的潛在安全漏洞。它可以修改任何主進程的代碼,不管是用Java還是C/C++編寫的。
    下一代加密技術接口是微軟在 Windows 下實現的取代上一代加密應用程序接口的密碼服務接口。其目的是提供一種可擴展的方式以支持各種應用程序和未知的密碼算法,以便不同的算法、協議向操作系統注冊,并對應用程序提供統一的調用接口,應用程序無需改造即可支持對新算法的使用。研究了基于下一代加密技術接口在操作系統中注冊國密SM2、SM3 算法,完成解析和驗證國密 SM2 證書,實現了國密算法在系統中的注冊及
    APP協議分析心得
    2023-07-18 09:23:41
    對脫殼流程有不明白的可參考我之前寫的文章:[原創]ART環境下dex加載流程分析及frida dump dex方案。var magic_Hex = [0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00];var dex_path = "/data/data/" + apk_Name + "/" + dex_size + ".dex";
    也防止有人通過inlinehook 直接hook recv ,recvform,recvmsg 直接在收到數據包的時候被攔截和替換掉。
    關注一波,謝謝各位師傅感謝ch1e師傅幫忙總結ch1e‘blog:https://ch1e.gitee.io
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类