-1

スタック バッファ オーバーフローを研究していて、考えさせられるものを見ました。まず、オペレーティング システムは、カーネル2.6.20ASLR が無効になっているDamn Vulnerable Linuxです。

実際のところ、C プログラム内で exec 関数を呼び出すと、ヒープとスタックのメモリがゼロになり、失われることがわかっていました。しかし、ヒープにバッファーを割り当て (malloc)、そのバッファーへのポインターを exec 関数で実行されるプログラムに引数として渡すと、バッファー内 (ヒープ内) のデータがスタックに保存されます。したがって、exec の最後に、スタックに (以前はヒープにあった) バッファーがあります。わかりやすくするために、次の例を示します。

Program: bingo

#include <stdlib.h>

int main(int argc,char* argv[]){
    int i;
    char *buffer=malloc(600);
    for (i=0;i<600;i++){
         buffer[i]='A';
    }
    buffer[600-1]=0;
    execl("./test","test",buffer,0);

    free(buffer);
    return 0;
}

そしてテストは簡単なプログラムになります。

Program: test

#include <stdlib.h>

int main(int argc,char* argv[]){
    printf("Hello world\n");        

    return 0;
}

ここで、GDB を使用してビンゴ プログラムをデバッグすると、ヒープに置かれたバッファーの内容 (すべての As) が、execl 関数の実行中に実際にスタックにコピーされることがわかります。したがって、プログラムの実行の最後にヒープはゼロになりますが、バッファの内容は完全にスタックにコピーされます。私の説明は、このようにしてバッファの内容が実行されたプログラム(テスト)で利用できるようになるため、これが起こるということです。この動作が正常かどうかを知りたいだけです。私の疑問は、execl関数を呼び出すときに、実際に実行されたプログラム(テスト)への引数としてポインターを渡すことでした。バッファはポインタだからです。だから私の(おそらくばかげた)質問は、ポインタだけが実行されたプログラムに渡されるべきではなく、ポインタが指すコンテンツも渡されるべきではないのですか?

ありがとうございました

4

1 に答える 1

3

バッファがスタックにコピーされる理由は、./test でパラメータ argv[1] として渡されるためです。buffer は、ビンゴのメモリ位置を参照する単なる変数です。プロセスが終了すると、ヒープ割り当ては保持されません。

0xfff123注:ビンゴプロセスのメモリ内のバッファ参照を想定してください。これは仮想 (プロセス固有の) アドレスです。0xffff123./test にマップされていない場合もあります。したがって、ポインタを渡して0xfff123も、あなたの考えが保証されるわけではありません。

が正常に呼び出された後execl、ビンゴはその時点で終了し、プロセスに関連付けられているすべてのメモリが失われ、 free(buffer)実行されません。

回答: いいえ。プロセス ヒープの割り当ては、プロセス間で持続しません。共有メモリ オブジェクトはカーネルで永続的ですが、malloc呼び出しの結果はそうではありません。

あなたの混乱のすべてがどこにあるのかはわかりませんが、これが私の最善の推測です.

相対アドレス指定の例:

プロセスはすべて0x00000000(32 ビットの) アドレスを持っています。カーネルがすべてのプロセスを同じ物理アドレスにマップした場合、各プロセスは共有します0x0000000 。これは物理的に起こり得ません。カーネルは、仮想アドレス ( 0x0000000) を のような実際の物理アドレスに変更します0x3535fffa。したがって、私のプロセスのポインターは仮想に「向けられています」0x00000000が、これは実際には0x3535fffa.

つまり、プロセス間でヒープ ポインターを直接渡すことはできません。うまくいきません。私のポインター0x3535fffaは、あなたが参照していた場所とは異なる物理アドレスになります0x3535fffa

execl は、AAAAA を ./test メモリ内の新しいバッファにコピーするだけです。

于 2013-10-07T16:13:55.953 に答える