Nonaktifkan perlindungan tumpukan di Ubuntu untuk buffer overflow tanpa flag C compiler

10

Saya ingin mencoba beberapa kode shell dan saya ingin menonaktifkan perlindungan linux.

Saya tahu saya bisa mengkompilasi menggunakan flag tetapi saya tahu ada cara lain untuk menonaktifkan perlindungan ini secara umum saya tidak ingat. Bisakah kamu membantuku?

Phate
sumber

Jawaban:

6

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 ...

vonbrand
sumber
6
ASLR membutuhkan OS untuk melakukannya saat runtime. Bit NX juga membutuhkan dukungan sistem. Bagian mana yang tidak dapat dinonaktifkan saat runtime?
Jeff Ferland
25

Untuk memperluas apa yang dikatakan vonbrand (dengan benar, +1), ada dua bagian perlindungan tumpukan Linux.

Tumpukan kenari

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 mybadfunctionfungsi, 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_faildi 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.

Halaman yang tidak dapat dieksekusi

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 .rodatabagian 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 mprotectuntuk menambahkan izin yang Anda inginkan ke halaman di mana data shellcode berada.

Tumpukan yang tidak dapat dieksekusi

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.

Bonus tambahan: aslr:

Untuk mematikannya echo 0 > /proc/sys/kernel/randomize_va_space,.

Apakah Anda baru saja memberitahu seseorang bagaimana cara mengeksploitasi penguin saya yang berharga?

Tidak. Setiap eksploit harus bekerja di sekitar stack canaries (sangat non-sepele) dan menemukan program dengan execstackset, atau mengaturnya (artinya tetap dapat menjalankan perintah sewenang-wenang) atau menggunakan teknik yang lebih sulit, seperti kembali ke libc / return pemrograman berorientasi.

Jonathan Leffler
sumber
0

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
gotoat
sumber