Dari posting ini ditunjukkan bahwa itu FS:[0x28]
adalah stack-canary. Saya membuat kode yang sama menggunakan GCC pada fungsi ini,
void foo () {
char a[500] = {};
printf("%s", a);
}
Secara khusus, saya mendapatkan perakitan ini ..
0x000006b5 64488b042528. mov rax, qword fs:[0x28] ; [0x28:8]=0x1978 ; '(' ; "x\x19"
0x000006be 488945f8 mov qword [local_8h], rax
...stuff...
0x00000700 488b45f8 mov rax, qword [local_8h]
0x00000704 644833042528. xor rax, qword fs:[0x28]
0x0000070d 7405 je 0x714
0x0000070f e85cfeffff call sym.imp.__stack_chk_fail ; void __stack_chk_fail(void)
; CODE XREF from 0x0000070d (sym.foo)
0x00000714 c9 leave
0x00000715 c3 ret
Apa yang mengatur nilai fs:[0x28]
? Kernel, atau apakah GCC memasukkan kode? Bisakah Anda menunjukkan kode di kernel, atau dikompilasi ke dalam biner yang ditetapkan fs:[0x28]
? Apakah kenari dibuat ulang - saat boot, atau proses menelurkan? Di mana ini didokumentasikan?
arch_prctl(ARCH_SET_FS..)
saya tidak melihat itu di executable? Apakah itu kode kernel?ld-linux
selama inisialisasi TLS.Apa yang Anda lihat disebut (dalam GCC) Stack Smashing Protector (SSP) , yang merupakan bentuk perlindungan buffer overflow yang dihasilkan oleh kompiler. Nilainya adalah angka acak yang dihasilkan oleh program saat startup dan sebagaimana artikel Wikipedia menyebutkan, ditempatkan di Thread Local Storage (TLS) . Kompiler lain dapat menggunakan strategi yang berbeda untuk menerapkan jenis perlindungan ini.
Mengapa menyimpan nilai dalam TLS? Karena nilainya terletak di sana, alamatnya tidak dapat diakses oleh register CS, DS dan SS, membuat menebak nilai yang disimpan menjadi sangat sulit jika Anda mencoba mengubah tumpukan dari kode berbahaya.
sumber