KỸ THUẬT KHAI THÁC LỖI TRÀN TRONG BỘ ĐỆM
Số trang: 66
Loại file: doc
Dung lượng: 105.00 KB
Lượt xem: 26
Lượt tải: 0
Xem trước 3 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Loạt bài viết này trình bày về tràn bộ đệm (buffer overflow)xảy ra trên stack và kỹ thuật khai thác lỗi bảo mật phổ biếnnhất này. Kỹ thuật khai thác lỗi tràn bộ đệm (buffer overflowexploit) được xem là một trong những kỹ thuật hacking kinhđiển nhất.
Nội dung trích xuất từ tài liệu:
KỸ THUẬT KHAI THÁC LỖI TRÀN TRONG BỘ ĐỆM ---------- BÀI TIỂU LUẬNKỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆMKỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆMtrang này đã được đọc lầnTóm tắt :Loạt bài viết này trình bày về tràn bộ đệm (buffer overflow) xảy ratrên stack và kỹ thuật khai thác lỗi bảo mật phổ biến nhất này. Kỹthuật khai thác lỗi tràn bộ đệm (buffer overflow exploit) được xemlà một trong những kỹ thuật hacking kinh điển nhất. Bài viết đượcchia làm 2 phần:Phần 1: Tổ chức bộ nhớ, stack, gọi hàm, shellcode. Giới thiệu tổchức bộ nhớ của một tiến trình (process), các thao tác trên bộ nhớstack khi gọi hàm và kỹ thuật cơ bản để tạo shellcode - đoạn mãthực thi một giao tiếp dòng lệnh (shell).Phần 2: Kỹ thuật khai thác lỗi tràn bộ đệm. Giới thiệu kỹ thuật trànbộ đệm cơ bản, tổ chức shellcode, xác định địa chỉ trả về, địa chỉshellcode, cách truyền shellcode cho chương trình bị lỗi.Các chi tiết kỹ thuật minh hoạ ở đây được thực hiện trên môitrường Linux x86 (kernel 2.2.20, glibc-2.1.3), tuy nhiên về mặt lýthuyết có thể áp dụng cho bất kỳ môi trường nào khác. Người đọccần có kiến thức cơ bản về lập trình C, hợp ngữ (assembly), trìnhbiên dịch gcc và công cụ gỡ rối gdb (GNU Debugger).Nếu bạn đã biết kỹ thuật khai thác lỗi tràn bộ đệm qua các tài liệukhác, bài viết này cũng có thể giúp bạn củng cố lại kiến thức mộtcách chắc chắn hơn.Phần 1: Tổ chức bộ nhớ, stack, gọi hàm, shellcodeMục lục : Giới thiệu 1. Tổ chức bộ nhớ o 1.1 Tổ chức bộ nhớ của một tiến trình (process) o 1.2 Stack 2. Gọi hàm o 2.1 Giới thiệu o 2.2 Khởi đầu o 2.3 Gọi hàm o 2.3 Kết thúc 3. Shellcode 3.1 Viết shellcode trong ngôn ngữ C o 3.2 Giải mã hợp ngữ các hàm o 3.3 Định vị shellcode trên bộ nhớ o 3.4 Vấn đề byte giá trị null o 3.5 Tạo shellcode oGiới thiệuĐể tìm hiểu chi tiết về lỗi tràn bộ đệm, cơ chế hoạt động và cáchkhai thác lỗi ta hãy bắt đầu bằng một ví dụ về chương trình bị trànbộ đệm. /* vuln.c */ int main(int argc, char **argv) { char buf[16]; if (argc>1) { strcpy(buf, argv[1]); printf(%s , buf); } } [SkZ0@gamma bof]$ gcc -o vuln -g vuln.c [SkZ0@gamma bof]$ ./vuln AAAAAAAA // 8 ký tự A (1) AAAAAAAA [SkZ0@gamma bof]$ ./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A // 24 ký tự A (2) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A Segmentation fault (core dumped)Chạy chương trình vuln với tham số là chuỗi dài 8 ký tự A (1),chương trình hoạt động bình thường. Với tham số là chuỗi dài 24ký tự A (2), chương trình bị lỗi Segmentation fault. Dễ thấy bộđệm buf trong chương trình chỉ chứa được tối đa 16 ký tự đã bịlàm tràn bởi 24 ký tự A. [SkZ0@gamma bof]$ gdb vuln -c core -q Core was generated by `./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libc.so.6...done. Reading symbols from /lib/ld-linux.so.2...done. #0 0x41414141 in ?? () (gdb) info register eip eip 0x41414141 1094795585 (gdb)Thanh ghi eip - con trỏ lệnh hiện hành - có giá trị 0x41414141,tương đương AAAA (ký tự A có giá trị 0x41 hexa). Ta thấy, cóthể thay đổi giá trị của thanh ghi con trỏ lệnh eip bằng cách làmtràn bộ đệm buf. Khi lỗi tràn bộ đệm đã xảy ra, ta có thể khiếnchương trình thực thi mã lệnh tuỳ ý bằng cách thay đổi con trỏ lệnheip đến địa chỉ bắt đầu của đoạn mã lệnh đó.Để hiểu rõ quá trình tràn bộ đệm xảy ra như thế nào, chúng ta sẽxem xét chi tiết tổ chức bộ nhớ, stack và cơ chế gọi hàm của mộtchương trình.1. Tổ chức bộ nhớ1.1 Tổ chức bộ nhớ của một tiến trình (process) to chuc bo nhoMỗi tiến trình thực thi đều được hệ điều hành cấp cho một khônggian bộ nhớ ảo (logic) giống nhau. Không gian nhớ này gồm 3vùng: text, data và stack. Ý nghĩa của 3 vùng này như sau:Vùng text là vùng cố định, chứa các mã lệnh thực thi (instruction)và dữ liệu chỉ đọc (read-only). Vùng này được chia sẻ giữa các tiếntrình thực thi cùng một file chương trình và tương ứng với phânđoạn text của file thực thi. Dữ liệu ở vùng này là chỉ đọc, mọi thaotác nhằm ghi lên vùng nhớ này đều gây lỗi segmentation violation.Vùng data chứa các dữ liệu đã được khởi tạo hoặc chưa khởi tạogiá trị. Các biến toàn cục và biến tĩnh được chứa trong vùng này.Vùng data tương ứng với phân đoạn data-bss của file thực thi.Vùng stack là vùng nhớ được dành riêng khi thực thi chương trìnhdùng để chứa giá trị các biến cục bộ của hàm, tham số gọi hàmcũng như giá trị trả về. Thao tác trên bộ nhớ stack được thao táctheo cơ chế vào sau ra trước - LIFO (Last In, First Out) với hailệnh quan trọng nhất là PUSH và POP. Trong phạm vi bài viết này,chúng ta chỉ tập tr ...
Nội dung trích xuất từ tài liệu:
KỸ THUẬT KHAI THÁC LỖI TRÀN TRONG BỘ ĐỆM ---------- BÀI TIỂU LUẬNKỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆMKỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆMtrang này đã được đọc lầnTóm tắt :Loạt bài viết này trình bày về tràn bộ đệm (buffer overflow) xảy ratrên stack và kỹ thuật khai thác lỗi bảo mật phổ biến nhất này. Kỹthuật khai thác lỗi tràn bộ đệm (buffer overflow exploit) được xemlà một trong những kỹ thuật hacking kinh điển nhất. Bài viết đượcchia làm 2 phần:Phần 1: Tổ chức bộ nhớ, stack, gọi hàm, shellcode. Giới thiệu tổchức bộ nhớ của một tiến trình (process), các thao tác trên bộ nhớstack khi gọi hàm và kỹ thuật cơ bản để tạo shellcode - đoạn mãthực thi một giao tiếp dòng lệnh (shell).Phần 2: Kỹ thuật khai thác lỗi tràn bộ đệm. Giới thiệu kỹ thuật trànbộ đệm cơ bản, tổ chức shellcode, xác định địa chỉ trả về, địa chỉshellcode, cách truyền shellcode cho chương trình bị lỗi.Các chi tiết kỹ thuật minh hoạ ở đây được thực hiện trên môitrường Linux x86 (kernel 2.2.20, glibc-2.1.3), tuy nhiên về mặt lýthuyết có thể áp dụng cho bất kỳ môi trường nào khác. Người đọccần có kiến thức cơ bản về lập trình C, hợp ngữ (assembly), trìnhbiên dịch gcc và công cụ gỡ rối gdb (GNU Debugger).Nếu bạn đã biết kỹ thuật khai thác lỗi tràn bộ đệm qua các tài liệukhác, bài viết này cũng có thể giúp bạn củng cố lại kiến thức mộtcách chắc chắn hơn.Phần 1: Tổ chức bộ nhớ, stack, gọi hàm, shellcodeMục lục : Giới thiệu 1. Tổ chức bộ nhớ o 1.1 Tổ chức bộ nhớ của một tiến trình (process) o 1.2 Stack 2. Gọi hàm o 2.1 Giới thiệu o 2.2 Khởi đầu o 2.3 Gọi hàm o 2.3 Kết thúc 3. Shellcode 3.1 Viết shellcode trong ngôn ngữ C o 3.2 Giải mã hợp ngữ các hàm o 3.3 Định vị shellcode trên bộ nhớ o 3.4 Vấn đề byte giá trị null o 3.5 Tạo shellcode oGiới thiệuĐể tìm hiểu chi tiết về lỗi tràn bộ đệm, cơ chế hoạt động và cáchkhai thác lỗi ta hãy bắt đầu bằng một ví dụ về chương trình bị trànbộ đệm. /* vuln.c */ int main(int argc, char **argv) { char buf[16]; if (argc>1) { strcpy(buf, argv[1]); printf(%s , buf); } } [SkZ0@gamma bof]$ gcc -o vuln -g vuln.c [SkZ0@gamma bof]$ ./vuln AAAAAAAA // 8 ký tự A (1) AAAAAAAA [SkZ0@gamma bof]$ ./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A // 24 ký tự A (2) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A Segmentation fault (core dumped)Chạy chương trình vuln với tham số là chuỗi dài 8 ký tự A (1),chương trình hoạt động bình thường. Với tham số là chuỗi dài 24ký tự A (2), chương trình bị lỗi Segmentation fault. Dễ thấy bộđệm buf trong chương trình chỉ chứa được tối đa 16 ký tự đã bịlàm tràn bởi 24 ký tự A. [SkZ0@gamma bof]$ gdb vuln -c core -q Core was generated by `./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libc.so.6...done. Reading symbols from /lib/ld-linux.so.2...done. #0 0x41414141 in ?? () (gdb) info register eip eip 0x41414141 1094795585 (gdb)Thanh ghi eip - con trỏ lệnh hiện hành - có giá trị 0x41414141,tương đương AAAA (ký tự A có giá trị 0x41 hexa). Ta thấy, cóthể thay đổi giá trị của thanh ghi con trỏ lệnh eip bằng cách làmtràn bộ đệm buf. Khi lỗi tràn bộ đệm đã xảy ra, ta có thể khiếnchương trình thực thi mã lệnh tuỳ ý bằng cách thay đổi con trỏ lệnheip đến địa chỉ bắt đầu của đoạn mã lệnh đó.Để hiểu rõ quá trình tràn bộ đệm xảy ra như thế nào, chúng ta sẽxem xét chi tiết tổ chức bộ nhớ, stack và cơ chế gọi hàm của mộtchương trình.1. Tổ chức bộ nhớ1.1 Tổ chức bộ nhớ của một tiến trình (process) to chuc bo nhoMỗi tiến trình thực thi đều được hệ điều hành cấp cho một khônggian bộ nhớ ảo (logic) giống nhau. Không gian nhớ này gồm 3vùng: text, data và stack. Ý nghĩa của 3 vùng này như sau:Vùng text là vùng cố định, chứa các mã lệnh thực thi (instruction)và dữ liệu chỉ đọc (read-only). Vùng này được chia sẻ giữa các tiếntrình thực thi cùng một file chương trình và tương ứng với phânđoạn text của file thực thi. Dữ liệu ở vùng này là chỉ đọc, mọi thaotác nhằm ghi lên vùng nhớ này đều gây lỗi segmentation violation.Vùng data chứa các dữ liệu đã được khởi tạo hoặc chưa khởi tạogiá trị. Các biến toàn cục và biến tĩnh được chứa trong vùng này.Vùng data tương ứng với phân đoạn data-bss của file thực thi.Vùng stack là vùng nhớ được dành riêng khi thực thi chương trìnhdùng để chứa giá trị các biến cục bộ của hàm, tham số gọi hàmcũng như giá trị trả về. Thao tác trên bộ nhớ stack được thao táctheo cơ chế vào sau ra trước - LIFO (Last In, First Out) với hailệnh quan trọng nhất là PUSH và POP. Trong phạm vi bài viết này,chúng ta chỉ tập tr ...
Tìm kiếm theo từ khóa liên quan:
bảo mật thông tin An ninh Bảo mật kỹ thuật bảo mật an toàn thông tin khai thác lỗi bảo mật khai thác lỗi tràn bộ đệmGợi ý tài liệu liên quan:
-
Đề cương chi tiết bài giảng môn Đảm bảo và an toàn thông tin
25 trang 271 0 0 -
10 trang 221 1 0
-
5 trang 178 0 0
-
Giáo trình An toàn, an ninh thông tin và mạng lưới
142 trang 170 0 0 -
Kiến thức căn bản về Máy tính - Phùng Văn Đông
52 trang 165 0 0 -
Xây dựng thuật toán, thử nghiệm đánh giá mô hình cứng hóa giao thức IKEv2.0
7 trang 158 0 0 -
5 trang 128 0 0
-
Giáo trình An toàn và bảo mật thông tin - Đại học Bách Khoa Hà Nội
110 trang 113 0 0 -
Về một giải pháp cứng hóa phép tính lũy thừa modulo
7 trang 105 0 0 -
Một số thuật toán giấu tin trong ảnh có bảng màu và áp dụng giấu tin mật trong ảnh GIF
5 trang 94 0 0