8

質問は、実際には C のスタック オーバーフローに関するものです。私は一生やり遂げることができない割り当てを持っています。gdb のすべてを見てきましたが、それを理解することはできません。

質問は次のとおりです。

int i,n;

void confused()
{
    printf("who called me");
    exit(0);
}

void shell_call(char *c)
{
    printf(" ***Now calling \"%s\" shell command *** \n",c);
    system(c);
    exit(0);
}

void victim_func()
{
    int a[4];
    printf("[8]:%x\n", &a[8]);
    printf("Enter n: "); scanf("%d",&n);
    printf("Enter %d HEX Values \n",n);
    for(i=0;i<n;i++) scanf("%x",&a[i]);
    printf("Done reading junk numbers\n");
}

int main()
{
    printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
    printf("location of confused %x \n", confused);
    printf("location of shell_call %x \n", shell_call);
    victim_func();
    printf("Done, thank you\n");

}

わかりましたので、最初の質問を正しく取得することができました。これは、メイン パスで明示的に呼び出されていない 2 つの関数のいずれかを任意に呼び出すことです。ちなみに、これはプログラムを変更せずに実行中に行う必要があります。Nに設定してプログラムを実行することでこれを行いました。これにより7、フレームの関数ポインターが表示され、混乱したまたはのメモリアドレスでvictim_func書き込み、動作します。(私は 64 ビット マシンを使用しています。そのため、EBI ポインターの幅が 1 ではなく 2 int であるため、7 にする必要があります)a[7]shell_call

私の質問は次のとおりです。関数に渡される引数をどのように制御できshell_codeますか? すなわち。stringに を書くにはどうすればよいですかchar* c。全体のポイントは、プログラムのみを実行して、psなどの unix コマンドを実行することです。

EBI ポインタをpsの 16 進表現で記述し、引数リストをshell_callそれに設定することを考えましたが、うまくいきませんでした。argsvまた、引数を入力して、の引数リストをメインに設定しようとshell_callしましたarg_listが、どちらも機能しませんでした。

2番目のバージョンは機能するはずですが、新しいスタックフレームの引数リストを正しく設定していないと思います(関数ポインターの最初の部分であるため、 に書き込み、 and を書き込むことでそれをa[8]行いましたが、おそらくこれらは のパラメータであるため正しくありません。では、 のパラメータにアクセスするにはどうすればよいですか?0a[9]=736ca[10]=0000victim_funcshell_call

4

3 に答える 3

8

私はおそらくあなたのために宿題をするべきではありません。しかし、基本的に:

実行する文字列を格納するには、メモリ内のどこかに文字バッファーを取得する必要があります。明らかに、他の関数を呼び出すのと同じ方法でこれを行うことができます (つまり、テキストもスタックに置きます)。それを書き込んだ後、shell_code 関数がその引数を見つけると予想される場所のスタックに、それへのポインターを書き込む必要があります。

私がすべての作業を行わずにこれを理解する最善の方法は、スタック/メモリの内容を紙/ホワイトボードに書き留めることです。プログラム内から shell_code を普通に呼び出した場合の外観を書き留めます。次に、スタックが victum_func 内でどのように見えるかを書き留めて、「自然に」見えるようにするために変更する必要があるものを見つけます (もちろん、戻りアドレスのように「気にしない」ものもあることに注意してください)。

それが今日私から得られるチャリティーのすべてです!:-P

于 2008-11-13T03:56:37.030 に答える
2

SoapBox はすでに、ユーザーを正しい方向に導く素晴らしい仕事をしてくれました。

詳細については; http://www.skullsecurity.org/wiki/index.php/Example_4

于 2008-11-15T13:22:42.230 に答える
1

呼び出し元 ( ) のスタック フレームを操作し、オーバーフローしたエンドポイントのエピローグからmain()戻ると、メインによって呼び出された安定したスタックを見つけることができるように配置する必要があります。shell_call()victim_func()

そうすることで、被害者のスタックフレームのフレームポインタを破壊する必要があり、これは %ebp で によって復元されleaveます。

于 2008-11-15T13:06:06.913 に答える