Vô hiệu hóa bảo vệ ngăn xếp trên Ubuntu để tràn bộ đệm mà không có cờ trình biên dịch C


10

Tôi muốn thử một số mã shell và tôi muốn tắt bảo vệ linux.

Tôi biết tôi có thể biên dịch bằng cờ nhưng tôi biết một cách khác tồn tại để vô hiệu hóa các biện pháp bảo vệ này nói chung tôi không thể nhớ được. Bạn có thể giúp tôi được không?

Câu trả lời:


6

Bảo vệ ngăn xếp được thực hiện bởi trình biên dịch (thêm một số dữ liệu bổ sung vào ngăn xếp và bỏ đi một số cuộc gọi, kiểm tra sự tỉnh táo khi trở về). Không thể vô hiệu hóa mà không biên dịch lại. Đó là một phần của vấn đề, thực sự ...


6
ASLR yêu cầu HĐH thực hiện nó trong thời gian chạy. Các bit NX cũng yêu cầu hỗ trợ hệ thống. Phần nào không thể bị vô hiệu hóa trong thời gian chạy?
Jeff Ferland

25

Để mở rộng những gì vonbrand có (chính xác, +1) đã nói, có hai phần để bảo vệ ngăn xếp của Linux.

Chồng chim hoàng yến

Stack canaries là tính năng mà trình biên dịch thực thi mà vonbrand đề cập đến. Chúng không thể bị vô hiệu hóa mà không cần biên dịch lại.

Để chứng minh điều này với chính mình và xem cách họ làm việc, hãy lấy đoạn mã sau:

#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]);
}

Bây giờ biên dịch rằng ( gcc -fstack-protector -masm=intel -S test.c) thành một cái gì đó gnu như sẽ rất vui khi lắp ráp và đọc đầu ra. Điểm quan trọng là khi thoát khỏi mybadfunctionhàm, có đoạn mã nhỏ này:

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

Như bạn có thể đoán, đó là lấy một ngăn xếp cookie [ebp-12]và so sánh nó với giá trị tại gs:20. Không phù hợp? Sau đó, nó gọi một hàm __stack_chk_failtrong glibc sẽ giết chương trình của bạn ngay tại đó.

Có nhiều cách để giải quyết vấn đề này bằng cách viết khai thác, nhưng cách dễ dàng trong việc xây dựng trường hợp kiểm thử shellcode là biên dịch chương trình của bạn -fno-stack-protector.

Các trang không thể thực thi

Có một số cân nhắc khác trên các hệ thống Linux hiện đại. Nếu bạn lấy sơ đồ kiểm tra shellcode thông thường:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

GCC / Linux hiện đại sẽ ánh xạ .rodataphần của tệp PE chỉ đọc mà không có quyền thực thi. Bạn cần tắt nó đi, có thể được thực hiện bằng cách sử dụng mẫu mã từ bài đăng trên blog này . Ý tưởng cơ bản: bạn sử dụng mprotectđể thêm các quyền bạn muốn vào các trang chứa dữ liệu shellcode.

Ngăn xếp không thực thi

Nếu bạn định kiểm tra một kịch bản khai thác truyền thống, ví dụ mã xấu của tôi ở trên, với shellcode của bạn thì bạn cũng cần đảm bảo ngăn xếp có thể thực thi được cho các trường hợp đơn giản. Định dạng tệp PE chứa một trường để xác định xem ngăn xếp có thể thực thi được hay không - bạn có thể truy vấn và kiểm soát điều này với execstack . Để kích hoạt ngăn xếp thực thi, hãy chạy

execstack -s /path/to/myprog

Điều này có thể được thực hiện trên các chương trình tùy ý mà không cần biên dịch lại, nhưng sẽ không tự động vô hiệu hóa các canaries ngăn xếp vì chúng được đưa vào biên dịch.

Đã thêm tiền thưởng: aslr:

Để tắt nó , echo 0 > /proc/sys/kernel/randomize_va_space.

Bạn vừa nói với ai đó cách khai thác chim cánh cụt quý giá của tôi?

Số Bất kỳ khai thác phải làm việc xung quanh đống chim hoàng yến (rất nhiều không tầm thường) và một trong hai tìm thấy một chương trình với execstackbộ, hoặc thiết lập nó (có nghĩa là nó đã có thể thực hiện các lệnh tùy ý anyway) hoặc sử dụng khác kỹ thuật khó khăn hơn, chẳng hạn như quay trở lại libc / khứ hồi định hướng lập trình.


0

Bạn có thể vô hiệu hóa một số biện pháp bảo vệ (phát hiện đập ngăn xếp và làm cho ngăn xếp thực thi) với các tùy chọn này.

--z execstack
-f no-stack-protector

Bạn cũng có thể tắt ASLR (ngẫu nhiên bố trí không gian địa chỉ) bằng lệnh Bash:

echo 0 > /proc/sys/kernel/randomize_va_space
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.