攻防世界-mobile-easy-app詳解

序言

這道題網上很多分析,但是分析的都是arm版本的,我選了arm64的來分析,arm64相比arm難度高一些,因為arm64編譯器搞了inline優化,看起來略抽象

分析

這道題邏輯很簡單,輸入flag然后一個check函數驗證,check函數是c層的,但是arm32和arm64差別很大,給大家瞄一眼,先32后64

可以看到,32位的邏輯非常清晰,拿到char*之后,弄成std::string,之后sub_9670函數對比是否是flag{開頭,往后CheckM函數把flag{xxx}中的xxx的左16和右16組合在一起,形成一個32字節的字符串,之后check1進行一些簡單的邏輯運算,再往后的encry是一個tea,之后是一個魔改的base64,就完事,邏輯很簡單,但是到了arm64,就很難看了?

說說主要的區別吧,首先是內聯了很多函數,可以看到sub_9670已經沒了,encry函數也沒了,代碼的復雜度提高了很多,還有就是,函數的返回值不按套路出牌,不放在x0寄存器中,不知道放在哪里,得去動態看才知道,比如check1之后的返回值,arm32中一看就知道是指針接受了返回值,但在arm64中莫名其妙放在了一個其他地方。

string內存結構問題問題

接下來說說,是怎么分析解決arm64的,首先,經過看這個so的代碼以及一些搜索,發現string的內存結構為,string的大小為3個dq(8個字節),24字節,如果字符串小于0x17,那么首字節存放字符串長度乘以2,第二個字節開始放字符串內容;如果是長字符串,那么第一個dq放的是容量,并且這個容量會是奇數,也就是&&1會=1;編譯器也是通過這個標志位判斷是長字符串還是短字符串,第二個dq放的是字符串的真實長度,第三個dq放的是一個char*,指向真實的字符串;另外一個關于string的問題是,string的很多內部細節也被inline出來了,比如動態擴容,這部分的特征是,會出現一個grow_by_函數,這個函數執行擴容的細節,細節不說了,緊跟這個grow_by_函數后,會看到設置字符串長度的代碼,根據這兩個特征就能知道實在動態擴容了;

參數亂放問題

函數返回值不是放在x0,會放在莫名奇妙的地方,棧上的某個地方,這一塊我采用的解決辦法是用frida的stalker trace來分析,非常爽,文末會附上trace腳本

題目其他的一些細節

tea的秘鑰是so中的init_array的一個函數設置的,base64的表是在jni_onload中設置的
其余并沒有什么特別之處了,這里著重想推薦兩個好用的技巧

兩個技巧
stalker trace

根據yang神首創,經過奮飛小改,之后我在改一點,已經能用了,腳本主要功能是從給定的地址開始trace,trace從這個地址開始后的size長度的代碼,會把執行完每一條匯編之后的影響打印出來,寄存器變化,內存的變化,以及內存中的字符串或者u64打印出來,文末也會附上trace check函數后的效果,大體是這樣

?

z3

z3是一個強大的約束求解器,一些瑣碎的邏輯用z3比較好求出來,不然的話得人工取反推實現,這里用來解決check1中的邏輯,我們只需要按照正向邏輯按照z3的api寫出約束條件,在調用求解器求解,即可得出輸入

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14614.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

改進rust代碼的35種具體方法-類型(十八)-不要驚慌

上一篇文章 它看起來非常復雜,這就是為什么它貼合的塑料蓋上用大號友好字母印上“不要恐慌”的原因之一。——道格拉斯亞當斯 此項目的標題將更準確地描述為更喜歡返回Result而不是使用panic!(但不要驚慌更吸引人)。 Rust的panic機制主要是為…

算法入門----小話算法(1)

下面就首先從一些數學問題入手。 Q1&#xff1a; 如何證明時間復雜度O(logN) < O(N) < O(NlogN) < O(N2) < O(2N) < O(N!) < O(NN)? A&#xff1a; 如果一個以整數為參數的不等式不能很容易看出不等的關系&#xff0c;那么最好用圖示或者數學歸納法。 很顯…

Python3 筆記:sort() 和 sorted() 的區別

1、sort() 可以對列表中的元素進行排序&#xff0c;會改變原列表&#xff0c;之前的順序不復存在。 list.sort&#xff08;key&#xff0c; reverse None&#xff09; key&#xff1a;默認值是None&#xff0c;可指定項目進行排序&#xff0c;此參數可省略。 reverse&#…

rmxprt轉換的3D模型只有一半?---模大獅模型網

在3D建模和渲染的工作流程中&#xff0c;我們經常需要用到各種轉換工具來兼容不同平臺或軟件之間的模型格式。rmxprt(或其他類似的模型轉換工具)就是其中的一種&#xff0c;它能夠將模型從一種格式轉換為另一種格式。然而&#xff0c;有時在轉換過程中可能會遇到一些問題&#…

微服務雪崩問題、Sentinel(請求限流、線程隔離、服務熔斷)、Seata分布式事務

文章目錄 前言一、微服務保護二、Sentinel2.1 微服務整合2.2 簇點鏈路2.3 請求限流2.4 線程隔離2.5 服務熔斷 三、分布式事務3.1 Seata3.1.1 Seata架構3.1.2 部署TC服務3.1.3 微服務集成Seata 3.2 XA模式3.3 AT模式 前言 微服務之間為什么會雪崩&#xff1f;怎么解決雪崩問題&…

MySQL存儲過程淺析

存儲過程 定義&#xff1a; 存儲過程是一組為了完成特定功能的SQL語句&#xff0c;是由一些SQL語句組成的代碼塊&#xff0c;這些代碼塊像方法一樣實現一些功能&#xff08;對單表或多表的增刪改查&#xff09;&#xff0c;然后給代碼塊起一個名字&#xff0c;用到的時候再調用…

Oracle體系結構初探:數據庫啟動與停止

往期內容 參數管理 控制文件添加 啟動 在啟動Oracle數據庫時&#xff0c;我們一般會使用如下命令&#xff1a; startup 雖然命令只有一個&#xff0c;但其中卻是經歷了3個階段&#xff0c;從下面執行 startup 命令返回也可以看出來。 總結為3個階段&#xff1a; nomount&…

ubuntu下python導入.so庫

ubuntu下python導入.so庫 文章目錄 ubuntu下python導入.so庫1. 什么是.so文件&#xff1f;2. 使用python腳本編譯.so庫文件Reference 最近遇到了python導入c編譯的 .so庫的問題&#xff0c;發覺挺有意思&#xff0c;于是寫下這篇blog以作記錄。 1. 什么是.so文件&#xff1f; …

【簡單介紹下深度神經網絡】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

句柄降權繞過CallBacks檢查

看到前輩們相關的文章&#xff0c;不太明白什么是句柄降權&#xff0c;于是專門去學習一下&#xff0c;過程有一點波折。 句柄降權 什么是句柄 當一個進程利用名稱來創建或打開一個對象時&#xff0c;將獲得一個句柄&#xff0c;該句柄指向所創建或打開的對象。以后&#xf…

什么是DNS緩存投毒攻擊,有什么防護措施

隨著企業組織數字化步伐的加快&#xff0c;域名系統&#xff08;DNS&#xff09;作為互聯網基礎設施的關鍵組成部分&#xff0c;其安全性愈發受到重視。然而&#xff0c;近年來頻繁發生的針對DNS的攻擊事件&#xff0c;已經成為企業組織數字化發展中的一個嚴重問題。而在目前各…

go string 實現

在go中string是不可變的&#xff0c;這意味著對string發生改變的操作實際上都是通過分配新的string去實現的 在string內存分配上&#xff0c;對于小對象分配到棧&#xff0c;大對象分配到堆中 string在go中的結構其實很簡單&#xff0c;就是一個指向實際數據的指針以及字符串…

用于與 HTTP 服務器通信的函數

用于與 HTTP 服務器通信的函數 Plant Simulation 提供了許多使用 HTTP 協議與 HTTP 服務器通信的函數。可使用這些函數來發送 HTTP 請求、發送數據和從 HTTP 響應中接收數據&#xff0c;以及在 HTTP 服務器上創建和刪除資源&#xff1a; httpGetRequest 發送 GET 請求。請求…

在 Visual Studio 2022 (VS2022) 中刪除 Git 分支的步驟如下

git branch -r PS \MauiApp1> git push origin --delete “20240523備份” git push origin --delete “20240523備份”

PCL 常用小知識

文章目錄 一、時間計算二、實現類似`pcl::PointCloud::Ptr`和`pcl::PointCloud`的兩個類相互轉換三、查找點云的x,y,z的極值四、知道需要保存點的索引,從原點云中拷貝點到新點云五、從點云里刪除和添加點六、對點云進行全局或局部變換七、鏈接兩個點云字段(兩點云大小必須相…

若依 ruoyi-vue 用戶賬號前后端參數校驗密碼 手機號 郵箱

前端 <el-dialog :title"title" :visible.sync"open" width"800px" append-to-body><el-form ref"form" :model"form" :rules"rules" label-width"120px"><el-row><el-col :span…

Vue3骨架屏(Skeleton)

效果如下圖&#xff1a;在線預覽 APIs 參數說明類型默認值必傳animated是否展示動畫效果booleantruefalsebutton是否使用按鈕占位圖boolean | SkeletonButtonPropsfalsefalseavatar是否顯示頭像占位圖boolean | SkeletonAvatarPropsfalsefalseinput是否使用輸入框占位圖boolea…

SOLIDWORKS二次開發服務商 慧德敏學

SOLIDWORKS是一套三維設計軟件, 采用特征建模、變量化驅動可方便地實現三維建模、裝配和生成工程圖。SOLIDWORKS軟件本身所具有的交互方式, 可以使用戶對已生成模型的尺寸、幾何輪廓和相互約束關系隨時進行修改, 而不需要編程。但要實現設計意義上的變量化繪圖和系列化設計, 需…

java-查詢字符串當中是否包含中文

文章目錄 前言java-查詢字符串當中是否包含中文 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的話&#xff0c;那歡迎常來啊…

軟考系統架構師一些知識點記錄-1

個人隨筆 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 引言 準備去參加軟考的考試&#xff0c;但對一些概念掌握的還不夠&#xff0c;借此機會&#xff0c;整理記錄一二&#xff0c;便于自己理解掌握。 知識范圍 感覺不夠清晰的部分主要是第三篇和第四篇的部分。…