Jawaban:
Perlindungan tumpukan dilakukan oleh kompiler (menambahkan beberapa data tambahan ke tumpukan dan menyimpan beberapa panggilan, memeriksa kewarasan saat kembali). Tidak dapat menonaktifkan itu tanpa kompilasi ulang. Itu bagian dari intinya, sungguh ...
Untuk memperluas apa yang dikatakan vonbrand (dengan benar, +1), ada dua bagian perlindungan tumpukan Linux.
Stack canaries adalah fitur yang diacu oleh kompiler yang dirujuk oleh vonbrand. Ini tidak dapat dinonaktifkan tanpa kompilasi ulang.
Untuk membuktikan ini pada diri Anda dan lihat bagaimana mereka bekerja, ambil kode berikut:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int mybadfunction(char* a_bad_idea)
{
char what[100];
strcpy(what, a_bad_idea);
printf("You passed %s\n", what);
}
int main(int argc, char** argv)
{
printf("Tralalalaala\n");
mybadfunction(argv[1]);
}
Sekarang kompilasi itu ( gcc -fstack-protector -masm=intel -S test.c
) menjadi sesuatu yang gnu akan senang untuk berkumpul dan membaca output. Poin penting adalah saat keluar dari mybadfunction
fungsi, ada sedikit kode ini:
mov edx, DWORD PTR [ebp-12]
xor edx, DWORD PTR gs:20
je .L2
call __stack_chk_fail
Seperti yang bisa Anda tebak, itu mengambil cookie tumpukan dari [ebp-12]
dan membandingkannya dengan nilai di gs:20
. Tidak cocok? Kemudian memanggil fungsi __stack_chk_fail
di glibc yang membunuh program Anda di sana.
Ada beberapa cara untuk mengatasinya dalam hal penulisan eksploit, tetapi cara mudah dalam membangun case test shellcode adalah dengan mengkompilasi program Anda -fno-stack-protector
.
Ada beberapa pertimbangan lain pada sistem Linux modern. Jika Anda mengambil rintisan pengujian shellcode yang biasa:
char buffer[] = {...};
typedef void (* func)(void);
int main(int argc, char** argv)
{
func f = (func) buffer;
f();
return 0;
}
GCC / Linux modern akan memetakan .rodata
bagian file PE hanya baca tanpa izin eksekusi. Anda harus mematikannya, yang dapat dilakukan dengan menggunakan contoh kode dari posting blog ini . Ide dasar: Anda gunakan mprotect
untuk menambahkan izin yang Anda inginkan ke halaman di mana data shellcode berada.
Jika Anda akan menguji skenario exploit tradisional, misalnya kode buruk saya di atas, dengan shellcode Anda, maka Anda juga perlu memastikan stack dapat dieksekusi untuk kasus-kasus sederhana. Format file PE berisi bidang untuk menentukan apakah stack dapat dieksekusi - Anda dapat menanyakan dan mengontrolnya dengan execstack . Untuk mengaktifkan tumpukan yang dapat dieksekusi, jalankan
execstack -s /path/to/myprog
Hal ini dapat dilakukan pada program yang sewenang-wenang tanpa perlu kompilasi ulang, tetapi tidak akan secara otomatis menonaktifkan stack kenari karena ini dipanggang saat dikompilasi.
Untuk mematikannya echo 0 > /proc/sys/kernel/randomize_va_space
,.
Tidak. Setiap eksploit harus bekerja di sekitar stack canaries (sangat non-sepele) dan menemukan program dengan execstack
set, atau mengaturnya (artinya tetap dapat menjalankan perintah sewenang-wenang) atau menggunakan teknik yang lebih sulit, seperti kembali ke libc / return pemrograman berorientasi.
Anda dapat menonaktifkan beberapa perlindungan (stack smashing detection dan membuat stack executable) dengan opsi-opsi ini.
--z execstack
-f no-stack-protector
Anda juga dapat mematikan ASLR (pengacakan tata letak ruang alamat) dengan Bash dengan perintah:
echo 0 > /proc/sys/kernel/randomize_va_space