2015-05-18 180 views
-3
#include <stdio.h> 
#include <sys/mman.h> 
#include <string.h> 
#include <stdlib.h> 

#define BUFSIZE 30 

char grade = '3'; 
char Name[BUFSIZE]; 

void readString(char *s) { 
char buf[BUFSIZE]; 
int i = 0; 
int c; 

while (1) { 
    c = fgetc(stdin); 
    if ((c == EOF) || (c == '\n')) 
    break; 
    buf[i++] = c; 
} 
buf[i] = 0; 

for (i = 0; i < BUFSIZE; i++) 
    s[i] = buf[i]; 

return; 
} 

int main(void) { 
    mprotect((void*)((unsigned int)Name & 0xfffff000), 1, 
     PROT_READ | PROT_WRITE | PROT_EXEC); 

    printf("What is your name?\n"); 
    readString(Name); 

    if (strcmp(Name, "smart guy") == 0) 
    grade = '6'; 

    printf("Thank you, %s.\n", Name); 
    printf("I recommend that you get a grade of %c on this assignment.\n", 
     grade); 

exit(0); 
    } 

我試着給一個隨機名稱當然,除了「聰明的傢伙」超限等級的緩衝,使之給我6.Also我試圖再次給它一個隨機名稱和給9你能幫助我怎麼會這樣possible.I與上緩衝一些彙編努力,但它不是那麼成功緩衝區溢出攻擊

+3

歡迎堆棧溢出!你可以通過[tour](http://stackoverflow.com/tour)瞭解這個網站的工作原理,並閱讀[關於如何提問的建議](http://stackoverflow.com/help/)問)在幫助中心,看看哪些問題在這裏受歡迎,哪些不是。 – Eregrith

+0

也許問題是全局變量不像局部變量那樣佈局?你有沒有嘗試使變量本地?改變定義的順序?你給什麼輸入?你會從這個輸入中得到什麼輸出,以及你實際得到了什麼輸出? –

+0

我不允許更改我必須緩衝區溢出的代碼。 – dsc3556

回答

1

一些編譯器有一個內存映射文件,您可以在編譯後檢查。具體來說,請查看變量等級和數組buf的地址。如果變量級被分配比地址更早的地址陣列BUF,如果陣列BUF被溢出然後級值不會改變。

+0

我正在嘗試使讀取字符串(名稱)的返回地址;而不是檢查是否要成績='6'; – dsc3556