2013-03-19 40 views
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); 
    } 

我知道它有一個漏洞做能緩衝區溢出,因爲這是他告訴我這是什麼,但除此之外,我被困。有人可以解釋爲什麼這個代碼很脆弱嗎?

+7

'strcpy(filename,argv [1]);'oops。 – nneonneo 2013-03-19 21:14:58

+3

'fscanf(inputFile,「%s」,strings [C++])'oops。 (這兩個溢出中的哪一個更糟糕取決於堆棧佈局) – nneonneo 2013-03-19 21:16:51

+6

我想如果你不知道它是怎麼做到的,你可能不適合工作 – 2013-03-19 21:16:55

回答

4

首先,我建議您閱讀this book,它很好地解釋了漏洞利用的工作原理。它附帶一個Linux VM,您可以嘗試利用代碼。 (僅供參考,我不以任何方式附屬於本書,我只是認爲它很好。)

其次,我想回答philippe的問題在評論中:main()的回報不是最後一件事當程序執行時會發生這種情況。例如,你可以從main()逐步進行return,看到很多有趣的事情發生了:

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) 

...等

+1

對不起,我今天用盡了我的+1。這個人進入我的羣衆「最好問一個愚蠢的問題,並且有一個很好的答案,而不是永遠不要問它,並在你的餘生中保持愚蠢......」 – 2013-03-19 21:53:00

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]); 
     . 
     . 
} 

This對您的訪問會有幫助。