我知道這是一種危險的行爲,我只是想弄清楚發生了什麼。如果我覆蓋棧上的返回地址,會發生什麼?
守則如下:
#include<stdio.h>
#include<stdlib.h>
static int count = 0;
void hello(void){
count ++;
fprintf(stderr,"hello! %d\n",count);
}
void foo(void){
void *buf[10];
static int i;
for(i = 0 ; i < 100 ; i++){ // put enough data to overwrite the return address on stack
buf[i] = hello;
}
}
int main(void){
int buf[1000];
foo();
return 0;
}
而結果:
……
hello! 83
hello! 84
hello! 85
hello! 86
hello! 87
hello! 88
hello! 89
Segmentation fault (core dumped)
爲什麼你好FUNC被稱爲89時間? 當foo返回時,pc寄存器獲取hello func的地址,不是嗎? 所以你好,叫做,做裏面的事情。那又怎麼樣?程序是不是回到主要功能? 89從哪裏來?我必須誤解一些事情,請指出。
哪個編譯器/操作系統您使用的?另外,你知道buf和buf中的buf沒有任何關係,對吧? – Ashalynd
@Ashalynd centos 7,gcc – MMMMMCCLXXVII
哪個版本的gcc? – Ashalynd