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ến nhất này. Kỹ thuật khai thác lỗi tràn bộ đệm (buffer overflow exploit) được xem là một trong những kỹ thuật hacking kinh điển nhất. Bài viết được chia 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...
Nội dung trích xuất từ tài liệu:
KỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆM - Phần 1KỸ THUẬT KHAI THÁC LỖI TRÀN BỘ ĐỆMTóm tắt :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 khaithá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 xem là một trong những kỹ thuật hacking kinh điển nhất. Bài viết được chia 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ạnmã 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àn bộ đệm cơ bản, tổ chứcshellcode, 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ôi trườ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đọc cần có kiến thức cơ bản về lập trình C, hợp ngữ (assembly), trình biê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ệu khá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ột cá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 o 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 shellcodeGiới thiệuĐể tìm hiểu chi tiết về lỗi tràn bộ đệm, cơ chế hoạt động và cách khai thác lỗi ta hãy bắt đầubằng một ví dụ về chương trình b ị tràn bộ đệ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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA // 24 ký tự A (2) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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ìnhthường. Với tham số là chuỗi dài 24 ký tự A (2), chương trình bị lỗi Segmentation fault. Dễ thấybộ đệ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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA. 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ến chương trình thực thi mã lệnh tuỳý bằng cách thay đ ổi con trỏ lệnh e ip đế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ột chươ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)Mỗi tiến trình thực thi đều được hệ điều hành cấp cho một không gian bộ nhớ ảo (logic) giốngnhau. Không gian nhớ này gồm 3 vù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ến trình thực thi cùng một file chương trình và tương ứng vớiphân đoạn text của file thực thi. Dữ liệu ở vùng này là chỉ đọc, mọi thao tác nhằm ghi lên vùngnhớ 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ạo giá 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ựcthi.Vùng stack là vùng nhớ được dành riêng khi thực thi chương trình dùng để chứa giá trị các biếncục bộ của hàm, tham số gọi hàm cũng như giá trị trả về. Thao tác trên bộ nhớ stack được thaotác theo cơ chế vào sau ra trước - LIFO (Last In, First Out) với hai lệ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 trung tìm hiểu về vùng stack.1.2 StackStack là một kiểu cấu trúc dữ liệu trừu tượng cấp ...