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,您可以尝试利用代码。(仅供参考,我与这本书没有任何关系,我只是觉得它很好。)

其次,我想在评论中回答philippe的问题:return frommain()并不是程序执行时发生的最后一件事。例如,您可以跳过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)

... ETC。

于 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 回答