2012-12-20 13 views
14

Tôi đang biên dịch mã đơn giản dưới đây và chạy nó trong gdb. Tôi thiết lập một điểm break ở dòng strcpy, ngay sau khi tôi chạy nó cho đầu vào ví dụ abc, và sau đó nhấn s, tôi nhận được lỗi sau:strcpy-sse2-unaligned.S không tìm thấy

Breakpoint 1, main (argc=2, argv=0x7fffffffdd98) at ExploitMe.c:9 
9   strcpy(buffer, argv[1]); 
(gdb) s 
__strcpy_sse2_unaligned() at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:48 
48 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory. 

Tôi đang sử dụng ubuntu 12.04 AMD64 và gcc 2.15 . Bất kỳ ý tưởng?


main(int argc, char *argv[]) { 

    char buffer[80]; 

    strcpy(buffer, argv[1]); 

    return 0; 
} 
+3

Đó không phải là lỗi - gdb không thể tìm thấy tệp nguồn để triển khai 'strcpy' nhưng nó vẫn sẽ hiển thị mã đã tháo rời. –

+0

vâng, tôi nhận thấy điều đó, nhưng tại sao? và bất kỳ ý tưởng làm thế nào để giải quyết nó? – Afshin

+1

Không chắc chắn lý do tại sao điều này đã được bình chọn ... – Mehrdad

Trả lời

13

Đó là hoàn toàn vô hại để bỏ qua những "lỗi" khi gỡ lỗi.

Lỗi này đơn giản chỉ vì GDB đang tìm kiếm nguồn của hàm strcpy. Bất kỳ chức năng trong libc rằng bạn không phải là nguồn gốc cho bạn sẽ đưa ra một lỗi tương tự, ví dụ:

int *p = malloc(sizeof *p); 

Sau đó ...

(gdb) s 
5  int *p = malloc(sizeof *p); 
(gdb) s 
__GI___libc_malloc (bytes=4) at malloc.c:2910 
2910 malloc.c: No such file or directory. 

Bạn luôn có thể tải về mã nguồn GNU libc và liên kết nó với GDB:

git clone https://github.com/jeremie-koenig/glibc /opt/src/glibc 

Sau đó ...

(gdb) dir /opt/src/glibc/malloc 
(gdb) s 
5  int *p = malloc(sizeof *p); 
(gdb) s 
__GI___libc_malloc (bytes=4) at malloc.c:2910 
2910    } 
(gdb) s 
2915   } else if (!in_smallbin_range(size)) 

... cho phép bạn xem qua mã nguồn của malloc. Nó không đặc biệt hữu ích, nhưng đôi khi nó có ích.

+0

cảm ơn rất nhiều, đã được giải quyết vấn đề của tôi;) – Afshin

+1

Chỉ cần đảm bảo rằng bạn sao chép Phiên bản CÙNG như bạn đang sử dụng trên hệ thống. Mới nhất, đó là những gì bạn nhận được từ bản sao git, có lẽ không phải là những gì được cài đặt trên hệ thống của bạn (và có thể không phải là ý tưởng hay nhất!) –

+1

Như một lời nhắc nhanh, nếu bạn đang sử dụng gdb, bạn có thể sử dụng n (cho tiếp theo) để bỏ qua các dòng với các cuộc gọi hàm đó. – Sum