日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

ACTF flutter逆向学习

發布時間:2023/12/31 windows 35 coder
生活随笔 收集整理的這篇文章主要介紹了 ACTF flutter逆向学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考了許多大佬的博客,在此特別誠摯感謝oacia大佬和其他大佬的博客和指導!

1.flutter和apk基礎結構介紹

首先下載附件,是一個apk文件,用jadx打開

可以看見flutter字樣,而flutter是一種目前比較流行的android框架,很多app都是用的該框架構建,而該原生框架是建立在app的native層

Android的系統架構采用了分層架構的思想。從下往上依次分為Linux內核、硬件抽象層(HAL)、系統Native庫和Android運行時環境、Java框架層以及應用層這5層架構,其中每一層都包含大量的子模塊或子系統

而平時我們接觸到的都是應用層和Java框架層,包括用Jadx對apk進行逆向時也只是在逆向Java層的邏輯。如果想要逆向native層,就需要對android進行解包
apk本身是一個包,壓縮了運行時的依賴、配置文件以及native庫,也就是.so,將apk文件后綴名修改成.zip后,即可解壓查看這些文件

也可以使用androidkiller這個工具對apk進行分析、修改

最基礎的app配置文件放在AndroidManifest.xml,這個文件里面存放的有app的很多配置,如該題的配置情況如下,可以在這個文件里面看到該應用的包名,名稱、SDK的版本等等信息,這些信息在app取證里面很有用,對之后的動態調試SO層也有很大幫助。

<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="33" android:compileSdkVersionCodename="13" package="com.example.flutter_application_1" platformBuildVersionCode="33" platformBuildVersionName="13">
<application android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:icon="@mipmap/ic_launcher" android:label="flutter_application_1" android:name="android.app.Application">
  <activity android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" android:name="com.example.flutter_application_1.MainActivity" android:theme="@style/LaunchTheme" android:windowSoftInputMode="adjustResize">
    <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme"/>
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
          <category android:name="android.intent.category.LAUNCHER"/>
          </intent-filter>
          </activity>
            <meta-data android:name="flutterEmbedding" android:value="2"/>
              <uses-library android:name="androidx.window.extensions" android:required="false"/>
                <uses-library android:name="androidx.window.sidecar" android:required="false"/>
                </application>
                </manifest>

至于其他的文件夾,大家可以自行查閱,這里就不一一說明。

而native層的.so文件就放在lib的幾個文件夾里面

這三個文件夾分別代表了不同架構的.so文件。我們如果想用真機調試.so文件,那么就要用真機對應的架構,不能亂用。

2.blutter安裝以及使用

接下來把lib文件進行解包,因為flutter使用的是dart語言,并且采用了dartVM的方法進行拍攝快照,所以我們現在要使用一些工具對.so文件進行快照解析,市面上對flutter的逆向工具都是這個原理。
但是有一個問題,dart快照是可以更改的,隨著DartSdk版本的更新,reflutter和flutter逆向助手已經停止更新,這次的這個題flutterSDK過高,兩個工具都無法破解,于是找到了blutter這個工具
官方地址:
GitHub - worawit/blutter: Flutter Mobile Application Reverse Engineering Tool
用git把blutter.py拉進kali里面(如果拉不進就直接到GitHub上下zip解壓就行),然后安裝依賴。

sudo apt install python3-pyelftools python3-requests git cmake ninja-build
build-essential pkg-config libicu-dev libcapstone-dev

若報錯如下

說明你該更新你的apt源

sudo apt-get update

下載完成情況如圖

接下來就可以用這個工具了,將解壓后的app放進虛擬機,在blutter目錄下運行.py文件,注意有兩個參數,前一個參數是.so文件所在的其中一個目錄,后一個參數是結果輸出目錄

若成功會解析稍微長一點的時間,耐心等待即可,如果有下圖結果即為解析完成

完成后在輸出目錄會有五個文件和文件夾

按照作者的說法,分別對應的是
pp.txt:在對象池里面的所有dart對象(dart采用了對象池的設計模式),這里面可以查看很多對象池變量的偏移地址

objs.txt:對象池中對象的完整(嵌套)轉儲,在這里我理解成對象池里面的方法和相應的偏移量
blutter_frida.js:這個是用于對該flutter程序hook的js代碼,應用在frida這個工具里面(接下來會講到)
ida_script:這個文件夾裝的是.so文件的符號表還原腳本,因為dart語言是依靠偏移量識別函數的,所以也能依靠偏移量還原函數
asm:對dart語言的反編譯結果,里面有很多dart源代碼的對應偏移

3.動態調試flutter程序

接下來就是利用frida工具hook插樁以及動態調試破解該程序了
環境:具有python環境的win10系統、kali系統
設備:pixel3(需要root)
重點:必須是歐版,如果不是歐版OEM無法打開,不可能刷的了機
具體root過程參考https://sspai.com/post/76276
工具:adb調試橋、IDA7.7工具

3.1.下載adb

https://blog.csdn.net/x2584179909/article/details/108319973

3.2.運行IDA

注意,在此之前需要將chall.apk修改成可調試狀態
具體方法為利用androidkiller打開程序->在AndroidManifest.xml里面第二行插入

android:debuggable="true"

如果程序SDK版本比較老,這樣就可以,但是這個程序的targetSdkVersion是33,是高版本,簽名會出問題,所以在apktool.xml改成27或者28即可

兩處改好后就可以進行編譯,得到新的程序。

完成后即可安裝到手機上

adb install chall_killer.apk

查看自己的手機是什么架構可以用下列代碼

adb shell getprop ro.product.cpu.abi

在ida的下圖文件夾內找到android_server64(我的真機架構是arm64位的)

連接手機(手機上打開USB調試),打開終端,利用adb程序在手機上下載chall.apk,安裝完成后把之前找到的server文件push到手機里執行

adb push android_server64 /data/local/tmp/as
adb shell
su #加載手機root權限
cd /data/local/tmp/
chmod 777 as #給server文件可讀可寫可執行權限
./as -p 12345 #用12345端口運行server

如果運行成功會有一個正在監聽的提示,說明這個命令端已經成為了server端監聽了

接下來重新開啟一個命令行,adb轉發端口

adb forward tcp:12345 tcp:12345

保持收發端口一致后啟動ida,將libapp.so放進ida

用剛才blutter解析得到的addName.py還原符號表

得到了符號表之后,查看解析的asm里面的main.dart,查找主程序里面的函數

在flutter官網查找四個函數的含義均為dart的API
表單交互 (Forms)
或者可以在這篇博客上找到
Flutter基建 - 按鈕全解析 - 掘金
onChanged():這個API在刪除或插入文本的時候的回調函數
onSubmitted():當用戶完成文本輸入并按下鍵盤上的“完成”按鈕時的回調函數
onLongPressed():在屏幕上保持了一段時間
onTap():用戶點擊事件完成(點擊提交按鈕時)
現在查看我們的程序,可以看見這個程序的窗口組成,而最重要的應該是提交按鈕,對應的也就是onTap()回調函數所做的

所以直接過濾器查找這個函數(也可以直接用之前在main.dart里面找到的函數地址)

回調函數在0xE03C4處

之后我們查看程序發現有256這個變量

再加上這里很明顯的RC4加密流程

可以大概得知這是一個RC4加密。

3.3.frida工具hook key值

接下來需要用到frida工具,frida是一款基于python + java 的hook框架,可運行在android、ios、linux、win、osx等各平臺,主要使用動態二進制插樁技術
安裝部分可以看這里
frida安裝正確流程
上面步驟中用blutter解析快照時,工具自動幫我們寫了一個插樁腳本,叫做blutter_frida.js,只需要在下圖所示部分修改成上面有RC4加密的函數地址,即可hook出密文

改完之后使用frida加載這個js腳本

frida -U -f com.example.flutter_application_1 -l blutter_frida.js

隨便輸入點什么執行程序即可hook得到密文

3.4.動態調試部分

現在可以調試一下我們的apk應用程序
首先打開應用debug模式,如果上面的androidkiller如果不行,可以用面具開,具體流程如下圖

adb shell
su
magisk resetprop ro.secure 0
magisk resetprop ro.debuggable 1
getprop ro.debuggable #如果回顯為1則已經開啟
stop
start #上面兩步重啟手機

這個時候下載monitor(DDMS)用于觀察程序進程是否開啟(如果是真機可能不需要這一步)

打開monitor.bat,可以看見設備上的進程

這個時候掛起程序

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8639

運行結果如下圖

如果有報錯 致命錯誤:無法附加到目標 VM。

那可能是端口搞錯了,這里要填寫的是應用程序的端口,而不是adb運行server的端口。
運行成功的話monitor里面程序那行進程欄會顯示為綠色

接下來進行調試,調試設置如下圖

設置完成點擊Attach to process...進行附加程序調試,附加我們的程序即可

現在先找密鑰,而密鑰是RC4加密的異或操作下的變量,我們把斷點下在異或的指令上

f9斷到這個地方之后可以看見X2變量是有賦值的,我們利用trace跟蹤該變量,并將值都打印出來

import idc
print(idc.ger_reg_value('X2'),',',end='')

此處點擊運行直接跳過,跳過后發現手機上能夠輸入了,這個時候輸入字符(字符個數可以往前看用frida工具hook出來的key數量)然后點√
感謝oacia師傅的提示,如果不點√就f9不會有輸入,程序會一直卡在第一個異或的密鑰上

上圖是第一個異或的密鑰,但是如果檢查下來發現密文和這個密鑰異或之后得不到輸入,重新檢查一下會發現還要異或一個0xff即可

addr = [14, 14, 68, 80, 29, 201, 241, 46, 197, 208, 123, 79, 187, 55, 234, 104, 40, 117, 133, 12, 67, 137, 91, 31, 136,
        177, 64, 234, 24, 27, 26, 214, 122, 217]
key = [184,
       132,
       137,
       215,
       146,
       65,
       86,
       157,
       123,
       100,
       179,
       131,
       112,
       170,
       97,
       210,
       163,
       179,
       17,
       171,
       245,
       30,
       194,
       144,
       37,
       41,
       235,
       121,
       146,
       210,
       174,
       92,
       204,
       22
      ]
flag = ""
for i in range(len(addr)):
    flag += chr(addr[i] ^ 0xff ^ key[i])

print(flag)

4.本文知識點來源

[原創]flutter逆向 ACTF native app-Android安全-看雪-安全社區|安全招聘|kanxue.com
認識 Flutter 是什么?
403 Forbidden
一日一技|如何 root 一臺 Pixel 手機 - 少數派
windows下載安裝adb(極其簡單)-CSDN博客
frida安裝正確流程
Flutter基建 - 按鈕全解析 - 掘金
表單交互 (Forms)

總結

以上是生活随笔為你收集整理的ACTF flutter逆向学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。