GNU/Linux >> Belajar Linux >  >> Linux

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

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

Tumpukan burung kenari

Stack canaries adalah fitur yang didukung oleh kompiler yang dirujuk oleh vonbrand. Ini tidak dapat dinonaktifkan tanpa kompilasi ulang.

Untuk membuktikannya sendiri dan melihat cara kerjanya, 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 (gcc -fstack-protector -masm=intel -S test.c ) menjadi sesuatu yang gnu dengan senang hati akan dirakit dan dibaca hasilnya. Poin pentingnya adalah saat keluar dari mybadfunction fungsi, ada potongan kecil 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 tumpukan cookie dari [ebp-12] dan membandingkannya dengan nilai di gs:20 . Tidak cocok? Ini kemudian memanggil fungsi __stack_chk_fail di glibc yang mematikan program Anda di sana.

Ada cara untuk menyiasatinya dalam hal menulis eksploit, tetapi cara mudah dalam membangun kasus uji shellcode adalah dengan mengompilasi program Anda dengan -fno-stack-protector .

Halaman yang tidak dapat dijalankan

Ada beberapa pertimbangan lain pada sistem Linux modern. Jika Anda mengambil rintisan pengujian kode shell 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 dari file PE hanya dapat dibaca tanpa izin eksekusi. Anda perlu mematikannya, yang dapat dilakukan dengan menggunakan contoh kode dari postingan blog ini. Ide dasar:Anda menggunakan mprotect untuk menambahkan izin yang Anda inginkan ke halaman tempat data kode shell berada.

Tumpukan yang tidak dapat dieksekusi

Jika Anda akan menguji skenario eksploit tradisional, mis. kode buruk saya di atas, dengan kode shell Anda maka Anda juga perlu memastikan tumpukan dapat dieksekusi untuk kasus sederhana. Format file PE berisi bidang untuk menentukan apakah tumpukan dapat dieksekusi — Anda dapat meminta dan mengontrolnya dengan execstack. Untuk mengaktifkan tumpukan yang dapat dieksekusi, jalankan

execstack -s /path/to/myprog

Ini bisa dilakukan pada program sewenang-wenang tanpa memerlukan kompilasi ulang, tetapi tidak akan secara otomatis menonaktifkan tumpukan kenari karena ini dimasukkan dalam kompilasi.

Bonus tambahan:aslr:

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

Apakah Anda baru saja memberi tahu seseorang cara mengeksploitasi penguin saya yang berharga?

Tidak. Eksploitasi apa pun harus mengatasi stack canaries (sangat tidak sepele) dan menemukan program dengan execstack setel, atau setel (artinya sudah dapat menjalankan perintah sewenang-wenang) atau gunakan teknik yang lebih sulit, seperti kembali ke pemrograman berorientasi libc/return.


Perlindungan tumpukan dilakukan oleh kompiler (tambahkan beberapa data tambahan ke tumpukan dan simpan beberapa saat panggilan, periksa kewarasan saat kembali). Tidak dapat menonaktifkannya tanpa mengkompilasi ulang. Itu bagian dari intinya, sungguh...


Linux
  1. Nonaktifkan Shell Pengguna Karena Alasan Keamanan?

  2. Fraps Suka Program Untuk Ubuntu?

  3. Nutty – Alat Diagnostik Jaringan untuk Ubuntu

  1. Nonaktifkan host virtual di sistem operasi Ubuntu dan CentOS untuk Apache dan Nginx

  2. Nonaktifkan dan aktifkan kembali pengacakan tata letak ruang alamat hanya untuk saya sendiri

  3. Nonaktifkan sinkronisasi vertikal untuk glxgears

  1. Apakah Ada Penginstal Wubi Untuk Versi Dvd Ubuntu?

  2. Berbagi Mouse Untuk Ubuntu?

  3. Apakah ada F# Interactive untuk Linux di .NET Core, tanpa menggunakan Mono?