Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
2,97 MB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THƠNG TIN Báo cáo cuối kỳ Tìm hiểu cơng cụ GDB ứng dụng vào thực tế MỤC LỤC MỤC LỤC DANH MỤC CÁC HÌNH ẢNH DANH MỤC BẢNG DANH MỤC VIẾT TẮT LỜI MỞ ĐẦU 10 Phần 1: Giới thiệu công cụ GDB 11 I Tổng quan 11 Giới thiệu 11 Các ngôn ngữ lập trình mà GBD hỗ trợ 11 Lịch sử 12 II Những chi tiết kỹ thuật 13 Tính 13 Gỡ lỗi từ xa 13 Giao diện đồ họa 13 Một số câu lệnh hay dùng 13 Cú pháp GDB 15 Phần Hướng dẫn cài đặt cách sử dụng 16 I Hướng dẫn cài đặt 16 Tiến hành cài đặt 16 Kiểm tra cài đặt 18 II Hướng dẫn sử dụng 18 Chuẩn bị 18 Sử dụng GDB 19 Phần Sử dụng công cụ GDB thực tế 27 I Buffer overflow gọi Z shell 27 Tổng quan vùng nhớ stack 27 Một số ghi quan trọng 28 Ví dụ cách hoạt động 28 Tiến hành khai thác 29 II Buffer overflow thay đổi logic thực thi 37 III Vượt qua kiểm soát nghiêm ngặt 43 Phần Ưu nhược điểm so với chương trình khác 49 Ưu điểm nhược điểm 49 So sánh GDB với phần mềm debugger khác 49 Phần Kết luận 50 Phần Tài liệu tham khảo 51 DANH MỤC CÁC HÌNH ẢNH Hình Cài đặt gdb 16 Hình 2 Khởi động chương trình cài đặt 17 Hình Cài đặt gdb Windows 17 Hình Tải tuỳ chọn gói 18 Hình Kiểm tra phiên gdb Kali Linux 18 Hình Kiểm tra cài đặt Windows 18 Hình Code program C 19 Hình Biên dịch sử dụng gcc 19 Hình Load chương trình vào công cụ gdb 20 Hình 10 Xem mã code từ cơng cụ gdb 20 Hình 11 Hiển thị tồn mã 21 Hình 12 Hiển thị code dạng mã máy 21 Hình 13 Chạy chương trình với lệnh run 22 Hình 14 Chạy lệnh start step 22 Hình 15 Breakpoint 23 Hình 16 Giá trị ghi 23 Hình 17 Thay đổi giá trị ghi 24 Hình 18 Thơng tin biến 24 Hình 19 Thơng tin hàm debug 25 Hình 20 Hàm os 25 Hình 21 Thơng tin CPU 26 Hình Cấu trúc vùng nhớ stack 27 Hình Ví dụ vùng nhớ stack kiến trúc 32 bits 28 Hình 3 Tắt tính random 29 Hình Bật tính kiết xuất nhớ 30 Hình Hoạt động nhớ 30 Hình Chương trình đảm bảo offset stack 31 Hình Trình bao bọc bên 31 Hình Mã nguồn C 32 Hình Lỗi khai thác 33 Hình 10 Thơng tin ghi 33 Hình 11 Ơ nhớ 34 Hình 12 Mã assembly 35 Hình 13 Shell code 36 Hình 14 Bộ nhớ 36 Hình 15 Tấn công 37 Hình 16 Thông tin file 37 Hình 17 Kiểm tra thuộc tính file 38 Hình 18 Tổng hợp hàm 38 Hình 19 Hiển thị hàm main 39 Hình 20 Hiển thị thư viện dùng chung đoạn mã 39 Hình 21 Tìm thơng tin liên quan tới hàm 40 Hình 22 Thơng tin liên quan tới hàm 40 Hình 23 Chạy chương trình 41 Hình 24 Quan sát chương trình 42 Hình 25 Code python khai thác lỗ hổng 42 Hình 26 Khai thác thành công 43 Hình 27 Mã nguồn 44 Hình 28 Mã ASSEMBLY 45 Hình 29 Tìm vị trí EIP 45 Hình 30 Set break point 45 Hình 31.Định nghĩa điểm Hook 45 Hình 32 Ghi đè EIP 46 Hình 33 Trạng thái Stack sau ghi đè 46 Hình 34 Địa lệnh ret 46 Hình 35 Code khai thác 46 Hình 36 Khai thác thành cơng 47 Hình 37 Kiểm tra thư viện 47 Hình 38 In địa hàm system 47 Hình 39 Tìm offset /bin/sh thư viện 47 Hình 40 Code khai thác 48 Hình 41 Kết thu 48 DANH MỤC BẢNG Bảng 1 Lệnh PTRACE 14 Bảng Một số lệnh thông dụng 14 Bảng Tổng hợp lệnh hay dùng công cụ GDB 26 DANH MỤC VIẾT TẮT TỪ VIẾT TẮT IDA THUẬT NGỮ TIẾNG TIẾNG VIỆT ANH Interactive Disassembler Tương tác Disassembler IDE Integrated Development Mơi trường phát triển tích Environment hợp GCC GNU Compiler Collection Bộ trình dịch GNU GDB GNU DeBugger Trình gỡ lỗi GNU GNU GNU's Not Unix Hệ điều hành KGDB Kernel Gnu DeBugger Trình gỡ lỗi nhân LỜI MỞ ĐẦU Đối với lập trình viên thi việc gỡ lỗi khơng cịn xa lạ Gỡ lỗi công việc yêu cầu bền bỉ, tính kiên nhẫn khả tư logic trí nhớ túc trực thường xuyên Hiện có nhiều trình gỡ lỗi cung cấp giao diện Jira, DDD, IDA, … Giữa trình gỡ lỗi GDB coi phần mềm miễn phí tốt cung cấp nhiều tính ưu việt Thực tế GDB sử dụng nhiều rộng rãi ngày kể từ đời Việc sử dụng công cụ dựa nhiều vào công cụ giải vấn đề thiết lập điểm ngắt dòng cụ thể mã, thực thi chương trình C / C ++ trình gỡ lỗi theo thời gian thực quan sát giá trị thời gian thực chúng cập nhật chương trình chạy Trong báo cáo này, GDB thực khai thác mộ lỗ hổng nhớ tiếng buffer overflow Thơng qua việc giả lập chương trình bị lỗi, sau khai thác tiếp đến vào thực tế nơi chương trình đợi khám phá, từ sử dụng GDB cơng cụ hiệu để thao tác, tìm hiểu, quan sát hoạt động chương trình, nắm bắt logic chương trình 10 Phần 1: Giới thiệu công cụ GDB I Tổng quan Giới thiệu GDB cơng cụ nhóm công cụ phát triển bới GNU GNU hệ thống vận hành phần mềm miễn phí hồn toàn mắt lần đầu vào năm 1983 Richchad Stallman xây dựng nhiều người làm việc lợi ích tất ngược dùng phần mềm, tự kiểm soát máy tính họ GDB trình gỡ lỗi, hoạt động nhiều hệ thống Unix, cá biến thể hệ điều hành Windows Mac OS Làm việc với số ngơn ngữ lập trình (Ada, Assembly, C, C++) GDB, chương trình gỡ lỗi cho phép quan sát thấy điều xảy chương trình chúng thực thi kiểm tra chương trình gặp lỗi trình thực thi GDB làm việc giúp tìm lỗi chương trình: − Bắt đầu với chương trình bạn rõ điều làm ảnh hưởng đến hành vi chương trình − Làm cho chương trình bạn dừng với điều kiện cụ thể − Kiểm tra xảy với chương trình bạn, chương trình dừng lại − Thay đổi thứ có chương trình bạn, thử nghiệm cách khắc phục ảnh hưởng lỗi tiếp tục kiểm tra lỗi khác Các ngơn ngữ lập trình mà GBD hỗ trợ − − − − − − − − − − − − Ada Assembly C C++ D Fortran Go Objective-C OpenCL Modula Pascal Rust 11 Lịch sử GDB viết lần đầu Richard Stallman vào năm 1986 phần hệ thống GNU anh GDB phần mềm miễn phí phát hành giấy phép GNU General Public Licence Nó mơ trình gỡ lỗi DBX đi kèm với nhà phân phối Berkeley Unix Cho đến công cụ không ngừng phát triển để phục vụ nhu cầu người dùng Phiên cập nhập là: GDB 11.1 Released Ngày cập nhật: 13/09/2021 Trên trang web thức nhà phát triển có tên GNU Phiên nhằm khắc phục số lỗi cho phiên trước cải tiến: − Hỗ trợ cho ARM Symbian (arm * - * - symbianelf *) bị loại bỏ − Việc xây dựng GDB yêu cầu GMP (Thư viện số học xác nhiều GNU) − Hỗ trợ trình gỡ lỗi cho đối tượng − Cải tiến python − Cải tiến Guile API − Các tùy chọn dòng lệnh " early-init-command" (hoặc "-eix") " earlyinit-eval-command" (hoặc "-eiex") − Gói giao thức từ xa "qMemTags" "QMemTags" (kết hợp với Gắn thẻ nhớ) − Hỗ trợ chức gắn thẻ nhớ chung (hiện giới hạn AArch64 MTE) − Gỡ lỗi tệp lõi hỗ trợ cho chương trình Cygwin x86_64 − Tính "org.gnu.gdb.riscv.vector" cho mục tiêu RISC-V − GDB hỗ trợ loại điểm cố định mô tả DWARF dạng loại sở với mã hóa điểm cố định Ngồi ra, hỗ trợ cho DW_AT_GNU_numerator DW_AT_GNU_denominator thêm vào − GDBserver hỗ trợ cho việc giám sát mục tiêu sau: o ARC GNU/Linux o RISC-V GNU/Linux − Hỗ trợ gỡ lỗi đa mục tiêu − Cải thiện khác với Python Guile API 12 Hình 17 Kiểm tra thuộc tính file Để ý trường STACK CANARY trường bảo vệ stack disable hình No canary tức thực khai thác lỗi tràn đệm Load file vào chương trình GDB dùng lệnh: gdb Hình 18 Tổng hợp hàm Khảo sát hàm main đem lại nhiều thông tin tổng quan chương trình: Lệnh: disas main 38 Hình 19 Hiển thị hàm main Có thể thấy chương trình gọi tới hàm gets@plt hàm ta biết gets C mà khơng cần kiểm tra kích thước đầu vào thay vào dừng nhận có ký tự enter kết thúc file Ngồi ra, ký tự @plt cho ta biết plt bảng liên kết thủ tục tức cấu trúc giúp tải động liên kết dễ sử dụng Tra cứu thư viên chương trình này: Hình 20 Hiển thị thư viện dùng chung đoạn mã Ta đốn chương trình có sử dụng hàm gets thư viện dùng Để cho chắn ta nhìn vào xâu file nhị phân này: 39 Hình 21 Tìm thơng tin liên quan tới hàm Hình 22 Thơng tin liên quan tới hàm Như việc chương trình sử dụng hàm gets đem lại cho ta để khai thác lỗ hổng - lỗi tràn đệm Tiếp theo ta tiến hành khai thác: 40 Trước tiên cần hiểu logic chương trình Quay lại hàm main, phân tích xem ta thu điều hay ho khơng Ta vào phân tích dịng để lưu địa ghi rpb – tức địa frame cũ Sau đó, lưu giá trị giá ghi rsp vào rbp hay nói cách khác rbp, rsp trỏ tới vị trí (ở chế độ đọc từ trái qua phải -khác vơi vài trình biên dịch mà bạn gặp từ trái qua phải) Push %rbp Mov %rsp,%rbp Tiếp câu lệnh: Sub $0x20,%rsp , tức trỏ trỏ ngăn xếp tới vị trí %rpb – 20 tương đương với 32 bytes so với vị trí sở, điều cho ta biết biến cục chiếm 32 bytes, có liệu mà ta nhập vào từ hàm gets() Và điểm mấu chốt nằm logic chương trình: lệnh cmp %rax, -0x8(%rbp) lệnh tương đương với if else C ta tập trung vào điểm Lệnh so sánh giá trị ghi rax (hiện 0xdeadc0de) với giá trị nhớ %rbp-8 , mục tiêu chỉnh sửa cho giá trị ghi %rbp -8 để thay đổi logic chương trình Chạy chương trình: Hình 23 Chạy chương trình 41 Trước chạy, taọ điểm breakpoint để ngắt chương trình lệnh cmp để kiểm tra giá trị ghi rbp lệnh: break* - 0x00000000004011dd info registers i r Giá trị ghi rbp 0x7fffffffe4e0 Tiếp theo ta cần biết địa phần liệu nhập vào Chạy lệnh step để quan sát: Hình 24 Quan sát chương trình Thu vị trí buff 7fffffffe4c0 Tính tốn giá trị khoảng cách: d= %rbp -%buff=24, nhờ ta tính cần chèn 24 ký tự khơng cần thiết sau liệu mà ta sửa đổi: Payload: “a” * 24 + “\xde\xc0\xad\xde” Thực viết code khai thác: Hình 25 Code python khai thác lỗ hổng 42 Kết chạy chương trình: Hình 26 Khai thác thành cơng III Vượt qua kiểm soát nghiêm ngặt Phần đề cập tới khai thác lỗ hổng bị kiểm tra, cách thức bypass qua nx, aslr, dep ret2libc Mã nguồn 43 Hình 27 Mã nguồn Phân tích: Hàm gets gây lỗi tràn đệm Hàm _builtin_return_address trả địa trả stack hàm gây khó khăn việc thực khai thác lỗ hổng hàm trả “return address” nên thực ghi đè eip với địa thuộc stack khiến chương trình bị exit Trước tiên cần tìm hiểu chương trình sử dụng gdb để phân tích: Vì hàm main gọi tới hàm getpath () ta tập trung vào hàm 44 Hình 28 Mã ASSEMBLY Bước 1: Kiểm sốt eip Tìm vị trí eip cách gửi ký tự có độ dài 4bytes để xác định vị trí ghi đè Hình 29 Tìm vị trí EIP Set breakpoint: Hình 30 Set break point Định nghĩa điểm hook: Hình 31.Định nghĩa điểm Hook Kết quả: eip ghi đè ký tự có mã hex 55 tương đương với ‘U’ 45 Hình 32 Ghi đè EIP Hình 33 Trạng thái Stack sau ghi đè Bước 2: Thực chuyển luồng Thay trỏ địa eip tới vị trí stack ta trỏ tới địa thuộc khoảng hàm getpath() điều bypass nghiêm ngặt đề cập phần phân tích Hơn gọi tới hàm ret giá trị return address bị đẩy gán vào eip lúc ta gán trở lại địa khoảng stack ban đầu tức $esp= 0xbffffcb0 Hình 34 Địa lệnh ret Địa lệnh ret: 0x080484f9 Hình 35 Code khai thác Bước 3: Khai thác 46 Hình 36 Khai thác thành công Khai thác thành công ta có shell Một phương thức khác để tiếp cận vấn đề sử dụng ret2libc Ret2libc sử dụng thực tế nhiều giúp bypass chế chống thực thi ngăn nhớ stack kết hợp với kỹ thuật xác định địa nhằm hạn chế khó khăn chế ngẫu nhiên hóa nhớ gây Ret2libc thực chất thay gọi câu lệnh ret ta gọi hàm (call) thư viện c có sẵn tùy vào phiên hệ điều hành linux khác thư viện khác thực khai thác từ xa cần ý Một hàm có độ ưu tiên hàm system Bản thân gọi hàm system địa map q trình runtime mà địa khơng push vào stack địa trả địa lệnh vào đối số push vào stack Chính mà ta thu form để gọi tới hàm Bước 1: Chuẩn bị Hình 37 Kiểm tra thư viện Hình 38 In địa hàm system Hình 39 Tìm offset /bin/sh thư viện Sau cộng địa với địa thư viện tạ 0xb7e97000 ta được: addr = 0xb7fb63bf Bước 2: Tiến hành khai thác 47 Hình 40 Code khai thác Kết quả: Ta thu shell Hình 41 Kết thu 48 Phần Ưu nhược điểm so với chương trình khác Ưu điểm nhược điểm • Ưu điểm − Đặt điểm ngắt xác dịng mã − Chạy chương trình GDB (GNU Debugger) thời gian thực − Xem biến cập nhật giá trị chúng theo thời gian thực − Miễn phí − Cơng cụ thiết lập tốt có tài liệu hỗ trợ người dùng tốt Internet − Nhanh chóng để thực thi dễ tiếp cận − Khả gỡ lỗi kết xuất lõi Linux − Cơ sở để thiết lập điểm ngắt dịng mã • Nhược điểm − Rất khó gỡ lỗi Kernel phân phối Linux khác − Khó cài đặt windows So sánh GDB với phần mềm debugger khác • Immunity DeBugger Hiện nay, có nhiều phần mềm debugger phổ biến Delve, Jira, IDA cạnh tranh với GDB Nếu so đồ hoạ tính biểu diễn Immunity DeBugger vượt trội hẳn Điều khiến Immunity DeBugger dùng nhiều phiên MS windows dễ cài đặt cung cấp giao diện dễ thao tác • Jira So với Jira GDB giấy phép miễn phí, khiến cho GDB sử dụng rộng rãi Mặc dầu vậy, Jira lại đánh giá cao GDB khía cạnh sau đây: − Bug Reporting for Bug Tracking − Bug Monitoring for Bug Tracking Nhìn chung với điều kiện thích hợp Jira lựa chọn thay cho GDB 49 Phần Kết luận Qua q trình tìm hiểu việc để chương trình có lỗi stack overflow vô nguy hiểm Kẻ cơng tận dụng khai thác lỗi cho mục đích làm chương trình bị dừng lại đột ngột hay thực thi file hệ thống thông qua lỗ hổng Thậm kẻ cơng lợi dụng lỗ hổng để phá hủy hệ thống Thời điểm lỗ hổng khơng cịn phổ biến nhờ có hỗ trợ mạnh mẽ công cụ hỗ trợ việc kiểm tra đánh giá Sự phát triển mạnh mẽ ngôn ngữ lập trình có chế quản lý vùng nhớ tốt Tuy nhiên, khơng mà chủ quan việc viết chương trình 50 Phần Tài liệu tham khảo [1] Z Lin, "Buffer Overflow," in System security and malicious code analysis, Dallas, 2012 [2] Đ.N.Nguyễn, "Stack Overflow," in Kiểm thử xâm nhập, Hà Nội, 2017 [3] A Bulazel, "Syllabus and review," in Modern Binary Exploitation CSCI 4968 Spring 2015, 2015 [4] C.Del Grosso, G.Antoniol, E.Merlo, P.Galinier, "Detecting buffer overflow via automatic test input data generation," sciencedirect, 2007 [5] Paul Muntean, Vasantha Kommanapalli, Andreas Ibing, Claudia Eckert, Automated Generation of Buffer Overflow Quick Fixes Using Symbolic Execution and SMT, 2015 [6] Kyung-Suk Lhee, Steve J Chapin, "Buffer overflow and format string overflow vulnerabilities," wiley, 2003 [7] O Ruwase, MS Lam, "A Practical Dynamic Buffer Overflow Detector," cmu, 2004 51 52 ... ngăn xếp Sử dụng GDB 2.1 Thực load chương trình gdb. o vào gdb Lệnh: gdb 19 Hình Load chương trình vào cơng cụ gdb 2.2 Lệnh list Thực xem source hàm chương trình (việc thực sử dụng option... lỗi GDB coi phần mềm miễn phí tốt cung cấp nhiều tính ưu việt Thực tế GDB sử dụng nhiều rộng rãi ngày kể từ đời Việc sử dụng công cụ dựa nhiều vào công cụ giải vấn đề thiết lập điểm ngắt dịng cụ. .. đến vào thực tế nơi chương trình đợi khám phá, từ sử dụng GDB cơng cụ hiệu để thao tác, tìm hiểu, quan sát hoạt động chương trình, nắm bắt logic chương trình 10 Phần 1: Giới thiệu công cụ GDB