Categories
Tags
Alamofire Android AppStoreConnect AWS Bun C++ cAdvisor CFW Cloudflare Cloudflare Access Cloudflare KV Cloudflare Tunnel Cloudflare Workers D1 Deno DevContainer Discord Docker ECR ECS Edizon Emulator EmuMMC Fastlane Firestore Frida Ghidra Git GitHub GitHub Actions GitLab GPG Grafana HACGUI Heroku Homebrew Hono IDA Pro iOS IPSwitch Jailbreak Javascript JSON JWT LanPlay Linode macOS Mirakurun MongoDB NestJS NextJS Nintendo Nintendo Switch NodeJS PHP PostgreSQL Prisma Programming Prometheus Python React Realm RealmSwift Ruby Salmon Run Salmonia3+ Shogi Sideload Snap Splatoon Splatoon2 Splatoon3 SSH Stable Diffusion Starlight Swift Swift Package SwiftUI Switch TensorRT Turf War Typescript TypeScript Ubuntu Ubuntu Server VNC VPN VSCode Vue WARP Wireguard XCode Xcode yarn zsh 家電 横歩取り
610 words
3 minutes
Frida Playgroundで実践練習をする #02
Frida Playground
から実戦経験が積めます。
インストール用のIPAも配布されているのでSideloadlyでちゃちゃっとインストールしてしまいましょう。
Challenges
早速簡単な方から解いていきます。
適当にインストールしたせいでBundle IDがわからないので調べます。
$ frida-ps -Ua
PID Name Identifier
---- ---------------------- ------------------------
2069 AppStore com.apple.AppStore
2060 Nintendo Switch Online com.nintendo.znca
3130 Playground eu.nviso.fridaplayground
2033 Search com.apple.Spotlight
1993 Settings com.apple.Preferences
2039 Sileo org.coolstar.SileoStore
2068 palera1nLoader com.samiiau.loader
というわけでeu.nviso.fridaplayground
という値であることがわかりました。
2.1 Switch implementation (ObjC.implement)
ObjC.implement
を使ってボタンを押したときに本来呼ばれるlose()
に代えてwin()
を実行するというものです。
Objc.chooseSync
正解手ではないですがいろいろ解法を載せておきます。
function solve201() {
const method = VulnerableVault['- lose'];
Interceptor.attach(method.implementation, {
onEnter: function (args) {
const object = ObjC.chooseSync(VulnerableVault)[0];
object.win();
},
})
}
Vulnerable
method.implmentation
がそのメソッドの処理を持っているのでメソッドの処理自体を置き換えます。
なのでイメージとしては以下のような感じです。
function solve201() {
VulnerableVault['- lose'].implementation = VulnerableVault['- win'].implementation;
}
で、実際にこれは正しく動作します。
function solve201() {
const method = VulnerableVault['- lose'];
method.implementation = VulnerableVault['- win'].implementation;
}
値渡しではなく参照渡しになっているのでこちらの書き方でも大丈夫です。
Objc.implement
正攻法で解きます。
function solve201() {
const method = VulnerableVault['- lose'];
method.implementation = ObjC.implement(method, function (handle, selector) {
ObjC.Object(handle).win();
})
}
こちらであれば長いコードを書くことができます。
2.2 Switch implementation (Interceptor.replace)
使い方がいまいちわからないです。
さっぱりわからないので答えを見ました。
function solve202() {
const method = VulnerableVault["- lose"];
Interceptor.replace(method.implementation, new NativeCallback(function(instance, selector) {
ObjC.Object(instance).win();
}, 'void', ['pointer', 'pointer']));
}
NativeCallback
の使い方がいまいち分かりません。特に後半のポインターを指定しているのはなんですかこれ。
2.3 Hook exported function
isSecure
がTrueを返すように変更しろとのこと。
で、Hopper Disassemblerで調べてもisSecure
というメソッドはありません。
調べてみるとisSecureはiOS 2.0から実装されている標準ライブラリらしいです。
メソッドを読み込むには以下のコードを書きます。
const method = Module.findExportByName(null, "isSecure");
このメソッドが実行されたときの処理を書き換えたいので、
Interceptor.attach(method.implementation, {
onEnter: function (args) {
const object = ObjC.chooseSync(VulnerableVault)[0];
object.win();
},
})
まとめ
Frida Playgroundで実践練習をする #02
https://fuwari.vercel.app/posts/2023/11/frida_tutorial_02/