web-dev-qa-db-ja.com

BOF-リークメモリを使用してsystem()のアドレスを特定する方法

32ビットでBOFとASLRのトレーニングをしています。私はこのようなプログラムを書きました:

int main(int argc, char **argv)
{
    char buffer[32];
    printf(argv[1]);
    gets(buffer);
    return 0;
}

書式文字列を使用すると、メインの戻りアドレスを取得できます:0xf7e19637 <=> __libc_start_main + 247。

しかし、今私は、Ret2LibCを実行するためのシステム関数のアドレスを見つけるために、このアドレスで何ができるかわかりません!

編集:私はこれを発見した後、これを発見しました フォーマット文字列のエクスプロイトを使用してlibcベースアドレスをリークする方法 これは同じプログラムであり、彼は私が望むようにそれをエクスプロイトしたいと考えています(彼はx86_64にいます)。しかし、私は彼がそのスクリプトをどのように行うか理解していません。

1
wammder

Libcバイナリを取得し、__libc_start_main+247から呼び出す関数までのオフセットをバイト単位で計算する必要があります。 ASLRは、モジュールのロード元のベースアドレスをランダム化しますが、モジュール自体の内部の要素間の内部オフセットをランダム化することはできません。次のコマンドを実行すると、gdbでこのオフセットを見つけることができます

print system - __libc_start_main+247

...プログラムの実行中。したがって、system ___libc_start_main+247を指定して検索するには、そのコマンドを実行して取得した値を追加するだけです。このオフセットはモジュールのバージョンとモジュールの構築方法に依存するため、システムによって異なる場合があることに注意してください。 「Ubuntu xxxxを実行する場合、オフセットはこれである必要があります」と大まかに推測するか、任意の読み取りプリミティブを使用して確認できます。

1
user25972