2015-11-20 23 views
0

我試圖執行緩衝區溢出以將函數A中的調用更改爲函數B.這是否可行?我知道我必須弄清楚我必須輸入多少個字節,直到控制返回指針爲止,並找出函數B的地址。是否可以改變它,以便在「x == 10」後注入函數B的地址而不是函數A? 編輯: 是否有可能在調用fillbuff之後,而不是返回main,我們將它發送給函數B? 任何提示表示讚賞。緩衝區溢出利用更改函數調用

int fillBuff(int x){ 
    char buff[15]; 
    puts("Enter your name"); 
    gets(buff); 
    return(x + 5); 
} 

void functionA(){ 
    puts("I dont want to be here"); 
    exit(0); 
} 
void functionB(){ 
    printf("I made it!"); 
    exit(0); 
} 


int main(){ 
    int x; 
    x = fillbuff(5); 
    if (x == 10){ 
     functionA(); 
    } 
} 
+0

順便說一句,如果聲明時沒有參數,你應該把void放在函數的參數大括號中。將它們留空並不意味着沒有參數。 –

+0

看到這個答案:http://stackoverflow.com/a/27214515/3846218 – AlexPogue

回答

2

這是一篇文章,展示瞭如何去做:http://insecure.org/stf/smashstack.html

編譯你的程序是這樣的:gcc -g -c program.c(與-g) 和運行gdb ./a.out。之後,運行命令disas main。你應該看到你的代碼的反彙編,以及它如何組織在你的記憶中。您可以將main函數替換爲任何其他函數並查看其代碼。 有關拆機詳細信息請參閱:https://sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html

enter image description here

運行GDB和我的電腦上拆卸功能的functionA()地址是0x400679functionB()地址爲40068a。如果您看到主要功能的反彙編代碼,則會調用地址0x400679,並且您想要將其更改爲40068a。 基本上,你必須溢出功能fillBuff中的緩衝區,並在到達指針的空間後,你必須填寫地址。文章展示瞭如何去做。

+0

如果你打算使用一個調試器,ollydbg/EDB(取決於你的操作系統)有點適合這種事情,因爲他們有一個顯示寄存器和內存值的gui,並在這些值發生變化時突出顯示。如果您只是計劃使用GDB來轉儲程序集而不是單步執行它,但它並不重要。 –

+1

是的,DDD(https://www.gnu.org/software/ddd/)是命令行GDB debbuger的前端。 – ViniciusArruda

+0

謝謝。這非常有幫助 – Nych

0

緩衝區溢出是在C.沒有什麼不確定的行爲,保證當你緩衝區溢出來進行,而據我所知的語言不需要局部變量特定的內存佈局和/或存儲返回地址。除此之外,一些編譯器插入堆棧保護器,使緩衝區溢出攻擊更加困難。

如果你想定義行爲,你將需要看看生成的程序集,並找出緩衝區溢出要做什麼。根據生成的程序集,您可以確定堆棧佈局和地址佈局,並嘗試用另一個函數的地址覆蓋返回地址。

如果您使用的是GCC,打印出部件的命令行選項爲-Wa,-al。如果您需要英特爾語法,請添加-masm=intel