Stack break terdeteksi

Saya menjalankan file a.out saya. Setelah dieksekusi, program dimulai sebentar dan kemudian meninggalkan pesan:

 **** stack smashing detected ***: ./a.out terminated* *======= Backtrace: =========* */lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted* 

Apa yang mungkin menjadi alasan untuk ini dan bagaimana cara memperbaikinya?

145
28 авг. diatur oleh Biswajyoti Das 28 Agustus. 2009-08-28 11:17 '09 pada 11:17 2009-08-28 11:17
@ 5 balasan

Stack Smashing di sini sebenarnya disebabkan oleh mekanisme perlindungan yang digunakan oleh gcc untuk mendeteksi kesalahan buffer overflow. Misalnya, dalam cuplikan berikut:

 #include <stdio.h> void func() { char array[10]; gets(array); } int main(int argc, char **argv) { func(); } 

Kompiler (dalam hal ini, gcc) menambahkan variabel perlindungan (disebut kenari) yang memiliki nilai yang diketahui. Jalur input yang lebih besar dari 10 menyebabkan kerusakan pada variabel ini, menyebabkan SIGABRT untuk menghentikan program.

Untuk mendapatkan beberapa ide, Anda dapat mencoba menonaktifkan perlindungan gcc ini menggunakan opsi -fno-stack-protector selama kompilasi. Dalam hal ini, Anda akan mendapatkan kesalahan lain, kemungkinan besar kesalahan segmentasi, karena Anda mencoba untuk mendapatkan akses ke sel memori ilegal. Harap dicatat bahwa -fstack-protector harus selalu diaktifkan untuk rilis, karena ini adalah fitur keamanan.

Anda bisa mendapatkan beberapa informasi tentang titik overflow dengan menjalankan program menggunakan debugger. Valgrind tidak bekerja dengan kesalahan terkait tumpukan, tetapi, seperti debugger, ini dapat membantu Anda menentukan lokasi dan penyebab crash.

217
28 авг. jawabannya diberikan sud03r 28 Agustus. 2009-08-28 17:44 '09 pada 17:44 2009-08-28 17:44

Lihatlah situasi berikut:

 ab@cd-x:$ cat test_overflow.c #include <stdio.h> #include <string.h> int check_password(char *password){ int flag = 0; char buffer[20]; strcpy(buffer, password); if(strcmp(buffer, "mypass") == 0){ flag = 1; } if(strcmp(buffer, "yourpass") == 0){ flag = 1; } return flag; } int main(int argc, char *argv[]){ if(argc >= 2){ if(check_password(argv[1])){ printf("%s", "Access granted\n"); }else{ printf("%s", "Access denied\n"); } }else{ printf("%s", "Please enter password!\n"); } } ab@cd-x:$ gcc -g -fno-stack-protector test_overflow.c ab@cd-x:$ ./a.out mypass Access granted ab@cd-x:$ ./a.out yourpass Access granted ab@cd-x:$ ./a.out wepass Access denied ab@cd-x:$ ./a.out wepassssssssssssssssss Access granted ab@cd-x:$ gcc -g -fstack-protector test_overflow.c ab@cd-x:$ ./a.out wepass Access denied ab@cd-x:$ ./a.out mypass Access granted ab@cd-x:$ ./a.out yourpass Access granted ab@cd-x:$ ./a.out wepassssssssssssssssss *** stack smashing detected ***: ./a.out terminated ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xce0ed8] /lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xce0e90] ./a.out[0x8048524] ./a.out[0x8048545] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xc16b56] ./a.out[0x8048411] ======= Memory map: ======== 007d9000-007f5000 r-xp 00000000 08:06 5776 /lib/libgcc_s.so.1 007f5000-007f6000 r--p 0001b000 08:06 5776 /lib/libgcc_s.so.1 007f6000-007f7000 rw-p 0001c000 08:06 5776 /lib/libgcc_s.so.1 0090a000-0090b000 r-xp 00000000 00:00 0 [vdso] 00c00000-00d3e000 r-xp 00000000 08:06 1183 /lib/tls/i686/cmov/libc-2.10.1.so 00d3e000-00d3f000 ---p 0013e000 08:06 1183 /lib/tls/i686/cmov/libc-2.10.1.so 00d3f000-00d41000 r--p 0013e000 08:06 1183 /lib/tls/i686/cmov/libc-2.10.1.so 00d41000-00d42000 rw-p 00140000 08:06 1183 /lib/tls/i686/cmov/libc-2.10.1.so 00d42000-00d45000 rw-p 00000000 00:00 0 00e0c000-00e27000 r-xp 00000000 08:06 4213 /lib/ld-2.10.1.so 00e27000-00e28000 r--p 0001a000 08:06 4213 /lib/ld-2.10.1.so 00e28000-00e29000 rw-p 0001b000 08:06 4213 /lib/ld-2.10.1.so 08048000-08049000 r-xp 00000000 08:05 1056811 /dos/hacking/test/a.out 08049000-0804a000 r--p 00000000 08:05 1056811 /dos/hacking/test/a.out 0804a000-0804b000 rw-p 00001000 08:05 1056811 /dos/hacking/test/a.out 08675000-08696000 rw-p 00000000 00:00 0 [heap] b76fe000-b76ff000 rw-p 00000000 00:00 0 b7717000-b7719000 rw-p 00000000 00:00 0 bfc1c000-bfc31000 rw-p 00000000 00:00 0 [stack] Aborted ab@cd-x:$ 

Ketika saya mematikan pembela tumpukan, tidak ada kesalahan yang ditemukan yang seharusnya terjadi ketika saya menggunakan "./a.out wepassssssssssssssssssssss"

Jadi, untuk menjawab pertanyaan Anda di atas, pesan "** deteksi tumpukan rusak: xxx" ditampilkan, karena pembela tumpukan Anda aktif dan menemukan bahwa ada kelebihan tumpukan stack di program Anda.

Cari tahu di mana ini terjadi dan perbaiki.

12
06 марта '10 в 9:45 2010-03-06 09:45 jawab diberikan wearetherock 06 Maret 10 jam 9:45 2010-03-06 09:45

Anda dapat mencoba men-debug masalah menggunakan valgrind :

Distribusi Valgrind saat ini mencakup enam alat kualitas produksi: detektor kesalahan memori, dua detektor kesalahan aliran, cache dan profil prediksi cabang, grafik panggilan yang menghasilkan profil caching, dan profil tumpukan. Ini juga mencakup dua alat eksperimental: heap / stack overflow / global array detector dan generator vektor unit dasar SimPoint. Ini bekerja pada platform berikut: X86 / Linux, AMD64 / Linux, PPC32 / Linux, PPC64 / Linux, dan X86 / Darwin (Mac OS X).

7
28 авг. jawabannya diberikan hlovdal 28 Agustus. 2009-08-28 11:24 '09 pada 11:24 2009-08-28 11:24

Ini berarti bahwa Anda menulis beberapa variabel pada stack secara ilegal, kemungkinan besar sebagai akibat buffer overflow .

3
28 авг. balas yang diberikan starblue 28 Agustus. 2009-08-28 12:05 '09 pada 12:05 2009-08-28 12:05

Saya mendapatkan kesalahan ini menggunakan malloc () untuk mengalokasikan beberapa memori untuk struktur *, setelah menghabiskan beberapa kode debug ini, saya akhirnya menggunakan fungsi bebas () untuk membebaskan memori yang dialokasikan, dan kemudian pesan kesalahan menghi>

0
03 сент. jawabannya diberikan tejas.jaiswal 03 sept . 2017-09-03 20:16 '17 pada 20:16 2017-09-03 20:16

Pertanyaan lain pada tag atau Ajukan Pertanyaan