Đầu ra của mã bên dưới là "Tràn", nhưng tôi đã không gọi hàm func
một cách rõ ràng. Làm thế nào nó hoạt động?Giải thích mã này chạy một hàm mà không gọi nó một cách rõ ràng?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int copy(char *input)
{
char var[20];
strcpy(var, input);
return 0;
}
int func(void)
{
printf("Overflow\n");
return 0;
}
int main(int argc, char *argv[])
{
char str[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGG";
int *p = (int *)&str[24];
*p = (int)func;
copy(str);
return 0;
}
bạn có nghĩa là tràn bộ đệm ...? – JosephH
Đây chính xác là cách hacker có thể nhận được một chương trình không an toàn để thực thi mã mà nó không có ý nghĩa. Việc hiểu nó đòi hỏi kiến thức mức thấp về trình biên dịch, môi trường thời gian chạy và kiến trúc CPU. – Jon
Lưu ý điều này: nếu địa chỉ của func có byte bằng 0, nó sẽ không hoạt động như bạn mong đợi. – aaronps