2012-11-13 40 views
8

Đầ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; 
} 
+3

bạn có nghĩa là tràn bộ đệm ...? – JosephH

+3

Đâ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

+1

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

Trả lời

11

Chức năng copy tràn bộ đệm var trong copy chức năng và ghi đè địa chỉ main trở lại với địa chỉ của func chức năng.

Khi trả lại hàm copy, thay vì quay lại main sau khi gọi hàm copy, hàm này trả về hàm func.

+0

Nó sẽ trở lại địa chỉ tương ứng với giá trị nguyên của "GGGG"? – pedr0

+1

@ pedr0 'GGGG' được thay thế bằng địa chỉ của hàm' func' trong phép gán này: '* p = (int) func;'. 'Strcpy' sẽ sao chép địa chỉ này vào địa chỉ trả về. – ouah

+0

Tại sao mảng 'str' cần 4' int' kích thước lớn hơn 'var', thay vì 2 hoặc 6? – Wilbeibi

Các vấn đề liên quan