簡體   English   中英

緩沖區溢出漏洞利用更改函數調用

[英]buffer overflow exploit change function call

我正在嘗試執行緩沖區溢出,以將調用從功能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();
    }
}

這是一篇展示如何執行此操作的文章: 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

在此處輸入圖片說明

運行GDB並反匯編我計算機上的功能, functionA()的地址為0x400679 ,而functionB()的地址為40068a 如果看到主功能的反匯編代碼,則有一個對地址0x400679的調用,您想要將其更改為40068a 基本上,您必須使函數fillBuff的緩沖區溢出,並且在到達指針的空間后,必須填充地址。 本文介紹了如何做到這一點。

緩沖區溢出是C語言中未定義的行為。保證緩沖區溢出時不會發生任何事情,據我所知,該語言不需要局部變量和/或存儲的返回地址的特定內存布局。 除此之外,某些編譯器會插入堆棧保護程序,以使緩沖區溢出攻擊更加困難。

如果要定義行為,則需要查看生成的程序集,並弄清楚緩沖區溢出將要做什么。 根據生成的程序集,您可以確定堆棧布局和地址布局,並嘗試使用其他函數的地址覆蓋返回地址。

如果使用的是GCC,則打印出程序集的命令行選項為-Wa,-al 如果需要Intel語法,請添加-masm=intel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM