# Ret2ret & Reo2pop {{#include ../../../banners/hacktricks-training.md}} ## Ret2ret この技術の主な**目的**は、**スタック内の既存のポインタを悪用してASLRをバイパスしようとすること**です。 基本的に、スタックオーバーフローは通常文字列によって引き起こされ、**文字列はメモリ内の最後にヌルバイトで終わります**。これにより、スタック内に既に存在するポインタが指す場所を減らすことができます。したがって、スタックに`0xbfffffdd`が含まれている場合、このオーバーフローはそれを`0xbfffff00`に変えることができます(最後のゼロバイトに注意)。 そのアドレスがスタック内のシェルコードを指している場合、**`ret`命令にアドレスを追加することでそのアドレスにフローを到達させる**ことが可能です。 したがって、攻撃は次のようになります: - NOPスレッド - シェルコード - **`ret`へのアドレスでEIPからスタックを上書きする**(RETスレッド) - スタックのアドレスを指すようにするために文字列によって追加された0x00 [**このリンク**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c)を参照すると、脆弱なバイナリの例を見ることができ、[**こちら**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c)ではエクスプロイトを見ることができます。 ## Ret2pop **変更したくないスタック内の完璧なポインタを見つけた場合**(`ret2ret`では最終的な最下位バイトを`0x00`に変更します)、同じ`ret2ret`攻撃を実行できますが、**RETスレッドの長さは1短くする必要があります**(そのため、最終的な`0x00`が完璧なポインタの直前のデータを上書きします)、そして**RETスレッドの最後の**アドレスは**`pop ; ret`**を指す必要があります。\ このようにして、**完璧なポインタの前のデータがスタックから削除されます**(これは`0x00`によって影響を受けるデータです)し、**最終的な`ret`はスタック内の完璧なアドレスを指します**。 [**このリンク**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c)を参照すると、脆弱なバイナリの例を見ることができ、[**こちら**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c)ではエクスプロイトを見ることができます。 ## References - [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md) {{#include ../../../banners/hacktricks-training.md}}