1

私は面接の準備をしていて、そこで働く友人からこのコードのセクションを渡され、セキュリティについて尋ねられる質問の 1 つに対する良い準備になると言っています。私は物事のこの側面についてあまり知りませんが、少し学びたいと思っています。

これはコードです:

#include <stdio.h>
#include <string.h>
#include <limits.h>
    int main(int argc, char *argv[]){

        FILE *inputFile;
        char filename[128];
        char strings[USHRT_MAX][40];
        unsigned short c = 0;

        strcpy(filename, argv[1]);
        inputFile = fopen (filename, "r");

        if (inputFile == NULL) {
            perror("Error: ");
            return(-1);
        }

        while (fscanf(inputFile, "%s", strings[c++] ) != EOF);
        fclose(inputFile);
    return(0);
    }

バッファをオーバーフローできるという脆弱性があることは知っていますが、それは彼が私に言ったことですが、それ以上は行き詰まっています。このコードが脆弱である理由を誰か説明できますか?

4

2 に答える 2

4

まず、この本を読むことをお勧めします。この本は、エクスプロイトがどのように機能するかを説明するのに役立ちます。Linux VMが付属しており、コードの悪用を試すことができます。(参考までに、私はこの本とはまったく関係がありません。ただそれが良かったと思っただけです。)

次に、コメントでフィリップの質問に答えたいと思いましmain()た。プログラムの実行時に発生する最後のことは、からの戻りではありません。たとえば、returnfrommain()を通り過ぎて、たくさんの興味深いことが起こっているのを見ることができます。

Breakpoint 2, main (argc=1, argv=0x7fff5fbff320) at main.c:6
6       return 0;
(gdb) stepi
0x0000000100000f17  6       return 0;
(gdb)
0x0000000100000f1a  6       return 0;
(gdb)
0x0000000100000f1d  6       return 0;
(gdb)
0x0000000100000f20  6       return 0;
(gdb)
0x0000000100000f24  6       return 0;
(gdb)
Cannot access memory at address 0x0
0x0000000100000f25 in main (argc=1, argv=0x7fff5fbff310) at main.c:6
6       return 0;
(gdb)
Cannot access memory at address 0x0
0x0000000100000ee4 in start ()
(gdb)
Cannot access memory at address 0x0
0x0000000100000ee6 in start ()
(gdb)
0x0000000100000f26 in dyld_stub_exit ()
(gdb)
0x0000000100000f44 in dyld_stub_puts ()
(gdb)
0x0000000100000f49 in dyld_stub_puts ()
(gdb)
0x0000000100000f34 in dyld_stub_puts ()
(gdb)
0x0000000100000f3b in dyld_stub_puts ()
(gdb)
0x0000000100000f3d in dyld_stub_puts ()
(gdb)
0x00007fff83b396a0 in dyld_stub_binder ()
(gdb)
0x00007fff83b396a1 in dyld_stub_binder ()
(gdb)
0x00007fff83b396a4 in dyld_stub_binder ()
(gdb)
0x00007fff83b396ab in dyld_stub_binder ()
(gdb)
0x00007fff83b396af in dyld_stub_binder ()
(gdb)
0x00007fff83b396b4 in dyld_stub_binder ()
(gdb)
0x00007fff83b396b9 in dyld_stub_binder ()
(gdb)
0x00007fff83b396be in dyld_stub_binder ()
(gdb)
0x00007fff83b396c3 in dyld_stub_binder ()
(gdb)
0x00007fff83b396c8 in dyld_stub_binder ()
(gdb)

...など。

于 2013-03-19T21:44:46.387 に答える
0

バッファで遊ぶ前に、必ず境界チェックを行います。

#define MAX_BUFFER_SIZE 128    
int main(int argc, char *argv[]){

        FILE *inputFile;
        char filename[MAX_BUFFER_SIZE];
        .
        .
        if(strlen(argv[1]) >= MAX_BUFFER_SIZE) // Bound check
        {
            /* Do something appropriate, such as throw an error. */
        }
        else {
        strcpy(filename, argv[1]);
        .
        .
}

面接の参考になるかもしれません

于 2013-03-19T22:00:40.963 に答える