1. Trang chủ
  2. » Luận Văn - Báo Cáo

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI

65 947 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên cứu xây dựng mô hình phát hiện tấn công, đột nhập mạng dựa trên đối sánh chuỗi
Tác giả Nguyễn Thăng Long
Người hướng dẫn Thầy Giáo Hoàng Xuân Dậu
Trường học Học viện Công nghệ Bưu chính Viễn thông
Chuyên ngành Công nghệ thông tin
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2013
Thành phố Hà Nội
Định dạng
Số trang 65
Dung lượng 2,18 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

MỞ ĐẦU Trong lĩnh vực an ninh mạng, việc phát hiện và ngăn chặn tấn công, đột nhập là vấn đề quan trọng, thu hút nhiều sự chú ý của các nhà nghiên cứu và cộng đồng do các dạng tấn công, đột nhập trái phép ngày càng phát triển mạnh và gây nhiều thiệt hại. Phát hiện tấn công đột nhập mạng thường gặp nhiều khó khăn, thách thức do yêu cầu phải thu thập, xử lý và phân tích một lượng rất lớn dữ liệu các gói tin thu thập trên mạng. Vấn đề nâng cao hiệu năng xử lý và tính chính xác của phát hiện tấn công, đột nhập đã và đang được nghiên cứu. Một trong những hướng giải quyết có hiệu quả cho vấn đề này là ứng dụng kỹ thuật phân tích sâu gói tin nhằm phát hiện sớm những dấu hiệu tấn công, đột nhập vào hệ thống mạng. Trong kỹ thuật phân tích sâu gói tin, các giải thuật đối sánh chuỗi là yếu tố đóng vai trò quyết định tới tính chính xác và tốc độ xử lý của hệ phát hiện tấn công, đột nhập mạng. Đặc biệt, với những mạng có lưu lượng gói tin lớn, tính tối ưu của thuật toán đối sánh chuỗi càng trở nên quan trọng, được ví như chìa khóa để giải quyết bài toán phát hiện đột nhập. Hiện nay, nhiều hệ thống phát hiện tấn công, đột nhập đã được phát triển và triển khai. Bên cạnh đó, các giải thuật đối sánh chuỗi tiên tiến cũng được nghiên cứu và phát triển và tích hợp vào hệ thống phát hiện đột nhập. Mỗi thuật toán đều có những ưu-nhược điểm riêng và phát huy hiệu quả trong một miền ứng dụng cụ thể. Trong phạm vi kiến thức đại học, đồ án này sẽ tập trung nghiên cứu xây dựng mô hình phát hiện tấn công, đột nhập mạng dựa trên đối sánh chuỗi. Trên cơ sở nghiên cứu, phân tích hiệu năng , đồ án sẽ lựa chọn giải thuật đối sánh chuỗi phù hợp để tích hợp vào hệ thống phát hiện đột nhập mạng đang khảo sát. Đồ án gồm ba chương với nội dung như sau:  Chương I: Tổng quan về phát hiện đột nhập mạng Giới thiệu tổng quan về an toàn thông tin, các dạng tấn công, đột nhập và biện phát phát hiện tấn công, đột nhập mạng.  Chương II: Các giải thuật đối sánh chuỗi và ứng dụng trong phát hiện đột nhập mạng Giới thiệu tổng quan về kỹ thuật đối sánh chuỗi, nghiên cứu các giải thuật đối sánh chuỗi thông dụng và ứng dụng của đối sánh chuỗi trong phát hiện tấn công, đột nhập mạng. ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC MỞ ĐẦU VŨ DUY KHÁNH – D09HTTT3 II  Chương III: Xây dựng mô hình phát hiện đột nhập mạng dựa trên đối sánh chuỗi Trình bày việc xây dựng mô hình phát hiện đột nhập mạng dựa trên kỹ thuật đối sánh chuỗi đã nghiên cứu ở chương II, tiến hành cài đặt thử nghiệm mô hình và cung cấp một số kết quả thử nghiệm ban đầu. Nhìn chung, đồ án đã trình bày tổng quan về phát hiện đột nhập mạng và ứng dụng của thuật toán đối sánh chuỗi trong phát hiện tấn công, đột nhập mạng. Đồng thời, đồ án cũng nêu chi tiết một số giải thuật đối sánh chuỗi và so sánh hiệu năng của các thuật toán. Cuối cùng, đồ án đã nghiên cứu xây dựng mô hình phát hiện đột nhập dựa trên đối sánh chuỗi và tiến hành một vài thử nghiệm ban đầu. Tuy nhiên, do thời gian hạn hẹp và kiến thức còn nhiều hạn chế, đồ án không tránh khỏi thiếu sót. Rất mong thầy cô và các bạn quan tâm tới vấn đề này góp ý, chia sẻ để em có thể hoàn thiện kiến thức của mình.

Trang 1

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC

LỜI CẢM ƠN

Để hoàn thành đồ án này, lời đầu tiên em xin chân thành cảm ơn các thầy giáo, cô giáo khoa Công nghệ thông tin, Học viện Công nghệ Bưu chính Viễn thông, những người đã dạy dỗ, trang bị cho em những kiến thức bổ ích trong những năm học vừa qua

Em xin bày tỏ lòng biết ơn sâu sắc nhất tới thầy giáo Hoàng Xuân Dậu, người đã tận tình hướng dẫn, chỉ bảo em trong suốt thời gian làm đồ án này

Nhân dịp này em xin gửi lời cảm ơn chân thành tới gia đình, bạn bè, những người thân đã cổ vũ, động viên tiếp thêm cho em nghị lực để em hoàn thành đồ án chuyên đề

Em xin chân thành cảm ơn !

Hà Nội, ngày 20 tháng 11 năm 2013

SINH VIÊN

NGUYỄN THĂNG LONG

Trang 2

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC

NHẬN XÉT, ĐÁNH GIÁ, CHO ĐIỂM

(Của giáo viên hướng dẫn)

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

……… ………

Điểm: ……….……….Bằng chữ: ……… ……….……….)

Đồng ý/Không đồng ý cho sinh viên bảo vệ trước hội đồng đồ án tốt nghiệp? ………

Hà Nội, ngày tháng năm 20

GIẢNG VIÊN HƯỚNG DẪN

Trang 3

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Mục lục

MỤC LỤC

LỜI CẢM ƠN i

NHẬN XÉT, ĐÁNH GIÁ, CHO ĐIỂM ii

MỤC LỤC iii

DANH MỤC CÁC BẢNG, SƠ ĐỒ, HÌNH VẼ v

DANH MỤC CÁC VÍ DỤ vi

KÝ HIỆU CÁC CỤM TỪ VIẾT TẮT vii

ĐẶT VẤN ĐỀ 8

1.1 Tổng quan về an toàn bảo mật hệ thống thông tin 9

1.2 Các điểm yếu và các lỗ hổng an ninh hệ thống 12

1.2.1 Khái quát về mối đe dọa và lỗ hổng 12

1.3 Các dạng tấn công điển hình vào hệ thống thông tin 13

1.3.1 Khái quát về tấn công độc hại (Malicious Attacks) 13

1.3.2 Một số dạng tấn công điển hình 13

1.4 Mô tả bài toán 16

1.5 Kết chương 17

CHƯƠNG 2: CƠ CHẾ TẤN CÔNG LỖI TRÀN BỘ ĐỆM VÀ CÁC PHƯƠNG PHÁP PHÒNG CHỐNG 18

2.1 Giới thiệu về mô hình bộ nhớ ảo trong các hệ điều hành 18

2.1.1 Các khái niệm 18

2.1.2 Phương thức tổ chức bộ nhớ trong máy tính 19

2.1.3 Quy trình cấp phát bộ nhớ 22

2.2 Lỗi tràn bộ đệm và các kỹ thuật tấn công 24

2.2.1 Lịch sử các kỹ thuật tấn công khai thác lỗi tràn bộ đệm 24

2.2.2 Tổng quan về tấn công dựa trên lỗi tràn bộ đệm 25

2.2.3 Cơ chế tràn bộ đệm trên Stack 26

2.3 Shellcode 29

2.4 Tấn công thực thi Shellcode lợi dụng lỗi tràn bộ đệm trên Stack 33

2.4.1 Tìm chương trình chứa lỗ hổng tràn bộ đệm 35

2.4.2 Xác định cấu trúc Stack mà chương trình sử dụng 37

2.4.3 Tạo mã Shellcode muốn thực thi 40

2.4.4 Tạo chuỗi Input khai thác lỗi tràn bộ đệm để thực thi mã Shellcode 40

Trang 4

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Mục lục

2.5 Các biện pháp phòng chống tấn công lợi dụng lỗi tràn bộ đệm 44

2.5.1 Bảo vệ trong thời gian dịch 44

2.5.2 Bảo vệ trong thời gian chạy 46

2.6 Kết chương 48

CHƯƠNG 3: MÔ PHỎNG TẤN CÔNG LỖI TRÀN BỘ ĐỆM 49

3.1 Mô phỏng tấn công lỗi tràn bộ đêm trên các HĐH họ Linux 49

3.1.1 Phát hiện chương trình có lỗ hổng tràn bộ đệm 49

3.1.2 Tiến hành debug chương trình 49

3.1.3 Xây dựng chuỗi tấn công: 52

3.1.4 Kết quả demo 53

3.2 Mô phỏng tấn công lỗi tràn bộ đệm trên HĐH Windows XP 55

3.2.1 Phát hiện chương trình có lỗ hổng tràn bộ đệm 55

3.2.2 Tiến hành debug chương trình 57

3.2.3 Xây dựng chuỗi tấn công 59

3.2.4 Kết quả demo 59

PHỤ LỤC 61

TÀI LIỆU THAM KHẢO 64

Trang 5

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Danh mục các bảng, sơ đồ, hình vẽ

DANH MỤC CÁC BẢNG, SƠ ĐỒ, HÌNH VẼ

Hình 1: Tổ chức bộ nhớ ảo [16] 19

Hình 2: Dữ liệu trong Stack Frame của hàm function(int a, int b) 24

Hình 3: Dữ liệu trong StackFrame của hàmFunction(char *str) 27

Hình 4: Tràn bộ nhớ đệm trên Stack ghi đè SavedEIP 28

Hình 5: Ghi đè địa chỉ trả về và trỏ đến các vùng dữ liệu khác [16] 28

Hình 6: Trích xuất Shellcode bằng objdump (Linux) 30

Hình 7: Lấy địa chỉ sys_call bằng arwin.exe 31

Hình 8: Các hàm xử lý bộ đệm không an toàn trong C/C++ [1] 35

Hình 9: Phát hiện lỗ hổng tràn bộ đệm trên chương trình HĐH họ Linux 36

Hình 10: Phát hiện lỗ hổng tràn bộ đệm trên HĐH họ Windows 37

Hình 11: Dữ liệu trong Stack khi bị tràn trên Linux 39

Hình 12: Dữ liệu trong Stack khi bị tràn trên Windows 39

Hình 13: Mô hình xây dựng chuỗi tấn công đặt tại buffer hàm bị tràn 40

Hình 14: Dữ liệu trong bộ nhớ Stack sau khi chèn mã tấn công 41

Hình 15: Mô hình xây dựng chuỗi tấn công đặt Shellcode lên Previous StackFrame 42

Hình 16: Tìm địa chỉ lệnh JUMP ESP trong file Executable bằng Ollydmg 43

Hình 17: Dữ liệu trong bộ nhớ Stack sau khi chèn mã tấn công 43

Hình 18: Nhận biết tràn bộ đệm trong chương trình demo4 49

Hình 19: Debug chương trình bằng công cụ GDB 50

Hình 20: Dữ liệu trong các thanh ghi sau thời điểm hàm bị tràn 51

Hình 21: Dữ liệu trong Stack sau khi bộ đệm bị tràn 52

Hình 22: Xây dựng chuỗi input tấn công 53

Hình 23: Chương trình sau khi bị tiêm mã tấn công qua bộ nhập 53

Hình 24: Kiếm tra các kết nối đang mở sau khi tấn công chương trình 54

Hình 25: Giao diện chương trình Easy RM To MP3 Converter, version 2.7.3.700 55

Hình 26: Dấu hiệu Chương trình Easy RM To MP3 Converter bị tràn bộ đệm 56

Hình 27: Tìm vị trí tương đối giữa SavedEIP với ESP của Frevious StackFrame 57

Hình 28: Tìm địa chỉ lệnh JUMP ESP từ file DLL bằng Ollydmg 58

Hình 29: Xây dựng chuỗi tấn công chương trình Easy RM To MP3 Converter 59

Hình 30: Kết quả demo tấn công chương trình Easy RM To MP3 Converter 59

Trang 6

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC

DANH MỤC CÁC VÍ DỤ

Ví dụ 1: chương trình exampleCode1.c [2] 22

Ví dụ 2: Chương trình exampleCode2.c [2] 27

Ví dụ 3: Mã Assembly thực thi hàm system_exit(): exit.asm 30

Ví dụ 4: Mã Assembly chương trình sleep.asm 31

Ví dụ 5: Chương trình demoPushStack.asm 33

Ví dụ 6: Truyền tham số cho chương trình bằng Python 38

Ví dụ 7: Chương trình Perl Script tạo file tấn công input.pl 56

Ví dụ 8: Chương trình Perl Script tạo file tấn công input.pl làm tràn vừa đủ bộ đệm 56

Ví dụ 9: Xây dựng chương trình Perl Script tạo file tấn công demo1.pl 57

Ví dụ 10 Xây dựng chương trình Perl Script tạo file tấn công demo2.pl 58

Trang 7

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Ký hiệu các cụm từ viết tắt

KÝ HIỆU CÁC CỤM TỪ VIẾT TẮT

Từ viết tắt Nghĩa tiếng anh Nghĩa tiếng việt

HĐH Operating System Hệ điều hành

NOP No-Operation Lệnh rỗng không thực hiện tác vụ hữu ích SQL Structured Query Language Ngôn ngữ truy vấn có cấu trúc

FP Frame Pointer Con trỏ khung Stack

EIP Extended Instruction Pointer Thanh ghi con trỏ lệnh

ESP Extended Stack Pointer Thanh ghi con trỏ Stack

EBP Extended Base Pointer Thanh ghi con trỏ cơ sở Stack

SavedEIP Saved Extends Instruction

Pointer

Giá trị con trỏ lệnh ngay trước thời điểm hàm được gọi

SavedEBP Saved Extended Base Pointer Giá trị thanh ghi con trỏ cơ sở Stack của

khung Stack của hàm trước đó

Trang 8

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Đặt vấn đề

ĐẶT VẤN ĐỀCùng với việc ứng dụng ngày càng rộng rãi máy tính và các phần mềm ứng dụng trong xử lý thông tin phục vụ cuộc sống, các dạng tấn công vào hệ thống máy tính, hệ điều hành, tấn công vào các dịch vụ và phần mềm ứng dụng đã phát triển nhanh chóng

và gây ra nhiều thiệt hại Một trong các dạng tấn công vào hệ thống máy tính tiêu biểu

là kỹ thuật tấn công khai thác lỗi tràn bộ nhớ đệm Các lỗi tràn bộ đệm có thể làm chương trình ngừng hoạt động, hoặc có thể bị kẻ tấn công lợi dụng để truy nhập trái phép, hoặc chiếm quyền điều khiển hệ thống Các lỗi tràn bộ đệm được đánh giá là loại lỗ hổng an ninh nghiêm trọng

Mặc dù lỗ hổng tràn bộ đệm đã được phát hiện và khai thác từ khá lâu, các nguy

cơ cũng như tác hại của lỗ hổng này gây ra cho các hệ thống bị tấn công là rất cao Trong khi đó, việc phòng tránh và loại trừ nguy cơ tấn công dựa trên lỗi tràn bộ đệm lại phụ thuộc rất nhiều vào kiến thức và kinh nghiệm của người lập trình Do đó việc nghiên cứu sâu về cơ chế của tấn công dựa trên lỗi tràn bộ đệm là quan trọng, giúp người lập trình hiểu được cơ chế của tấn công lợi dụng lỗ hổng này, từ đó có những phương án xây dựng những hệ thống an toàn Đây cũng là lý do em chọn đề tài

“Nghiên cứu về tấn công lỗi tràn bộ đệm trong phần mềm và phòng chống” làm đồ án

tốt nghiệp đại học của mình

Nội dung đồ án gồm có ba chương và phần kết luận:

Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công hệ thống:

Giới thiệu tổng quan về hệ thống thông tin, an toàn bảo mật hệ thống thông tin, các lỗ hổng bảo mật và các dạng tấn công hệ thống thông tin thông dụng

Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và phương pháp phòng chống Trình bày phương pháp tổ chức và cấp phát bộ nhớ ảo cho chương trình, cơ chế gây tràn bộ đệm, tấn công lợi dụng lỗ hổng tràn bộ đệm trên Stack và phương pháp tạo Shellcode Thêm vào đó, chương này còn đề cập các phương pháp phòng chống tấn công bộ nhớ đệm hiệu quả nhằm giúp xây dựng nên các hệ thống an toàn

Chương 3: Demo cơ chế tấn công lỗi tràn bộ đệm trên HĐH họ Linux và HĐH họ Windows

Chương này trình bày chi tiết phương pháp tấn công lợi dụng lỗ hổng tràn bộ đệm trên cả hai HĐH họ Linux (Đại diện là Ubuntu 12.04 LTS) và HĐH họ Windows (Đại diện là Windows XP SP2)

Trang 9

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

CHƯƠNG 1: TỔNG QUAN VỀ CÁC LỖ HỔNG BẢO MẬT

VÀ CÁC DẠNG TẤN CÔNG HỆ THỐNG

Chương 1 trình bày tổng về an toàn bảo mật hệ thống thông tin và một số lỗ hổng cũng cũng như một số dạng tấn công hệ thống thông tin điển hình

1.1 Tổng quan về an toàn bảo mật hệ thống thông tin

1.1.1 Khái niệm hệ thống thông tin

Hệ thống thông tin (Information System) là một hệ thống tích hợp các thành phần nhằm phục vụ việc thu thập, lưu trữ, xử lý và trao đổi thông tin, tri thức và các sản phẩm số Hệ thống thông tin ngày nay được các doanh nghiệp và các tổ chức sử dụng phổ biến với nhiều mục đích khác nhau để thực hiện và quản lý một số hoạt động như [3][12]:

- Tương tác với khách hàng;

- Tương tác với các nhà cung cấp;

- Tương tác với các tổ chức chính quyền;

- Quảng bá thương hiệu và sản phẩm

Nhìn chung, một hệ thống thông tin thường gồm 5 thành phần cơ bản:

- Các thiết bị phần cứng;

- Các chương trình phần mềm;

- Các cơ sở dữ liệu;

- Hệ thống truyền thông và nhân sự

Do các hệ thống thông tin ngày càng được sử dụng rộng rãi và phục vụ cho nhiều mục đích khác nhau, nên việc phân loại các hệ thống thông tin chỉ mang tính tương đối Một số hệ thống thông tin điển hình được sử dụng:

- Các hệ thống kho dữ liệu (Data Warehouses);

- Các hệ thống lập kế hoạch nguồn nhân lực doanh nghiệp (Enterprise Resource Planning);

- Các hệ thống thông tin doanh nghiệp (Enterprise Systems);

- Các hệ chuyên gia (Expert Systems) ;

- Các máy tìm kiếm (Search Engines) ;

- Các hệ thống thông tin địa lý (Geographic Information Systems);

- Các hệ thống thông tin toàn cầu (Global Information Systems);

- Các hệ tự động hóa văn phòng (Office Automation)

Trang 10

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

1.1.2 Hệ thống thông tin dựa trên máy tính

Một hệ thống thông tin dựa trên máy tính (Computer-Based Information System - CBIS) là một hệ thống thông tin trong đó sử dụng công nghệ máy tính để thực thi một phần hoặc toàn bộ công việc của hệ thống thông tin Hệ thống thông tin dựa trên máy tính gồm có các thành phần cơ bản:

- Hardware: Phần cứng để thu thập, lưu trữ, xử lý và biểu diễn dữ liệu

- Software: Các phần mềm chạy trên phần cứng hoặc hệ điều hành để xử lý dữ liệu

- Databases: Lưu trữ dữ liệu

- Networks: Hệ thống truyền dẫn thông tin/dữ liệu

- Procedures: Tập hợp các lệnh kết hợp các bộ phận nêu trên để xử lý Bao gồm các chiến lược, các chính sách, phương thức và các quy tắc sử dụng CBIS

- People: Con người quản lý việc thực thi của hệ thống – thành phần quan trọng trong hầu hết các CBIS

1.1.3 An toàn bảo mật hệ thống thông tin

An toàn thông tin là việc bảo vệ chống truy nhập, sử dụng, tiết lộ, sửa đổi hoặc phá hủy thông tin một cách trái phép Các hệ thống và dịch vụ xử lý thông tin có khả năng chống lại những can thiệp, lỗi và những tai họa không mong đợi, đảm bảo các thay đổi tác động đến an toàn của hệ thống là nhỏ nhất

Ngày nay, do việc ứng dụng máy tính trong việc lưu trữ, xử lý thông tin rất phổ biến, nên rất cần các cơ chế đủ mạnh bảo vệ thông tin theo đặc thù hoạt động của máy tính Do đó xuất hiện thêm yêu cầu đảm bảo an toàn hoạt động của hệ thống máy tính

đi kèm với yêu cầu đảm bảo an toàn của hệ thống thông tin An toàn thông tin bao hàm hai lĩnh vực chính:

- An toàn công nghệ thông tin (IT Security), đôi khi còn được gọi là an toàn máy tính (Computer Security), là an toàn thông tin áp dụng cho các hệ thống công nghệ Các hệ thống công nghệ áp dụng của tổ chức cần được đảm bảo an toàn trước các cuộc tấn công

- Đảm bảo thông tin (Information Assurance) là việc đảm bảo thông tin không bị mất khi xảy ra các sự cố (trộm cắp, phá hoại, thiên tai, hỏng hóc, chiến tranh, …)

An toàn hệ thống thông tin (Information System Security) là việc đảm bảo các

thuộc tính an ninh, an toàn của hệ thống thông tin, bao gồm tính bí mật (Confidentiality), tính toàn vẹn (Integrity) và tính sẵn sàng (còn gọi là khả dụng hoặc

sẵn dùng) của thông tin (Availability)

Trang 11

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

1.1.3.1 Tính bí mật của thông tin (Confidentiality)

Đặc trưng này còn được gọi là tính giới hạn về đối tượng được quyền truy xuất thông tin Theo đó chỉ những đối tượng có thẩm quyền mới được phép truy nhập vào thông tin hoặc hệ thống Mọi hành vi truy nhập vào thông tin hoặc hệ thống mà đối tượng thực hiện không được phép đều được coi là vi phạm.Các thông tin bí mật có thể gồm:

- Dữ liệu riêng cá nhân

- Các thông tin thuộc quyền sở hữu trí tuệ của các doanh nghiệp hoặc các tổ chức

- Các thông tin liên quan đến an ninh quốc gia

1.1.3.2 Tính toàn vẹn của thông tin (Integrity)

Đặc trưng này có ý nghĩa đảm bảo sự tồn tại nguyên vẹn của thông tin Mọi sự thay đổi thông tin không có chủ đích của đối tượng được cấp quyền đều là vi phạm Sự toàn vẹn của thông tin trong một số trường hợp có ý nghĩa tương đương với sự đảm bảo tính xác thực nguồn gốc của thông tin [3]

Tính toàn vẹn liên quan đến tính hợp lệ (Validity) và tính chính xác (Accuracy)

của dữ liệu Trong nhiều trường hợp, mọi thay đổi không có thẩm quyền gây ảnh hưởng rất lớn đến giá trị của thông tin

Dữ liệu là toàn vẹn nếu thỏa mãn các yêu cầu sau:

- Dữ liệu không bị thay đổi bởi đối tượng không có thẩm quyền

- Dữ liệu là hợp lệ

- Dữ liệu là chính xác

1.1.3.3 Tính sẵn sàng của thông tin (Avaibility)

Đặc trưng này có ý nghĩa đảm bảo tính khả dụng của thông tin cho tất cả các yêu cầu truy xuất đến từ các đối tượng hợp lệ Trong thực tế đặc trưng này được xem là nền tảng quan trọng nhất để xây dựng nên hệ thống an toàn, vì nếu hệ thống không đảm bảo tính sẵn sàng thì ý nghĩa quản lý thông tin của hệ thống sẽ không còn

Tính sẵn sàng có thể được đo bằng các yếu tố [3]:

- Thời gian cung cấp dịch vụ (Uptime)

- Thời gian ngừng cung cấp dịch vụ (Downtime)

- Tỷ lệ phục vụ: A = (Uptime)/(Uptime + Downtime)

- Thời gian trung bình giữa các sự cố

- Thời gian trung bình ngừng để sửa chữa

- Thời gian khôi phục sau sự cố

Trang 12

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

1.2 Các điểm yếu và các lỗ hổng an ninh hệ thống

1.2.1 Khái quát về mối đe dọa và lỗ hổng

1.2.1.1 Mối đe dọa (Threat)

Mối đe dọa là bất kỳ hành động nào có thể gây tổn hại đến các tài nguyên hệ thống (phần cứng, phần mềm, các file, dữ liệu, CSDL, … hoặc hạ tầng mạng vật lý,

…) Tuy nhiên không phải toàn bộ các mối đe dọa đều là độc hại, và mối đe dọa cũng

có thể được tạo nên từ nguyên nhân vô tình hoặc khách quan

Các mối đe dọa thường gặp có thể gồm [3]:

- Phá hoại của các phần mềm độc hại

- Hư hỏng phần cứng hoặc phần mềm

- Kẻ tấn công ở bên trong

- Mất trộm các thiết bị

- Kẻ tấn công ở bên ngoài

- Tai họa thiên nhiên

1.2.1.2 Lỗ hổng (Vulnerability)

Lỗ hổng là bất kỳ khiếm khuyết hoặc điểm yếu nào trong hệ thống có thể tạo điều kiện cho phép một mối đe dọa gây tác hại Các lỗ hổng an ninh tồn tại trong cả 7 vùng của nền tảng CNTT, gồm [3]:

- Lỗi tràn bộ đệm (Buffer Overflows);

- Không kiểm tra đầu vào (Unvalidated Input);

- Các vấn đề với điều khiển truy cập (Access-Control Problems);

- Các điểm yếu trong xác thực, trao quyền (Weaknesses in Authentication, Authorization);

- Các điểm yếu trong các hệ mật mã (Weaknesses in Cryptographic Practices)

Trang 13

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

Mối đe dọa và lỗ hổng an ninh có mối quan hệ hữu cơ với nhau Các mối đe dọa thường tận dụng khai thác một hoặc tập hợp các lỗ hổng đã biết để tìm cách thực hiện các cuộc tấn công phá hoại hệ thống.Nếu tồn tại một lỗ hổng an ninh trong hệ thống,

sẽ có khả năng lỗ hổng đó bị một mối đe dọa tận dụng và thông qua đó thực hiện thành công cuộc tấn công vào hệ thống Chúng ta không thể loại trừ hết được các mối

đe dọa, tuy nhiên hoàn toàn có thể giảm thiểu các lỗ hổng, nhờ vậy giảm thiểu được khả năng bị tận dụng để tấn công

1.3 Các dạng tấn công điển hình vào hệ thống thông tin

1.3.1 Khái quát về tấn công độc hại (Malicious Attacks)

Tấn công độc hại là cuộc tấn công vào hệ thống máy tính hoặc các tài nguyên mạng được thực hiện bằng cách khai thác các lỗ hổng tồn tại trong hệ thống, nhằm truy nhập trái phép vào thông tin, hệ thống hoặc các tài nguyên mạng

Tấn công có thể chia thành 4 loại chính:

- Giả mạo (Fabrications): Giả mạo thông tin thường để đánh lừa người dùng thông thường;

- Chặn bắt (Interceptions): Liên quan đến việc nghe trộm trên đường truyền và chuyển hướng thông tin để sử dụng trái phép;

- Gây ngắt quãng (Interruptions): Gây ngắt kênh truyền thông ngăn cản việc truyền dữ liệu;

- Sửa đổi (Modifications): Liên quan đến việc sửa đổi thông tin trên đường truyền hoặc sửa đổi dữ liệu file

Theo phương thức thực hiện, tấn công có thể chia thành hai kiểu:

- Tấn công chủ động (Active attacks): Là các dạng tấn công thực hiện sửa đổi dữ liệu trên đường truyền, dữ liệu trong file, hoặc chiếm quyền truy nhập trái phép vào hệ thống máy tính hoặc hệ thống mạng Tấn công chủ động thường là một đột nhập (Intrusion) về mặt vật lý

- Tấn công thụ động (Passive attacks): Là dạng tấn công không gây ra thay đổi trên hệ thống, như nghe trộm, hoặc giám sát lưu lượng trên đường truyền

1.3.2 Một số dạng tấn công điển hình

Các dạng tấn công điển hình bao gồm, tấn công vào mật khẩu, tấn công bằng mã độc, tấn công từ chối dịch vụ, tấn công giả mạo địa chỉ IP, tấn công nghe trộm, tấn công kiểu người đứng giữa, tấn công bằng bom thư, tấn công sử dụng cửa hậu và tấn công kiểu Social Engineering Phần tiếp theo, đồ án sẽ phân tích chi tiết từng kiểu tấn công trên

Trang 14

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT 1.3.2.1 Tấn công vào mật khẩu

Tấn công vào mật khẩu là dạng tấn công nhằm đánh cắp thông tin tài khoản và mật khẩu của đối tượng để giả danh người sử dụng truy xuất trái phép vào tài nguyên

hệ thống.Tấn công mật khẩu thường có hai dạng:

- Tấn công dựa vào từ điển (Dictionary attacks): Dựa vào xu hướng đặt mật khẩu của người dùng là các thông tin có liên quan đến bản thân họ, hoặc mật khẩu dễ nhớ như: tên, tuổi, ngày sinh, người thân, dãy số, … Từ đó kẻ tấn công dựa xây dựng nên tập các mật khẩu có khả năng được người dùng sử dụng và thử các mật khẩu này

- Tấn công kiểu vét cạn (Brute force attacks): Sử dụng công cụ và máy móc tiến hành tổ hợp lần lượt toàn bộ các ký tự và thử mật khẩu một cách tự động Phương pháp này thường sử dụng để tìm ra mật khẩu khi đã nắm được dạng mã hóa của mật khẩu

sẽ được thực hiện bởi máy chủ SQL

+ Kẻ tấn công lừa đảo người dùng tải, cài đặt và thực thi các phần mềm độc hại: Các phần mềm Adware, Spyware, Virus, Trojan, … được che giấu dưới dạng một phần mềm hữu ích khiến người dùng vô tình cài đặt và thực thi trên hệ thống của mình

1.3.2.3 Tấn công từ chối dịch vụ

Tấn công từ chối dịch vụ (DoS- Denial of Service attacks) chỉ nhằm mục đích ngăn chặn hoạt động bình thường của hệ thống, đặc biệt đối với các hệ thống phục vụ trên mạng công cộng như thiết bị định tuyến, Web service, Mail server, Các kỹ thuật thường dùng để gây ra các tấn công từ chối dịch vụ truyền thống là SYN Flood, Ping-of-Death và Buffer-overflow

+ SYN Flood: Tấn công kiểu SYN flood lợi dụng cách thức hoạt động của việc thiết lập kết nối TCP/IP, kẻ tấn công bắt đầu quá trình thiết lập một kết nối TCP/IP tới máy mục tiêu (máy tính đích) muốn tấn công bằng gói tin yêu cầu thiết lập kết nối SYN với địa chỉ IP nguồn giả mạo, hoặc địa chỉ không có thực Máy tính đích gửi gói

Trang 15

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

tin SYN ACK yêu cầu xác nhận kết nối, nhưng không thể đi đến đích do địa chỉ IP nguồn là không có thực Máy tính đích phải duy trì yêu cầu kết nối cho đến khi nhận được SYN ACK hoặc hết thời hạn kết nối Kiểu tấn công SYN flood cũngcó thể được các kẻ tấn công áp dụng để tấn công một hệ thống mạng có băng thông lớn với một số lượng lớn gói tin yêu cầu thiết lập kết nối

+ Ping-of-Death: Tấn công kiểu Ping-of-Death sử dụng giao thức ICMP Một lệnh ping thông thường sẽ có hai thông điệp là echo request và echo reply Khi tấn công bằng Ping-of-Death kẻ tấn công sẽ gửi một gói tin echo request có kích thước lớn hơn 65,536 bytes Các gói tin này sẽ được chia nhỏ thành các segment nhỏ hơn để gửi

đi trên đường truyền, nhưng khi máy đích nhận được các gói tin này và ráp chúng lại thì gói tin lại quá lớn so với bộ đệm của máy Kết quả là hệ thống không thể kiểm soát được sự bất thường, dẫn đến tình trạng khởi động lại hoặc bị treo

+ Buffer-over-flow: Hoạt động bằng cách lợi dụng lỗ hổng tràn bộ đệm trên hệ thống nạn nhân, từ đó kẻ tấn công gửi đi các gói tin gây tràn bộ đệm khiến cho chương trình trên hệ thống bị tấn công ngừng hoạt động

+ Tấn công từ chối dịch vụ phân tán (Distributed DoS- DDos): Phương thức tấn công DDoS dựa trên nguyên tắc của DoS nhưng có mức độ nguy hiểm cao hơn do kẻ tấn công có thể huy động cùng lúc rất nhiều máy tính bị điều khiển tham gia

1.3.2.4 Tấn công giả mạo địa chỉ IP (IP Spoofing)

Tấn công giả mạo địa chỉ IP là dạng tấn công trong đó kẻ tấn công sử dụng địa chỉ IP giả, thường để đánh lừa máy nạn nhân để vượt qua hàng rào kiểm soát an ninh Dạng tấn công này có thể được sử dụng trong trường hợp kẻ tấn công giả IP thành địa chỉ cục bộ của mạng LAN, từ đó có thể tấn công vào các máy khác trong mạng LAN

do thường chính sách an ninh giữa các máy trong LAN với nhau sẽ giảm nhẹ

1.3.2.5 Tấn công nghe trộm

Tấn công nghe trộm là dạng tấn công không được thực hiện trực diện vào các máy người dùng (client) hay máy chủ (server) mà nó thường nhằm vào phương tiện truyền dữ liệu giữa các máy Kẻ tấn công có thể sử dụng thiết bị phần cứng hoặc phần mềm, lắng nghe trên một thành phần của hệ thống mạng như: Card mạng, Hub, Router

… để chặn bắt các gói tin di chuyển qua Từ đó sử dụng các kỹ thuật phân tích các gói tin thu được nhằm lấy cắp thông tin tài khoản, đánh cắp nội dung email hoặc các file được truyền qua mạng (file đính kèm trong email, hoặc truyền qua các giao thức SMB, FTP)

1.3.2.6 Tấn công kiểu người đứng giữa (Man in the middle)

Tấn công kiểu người đứng giữa lợi dụng quá trình lưu chuyển gói tin đi qua nhiều trạm trên nhiều mạng khác nhau Kẻ tấn công khi đó sẽ chặn bắt các thông điệp trao đổi giữa hai bên tham gia giao tiếp, sau đó chuyển tiếp lại cho bên kia sau khi thông điệp có thể đã được xử lý Nạn nhân của kiểu tấn công người đứng giữa không hay biết

Trang 16

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

về việc xen giữa này mà vẫn cứ tin tưởng rằng họ đang giao tiếp trực tiếp với nạn nhân bên kia

1.3.2.7 Tấn công bằng bom thư

Tấn công bằng bom thư (Mail bombing) cũng là một dạng tấn công DoS khi kẻ tấn công chuyển một lưu lượng lớn email đến hòm thư điện tử của nạn nhân Phương pháp này thường thực hiện được nhờ khai thác lỗi trong hệ thống gửi nhận mail SMTP hoặc do các máy chủ mail cấu hình không tốt

1.3.2.8 Tấn công sử dụng cửa hậu (Back doors hoặc Trap doors):

Kẻ tấn công bằng một cách nào đó cài một cửa hậuvào máy tính của nạn nhân, thường là hậu quả của hacker để lại sau khi tấn công vào hệ thống Sau đó sử dụng chính backdoor để quay lại can thiệp khai thác thêm thông tin và sử dụng cho nhiều mục đích

1.3.2.9 Tấn công kiểu Social Engineering

Tấn công kiểu Social Engineering là kiểu tấn công sử dụng các kỹ thuật xã hội nhằm thuyết phục người dùng cung cấp các thông tin truy nhập hoặc các thông tin có giá trị đối với kẻ tấn công Kẻ tấn công có thể một số phương pháp sau:

- Kẻ tấn công giả dạng là người ở chức vụ cao hơn so với nạn nhân để có được sự tin tưởng để nạn nhân cung cấp thông tin

- Kẻ tấn công mạo nhận là người được ủy quyền của người có thẩm quyền để yêu cầu nạn nhân tiếp lộ thông tin

- Kẻ tấn công lập ra các trang web giả nhằm đánh lừa người dùng cung cấp các thông tin như tài khoản, thẻ tín dụng, …

1.4 Mô tả bài toán

Đề tài của đồ án "Nghiên cứu về tấn công lỗi tràn bộ đệm trong phần mềm và phòng chống" được thực hiện với các nội dung chính như sau:

 Nghiên cứu về các dạng lỗi tràn bộ đệm và cơ chế xảy ra lỗi tràn bộ đệm;

 Nghiên cứu các kỹ thuật tấn công lợi dụng lỗi tràn bộ đệm;

 Đề xuất các biện pháp phòng chống giảm thiểu khả năng bị tấn công lợi dụng lỗi tràn bộ đệm;

 Xây dựng một số kịch bản và cài đặt demo tấn công lợi dụng lỗi tràn bộ đệm

Trang 17

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 1: Tổng quan về các lỗ hổng bảo mật và các dạng tấn công HT

1.5 Kết chương

Chương 1 giới thiệu tổng quan về an toàn bảo mật hệ thống thông tin, các mối đe dọa, các dạng lỗ hổng an ninh và một số dạng tấn công thông dụng vào hệ thống thông tin Đảm bảo an toàn thông tin và hệ thống thông tin là phải đảm bảo được 3 thuộc tính cốt yếu, gồm tính bí mật, tính toàn vẹn và tính sẵn dùng Các dạng tấn công độc hại có thể vi phạm một, một số hoặc tất cả các thuộc tính trên Nhiều cuộc tấn công có thể thực hiện thành công nhờ khai thác các lỗ hổng an ninh tồn tại trong hệ thống Một trong các dạng lỗ hổng an ninh thường hay xảy ra và bị lợi dụng nhiều nhất là lỗ hổng tràn bộ nhớ đệm Chương 2 sẽ phân tích chi tiết cơ chế xảy ra lỗi tràn bộ đệm và các

kỹ thuật tấn công lợi dụng lỗ hổng này

Trang 18

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

CHƯƠNG 2: CƠ CHẾ TẤN CÔNG LỖI TRÀN BỘ ĐỆM

VÀ CÁC PHƯƠNG PHÁP PHÒNG CHỐNG

Chương 2 trình bày phương pháp tổ chức và cấp phát bộ nhớ ảo cho chương trình, cơ chế gây tràn bộ đệm, tấn công lợi dụng lỗ hổng tràn bộ đệm trên Stack và phương pháp tạo mã thực hiện Shellcode Phần cuối chương đề cập một số các phương pháp phòng chống tấn công bộ nhớ đệm hiệu quả nhằm giúp xây dựng nên các hệ thống an toàn

2.1 Giới thiệu về mô hình bộ nhớ ảo trong các hệ điều hành

2.1.1 Các khái niệm

2.1.1.1 Buffer

Buffer hay bộ đệm là một khối dành riêng của bộ nhớ máy tính, cho phép chứa nhiều các phần tử của cùng kiểu dữ liệu Với ngôn ngữ lập trình C, Buffer thường được tổ chức dưới dạng là mảng của các từ nhớ

2.1.1.2 Stack

Stack hay ngăn xếp là một kiểu dữ liệu trừu tượng dùng trong khoa học máy tính Một Stack của các đối tượng (Object) có tính chất: Đối tượng được đưa vào Stack cuối cùng sẽ được lấy ra đầu tiên (LIFO – Last In First Out) Stack hỗ trợ 2 thao tác quan trọng nhất là PUSH và POP để thực hiện việc thêm một đối tượng vào Stack và loại bỏ

1 đối tượng khỏi Stack

Trong lập trình cấu trúc, các chương trình được chia ra thành các mô đun nhỏ, được gọi là các chương trình con, hay thủ tục hoặc hàm Các chương trình con có thể được gọi thực hiện bởi chương trình chính, hoặc có thể gọi lẫn nhau Mỗi chương trình con được gọi thực hiện sẽ làm thay đổi luồng điều khiển của chương trình, tương tự như lệnh nhảy (JUMP) Nhưng không giống như JUMP, khi kết thúc việc thực hiện một chương trình con, nó sẽ trả điều khiển về cho chương trình gọi Stack được sử dụng để lưu các tham số cho việc gọi thực hiện và trở về từ các chương trình con [2] Stack cũng được dùng để tự động gán địa chỉ cho: các biến địa phương (Local variables), các tham số truyền vào (Parameters) và các kết quả trả về của chương trình con

2.1.1.3 Thanh ghi

Thanh ghi là các ô nhớ có dung lượng nhỏ nằm trong nhân CPU có tốc độ truy cập cao, được sử dụng để tăng tốc độ xử lý các lệnh của chương trình trên máy tính bằng cách cung cấp các truy cập trực tiếp đến các giá trị cần sử dụng Hầu hết các máy tính hiện đại hoạt động theo nguyên lý là chuyển dữ liệu từ bộ nhớ sang các thanh ghi,

Trang 19

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

sau đó việc tính toán sẽ được thực hiện trên các thanh ghi này rồi kết quả được chuyển lại về bộ nhớ [19]

Một số thanh ghi được sử dụng trong đồ án:

- EIP (Extended Instruction Pointer): Thanh ghi con trỏ lệnh, dùng để chứa địa chỉ của lệnh tiếp theo cần thực hiện

- ESP (Extended Stack Pointer): Thanh ghi con trỏ Stack, dùng để chứa địa chỉ của đỉnh ngăn xếp (Stack)

- EBP (Extended Base Pointer): Thanh ghi con trỏ cơ sở Stack, dùng để chứa địa chỉ đến một Stack Frame trong Stack

2.1.2 Phương thức tổ chức bộ nhớ trong máy tính

Bộ nhớ ảo là một phương thức tổ chức quản lý hệ thống nhớ, trong đó bộ nhớ được hệ điều hành tổ chức thành các vùng nhớ với các chức năng riêng biệt tạo thuận lợi cho việc tổ chức lưu trữ và xử lý Thông thường, bộ nhớ ảo tổ chức thành ba vùng:

Text region, Data region và Stack region Tương ứng với mỗi vùng khi các tiến trình

được thực thi, các dữ liệu liên quan đến một tiến trình sẽ được tải vào các vùng tương ứng Sơ đồ tổng quan cấu trúc tổ chức bộ nhớ ảo trong máy tính được thể hiện như Hình 1

Hình 1: Tổ chức bộ nhớ ảo [16]

Trang 20

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Trong phần tiếp theo, đồ án chủ yếu tập trung vào Stack region nhằm phục vụ cho mục đích tiếp theo đó là nghiên cứu lỗ hổng tràn bộ đệm trên Stack

2.1.2.1 Text region (Code segment)

Vùng dữ liệu này được cố định bởi chương trình, chứa các mã lệnh (Instruction)

và dữ liệu chỉ đọc (Read-only Data) của chương trình Text region phản hồi tới Text region của file thực thi (Executable file)

Text region thường được tạo là chỉ đọc (Read-only) hoặc sẽ hoạt động ở chế độ

tự bảo vệ thay đổi (Self-modifying mode) Mọi nỗ lực nhằm thay đổi nội dung dữ liệu trong vùng này đều được coi là vi phạm [10]

2.1.2.2 Data region (Data segment)

Data region = Data + BSS + Heap [11]

- Data: chứa các biến toàn cục (Global Variable) và các biến tĩnh đã được khởi tạo (Static Variable) được khai báo bởi người lập trình

- BSS: chứa các biến chưa được khởi tạo hoặc khởi tạo không rõ ràng, phản hồi tới khu vực Data-BSS của file thực thi được (Executable file) Dữ liệu trong Data region có thể đọc/ghi (Read-write)

- Heap: Địa chỉ bắt đầu ngay sau kết thúc của BSS và có thể phát triển kích thước tăng dần trong quá trình thực thi Việc cấp phát và thu dọn bộ nhớ trong Heap được thực hiện qua các lời gọi malloc() , realloc()vàfree() Lời gọi hệ thống brk() và sbrk() được dùng để điều chỉnh kích cỡ (resize) của Heap Vùng Heap được chia sẻ bởi tất cả các thư viện chia sẻ và các module nạp động trong tiến trình Kích thước của Data region không cố định mà có thể thay đổi được bởi lời gọi hệ thống BRK/SBRK (thay đổi kích cỡ của Heap), được xác định bằng các giá trị đặt trong nó trước khi chương trình được biên dịch Trong thời gian chạy (run-time), kích

cỡ của vùng này không thay đổi

Nếu kích cỡ của Data-BBS lớn hoặc do ngăn xếp (Stack) sử dụng hết bộ nhớ sẵn

có, chương trình hoặc tiến trình sẽ bị khoá và được lập lịch lại để chạy với dung lượng

bộ nhớ lớn hơn Phần bộ nhớ cần lấy thêm sẽ được lấy ở vùng nhớ nằm giữa Data region và Stack region [11]

Kích thước của Data region tăng theo chiều tăng của địa chỉ bộ nhớ ảo

2.1.2.3 Stack region

Stack có một thanh ghi (ESP) gọi là con trỏ Stack (Stack pointer) luôn trỏ tới đỉnh của Stack Đáy của Stack là một địa chỉ cố định Kích cỡ của Stack được điều chỉnh động bởi nhân của hệ điều hành (Kernel) trong thời gian thực thi (Run-time) CPU thực hiện các lệnh PUSH và POP với Stack

Trang 21

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Stack gồm các khung, gọi là Stack Frame Các Stack Frame được thêm vào khi gọi một hàm (function) và được loại bỏ ra khỏi Stack khi trở về từ hàm Một Stack Frame gồm: các tham số của hàm, các biến địa phương của hàm đó, và các dữ liệu cần thiết để khôi phục khung Stack trước để quay về hàm gọi (Previous Stack Frame) – Dữ liệu này gồm: Giá trị của con trỏ lệnh vào thời điểm hàm được gọi (SavedEIP) và địa chỉ đầu tiên của Stack Frame (Frame Pointer) của hàm trước đó (SavedEBP)

Tuỳ thuộc vào bộ vi xử lý (VXL) mà Stack sẽ đánh địa chỉ tăng hoặc giảm Cách đánh địa chỉ giảm dần được nhiều VXL sử dụng, như trong các VXL Intel, Motorola, SPARC và MIPS Đối với Stack Pointer do luôn trỏ vào đỉnh của Stack với địa chỉ thấp nhất, nên để tiện lợi hơn cho việc truy xuất tới các biến, các đối số của hàm sẽ có một con trỏ khung FP (Frame Pointer) sẽ luôn trỏ tới một địa chỉ cố định trong một khung (Thường là địa chỉ bắt đầu của Stack Frame) – một số nơi gọi là LP (Local base Pointer) [2]

Stack Pointer có thể trỏ vào địa chỉ cuối của Stack hoặc trỏ vào địa chỉ còn trống

kế tiếp của Stack phụ thuộc vào thiết kế của VXL Giá trị của biến SP được lưu trong thanh ghi ESP

Theo nguyên tắc, biến địa phương có thể được tham chiếu bằng việc tính hiệu số (offsets) từ SP Tuy nhiên, với những từ nhớ được đưa vào hoặc lấy ra khỏi Stack, những offsets này bị thay đổi Mặc dù trong một số trường hợp trình biên dịch có thể theo dõi thứ tự của những từ trong Stack và sửa những offsets, tuy nhiên một số trường hợp thì lại không như vậy

Trong một số VXL, như VXL Intel, việc truy cập vào một biến bằng việc biết khoảng cách từ SP yêu cầu nhiều lệnh (Multiple Instructions) Do đó, nhiều trình biên dịch sử dụng một thanh ghi phụ là Frame Pointer, để tham chiếu cả các biến địa phương và các đối số, bởi vì khoảng cách của chúng tới Frame Pointer không thay đổi với các lệnh PUSH và POP Trong các VXL Intel, thanh ghi EBP được dùng cho mục đích này, còn trong các VXL của Motorola thì bất kỳ thanh ghi địa chỉ nào ngoài A7 (Stack Pointer) sẽ làm việc này Bởi theo cách mà Stack tăng kích cỡ, thực tế các đối

số (Parameters) có độ lệch dương với FP, và các biến địa phương sẽ có độ lệch âm so với FP [2]

Đơn vị lưu trữ cơ bản trên Stack là word, có giá trị bằng 32 bit (4 byte) trên các VXL Intel x86 Mọi giá trị biến được cấp phát trên Stack đều bằng bội số của word Thao tác trên Stack được thực hiện bởi 2 lệnh máy:

- push value: Đưa giá trị value vào đỉnh của Stack Giảm giá trị của %esp đi 1 word và đặt giá trị value vào đó

- pop dest: Lấy giá trị từ đỉnh của Stack đưa vào dest Đặt giá trị trỏ bởi %esp vào dest và tăng giá trị của %esp lên 1 word

Trang 22

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống 2.1.3 Quy trình cấp phát bộ nhớ

- Việc đầu tiên một thủ tục phải làm khi được gọi, đó là lưu Frame Pointer trước (Để có thể khôi phục lại Stack Frame của thủ tục mẹ khi thủ tục này kết thúc) Sau đó

nó copy Stack Pointer vào Frame Pointer để tạo một Frame Pointer mới, và tăng Stack Pointer để tạo khoảng trống lưu trữ các biến địa phương - mã lệnh này gọi là thủ tục PROLOG

- Sau khi thủ tục kết thúc, Stack phải được dọn dẹp lại, thủ tục này gọi là EPILOG

- PROLOG và EPILOG trong VXL Intel là lệnh ENTER và LEAVE, còn với Motorola là LINK và UNLINK, được cung cấp để làm hầu hết công việc của thủ tục PROLOG và EPILOG hiệu quả [2] Quy trình cấp phát bộ nhớ ảo cho chương trình đựơc thể hiện thông qua trong Ví dụ 1

mov %esp,%ebp sub $0x10,%esp leave

ret (gdb) disas main push %ebp mov %esp,%ebp sub $0x8,%esp movl $0xa,0x4(%esp) movl $0x5,(%esp) call 0x80483b4 <function>

leave ret

Hoạt động của bộ nhớ trong quá trình thực thi chương trình ở Ví dụ 1 như sau: Bước 1: Khi hệ thống chuyển quyền điều khiển cho chương trình, nó sẽ lưu lại địa chỉ trả về (SavedEIP) như sau:

push %ebp mov %esp,%ebp

Trang 23

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Bước 2: Khi gọi hàm function(int a, int b) với 2 đối số thì các bước chuẩn

bị để gọi hàm như sau:

- Đẩy các đối số của hàm vào Stack:

sub $0x8,%esp movl $0xa,0x4(%esp) movl $0x5,(%esp)

- Gọi hàm: Câu lệnh tiếp theo của hàm được gọi được đẩy vào Stack và hệ thống trao quyền điều khiển cho hàm

call 0x80483b4 <function>

Bước 3: Quá trình thực thi hàm function():

- Đầu tiên giá trị trong thanh ghi EBP (lúc này thanh ghi EBP đang lưu địa chỉ EBP của hàm main() ) được đưa vào Stack, lúc này ESP trỏ đến địa chỉ của EBP cũ Sau đó chương trình cấp phát vùng nhớ cho các biến cục bộ của hàm (buffer1 là 8bit

và buffer2 là 12bit) bằng cách giảm địa chỉ của ESP:

push %ebp mov %esp,%ebp sub $0x10,%esp

Bước 4: Kết thúc hàm:

Sau khi hàm được thực thi, việc thoát khỏi một hàm được thực hiện trong hai bước Trước tiên môi trường tạo ra cho hàm thực thi cần được dọn dẹp (khôi phục giá trị cho %ebp và %eip) Sau đó kiểm tra Stack để lấy các thông tin liên quan đến hàm vừa thoát ra

leave ret Khi kết thúc EBP đang trỏ đến ô nhớ chứa giá trị EBP cũ ESP sẽ được gán bằng EBP Như vậy ESP đang trỏ đến ô nhớ chứa giá trị EBP cũ

Tiếp theo, lệnh POP sẽ lấy giá trị của EBP cũ vào EBP, ESP trỏ đến ô nhớ chứa địa chỉ trở về

Lệnh RET sẽ lấy địa chỉ lệnh trở về (SavedEIP) vào thanh ghi EIP và quyền điều khiển chương trình được chuyển giao cho hàm main(), ESP trỏ đến ô nhớ chứa tham

số đầu tiên của hàm function() Do đó, trong Stack Frame của hàm function(int

thi sau khi kết thúc hàm (RET/SavedEIP), địa chỉ con trỏ nền Base Pointer của hàm trở

về (SavedEBP) và các tham số khai báo bên trong hàm Các dữ liệu này được tổ chức như trong Hình 2

Trang 24

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

b($10) [4 byte] FP (EBP register)

}

 IP (EIP register)

Hình 2: Dữ liệu trong Stack Frame của hàm function(int a, int b)

2.2 Lỗi tràn bộ đệm và các kỹ thuật tấn công

2.2.1 Lịch sử các kỹ thuật tấn công khai thác lỗi tràn bộ đệm

Lỗi tràn bộ đệm lần đầu tiên được quan tâm đặc biệt vào ngày 02/11/1988, khi Robert Tappan Morris – đang học tại đại học Cornell viết thí nghiệm một chương trình

có thể tự động “tiêm” bản thân vào Internet Chương trình của Robert (Morris Worm)

đã tự lây lan tới khoảng 6.000 máy tính chạy HĐH Unix qua mạng Internet [3][9] Về bản chất chương trình của Robert đã lợi dụng lỗi tràn bộ đệm trong Deamon Fingerd của Unix (Giao thức mạng cho việc trao đổi trạng thái và thông tin người dùng trong HĐH Unix, được viết bởi David Zimmerman nhằm phục vụ nhu cầu lấy thông tin của người sử dụng khác trong mạng) Sau đó, hàng loạt lỗ hổng tràn bộ đệm nghiêm trọng trong các thành phần của HĐH được phát hiện như: Syslog, Sendmail 8.7.5, Linux/FreeBSD mount, Xt Library, … [18]

Sự kiện thứ hai đánh dấu sự phổ biến kiến thức về lỗi tràn bộ đệm là sự xuất hiện

của bài viết “Smashing stack for fun and profit” của Aleph One (Bí danh) vào năm

1996 trong tạp chí Prack Cho đến bây giờ bài viết này vẫn là một trong những bài viết kinh điển và cơ bản cho các loại khai thác lỗi tràn bộ đệm

Trang 25

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Từ lần đầu bị khai thác cho đến nay lỗ hổng tràn bộ đệm luôn chiếm tỷ lệ lớn nhất trong các loại lỗi gây lỗ hổng bảo mật cũng như chiếm tỷ lệ lớn các lỗi gây lỗ hổng bảo mật nghiệm trọng [18]

Những lỗ hổng tràn bộ đệm nghiêm trọng về cả tính chất bảo mật cũng như hậu quả để lại tiếp theo có thể kể đến:

- Sâu Morris (Great worms): Được mệnh danh “Sâu/virus tồi tệ nhất lịch sử Internet” vì kiểu tàn phá nhằm vào máy chủ Xuất hiện ngày 02/11/1998, khai thác lỗi tràn bộ đệm trong deamon fingerd của HĐH Unix lây lan và làm hơn 6.000 máy chủ trên khắp nước Mỹ gần như quá tải Thiệt hại ước tính khoảng 100 triệu USD [14]

- Sâu Code-Red: xuất hiện tháng 07/2001 khai thác lỗi tràn bộ đệm trong dịch vụ đánh chỉ số (Indexing service) của Microsoft IIS Server Từ đó gây lỗi từ chối dịch vụ cho các máy chủ IIS 4.0/5.0 đã cài đặt Indexing service, các Router DSL Cisco Unpatched 600-series, và cả những hệ thống không chạy IIS mà chạy HTTP server lắng nghe TCP cổng 80 Từ lúc xuất hiện đến lúc dừng hoạt động 28 ngày (1/07/2001 – 28/07/2001) sâu Code-Red ước tính đã lây lan khoảng 359.000 host (Bao gồm cả máy tính và router) [8]

- Sâu Nimda: Xuất hiện khoảng 18/09/2001 khai thác lỗ hổng trong email, một vài kẽ hở khác của hệ điều hành, lỗ hổng của IIS Server 4.0/5.0 khác và cửa hậu(back-doors) do Code-Red để lại, gây thiệt hại cho các máy tính Client sử dụng windows 95,

98, ME, NT, 2000, XP và Server chạy windows NT và 2000 Trong tuần đầu tiên xuất hiện, tổn thất ước tính của sâu Nimda đã đạt con số khoảng 530 triệu USD [9]

- Sâu W32/Blaster: Xuất hiện tháng 08/2003, lợi dụng lỗ hổng tràn bộ đệm trong Microsoft Remote Procedure Call (RPC) interface trên máy tính trong mạng nội bộ hoặc kết nối trực tiếp ra Internetchạy các HĐH windows NT 4.0, 2000, XP, server

2003 Trong vòng 1 tuần, sâu Blaster nhiễm ở hơn 420.000 máy tính trên thế giới, thiệt hại ước tính 320 triệu USD [7]

Ngoài ra, còn một số sâu máy tính nổi tiếng sau đó như: SQL Slammer worm (xuất hiện năm 2004 dựa vào lỗi tràn bộ đệm trên MS SQL server), Sasser worm (xuất hiện năm 2004 lợi dụng lỗi tràn bộ đệm trong LSASS của HĐH windows), Configker worm (xuất hiện năm 2009 dựa vào lỗi tràn bộ đệm RPC trên HĐH windows)

2.2.2 Tổng quan về tấn công dựa trên lỗi tràn bộ đệm

2.2.2.1 Tràn bộ đệm:

Mỗi tiến trình được thực thi trên hệ điều hành sẽ được cấp phát một vùng nhớ ảo, chứa toàn bộ các thông tin cần thiết để tiến trình có thể thực thi ổn định và an toàn Bộ đệm được cấp phát cho chương trình có thể được đặt ở:

- Bộ đệm trên Stack

- Bộ đệm trên Heap

Trang 26

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

- Bộ đệm trên vùng dữ liệu tĩnh (Static Data Area)

Vì bản chất tổ chức của vùng nhớ ảo này, nếu bộ đệm cố định dành cho tham số của một hàm chức năng trong chương trình bị ghi dữ liệu vượt qua ngoài biên (tràn), thì phần dữ liệu bị tràn sẽ có thể ghi đè lên các vùng nhớ chức năng liền kề quan trọng khác, làm cho hoạt động của chương trình bị ảnh hưởng hoặc kết thúc không như mong muốn

2.2.2.2 Tấn công dựa trên tràn bộ đệm:

Tấn công dựa trên lỗi tràn bộ đệm sẽ lợi dụng cơ chế tràn bộ đệm khi mà phần mềm hoặc hệ điều hành không có cơ chế bảo vệ bộ đệm, để phá hoại chương trình hoặc kích hoạt các dữ liệu được thiết kế đặc biệt (các mã lệnh, địa chỉ lệnh, … ), từ đó làm ngắt sự hoạt động bình thường của chương trình, hoặc điều khiển chương trình thực thi các đoạn mã của kẻ tấn công Trong nhiều trường hợp chương trình hoặc mã độc của kẻ tấn công còn có thể thực thi dưới đặc quyền ROOT (ADMIN) dẫn đến các hậu quả nghiêm trọng nhất cho hệ thống Vì vậy các lỗi tràn bộ đệm tạo lỗ hổng cho các thủ thuật khai thác phần mềm, gây ra các nguy cơ bảo mật phần mềm

Thông thường, kẻ tấn công sẽ có hai cách để khai thác lỗi tràn bộ đệm:

- Khai thác lỗ hổng của phần mềm thông qua các dữ liệu đầu vào của phần mềm

Dữ liệu đầu vào này có thể là một chuỗi, một tập tin, hoặc một số gói tin mạng, …

- Khai thác các trang web có tương tác người dùng tại các trường nhập liệu, dữ liệu upload, …

Bộ nhớ đệm có ba phần có thể bị rơi vào tình trạng Overflow đó là bộ nhớ đệm trên Heap, bộ nhớ đệm trên Stack và bộ đệm trên vùng dữ liệu tĩnh (Static Data Area),

và đây cũng là các mục tiêu khai thác lỗi tràn bộ đệm.Sau đây sẽ giới thiệu và đi sâu phân tích việc khai thác lỗ hổng tràn bộ đệm trên Stack

2.2.3 Cơ chế tràn bộ đệm trên Stack

Vùng bộ nhớ ảo Stack chứa các đối số của hàm, địa chỉ lệnh trả về, địa chỉ stack frame trước đó và các biến được khai báo cục bộ trong hàm

Việc tràn bộ đệm xảy ra khi bộ đệm đặt trên Stack bị tràn, dẫn đến việc thay đổi

dữ liệu ở các vùng nhớ có địa chỉ cao hơn, cụ thể là các biến địa phương của hàm hoặc địa chỉ lệnh trả về (SavedEIP), từ đó thay đổi việc thực thi bình thường của chương trình và tạo điều kiện cho kẻ tấn công “thao túng” phần mềm hoặc HĐH Trong đó việc tràn bộ đệm để thay đổi địa chỉ lệnh trả về nhằm thay đổi luồng thực thi của chương trình thường gây ra hậu quả lớn do có khả năng can thiệp và thực thi mã độc

đa dạng và linh hoạt Cơ chế tràn bộ đệm được thể hiện trong Ví dụ 2

Trang 27

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

strcpy(buffer,str);

} void main() { char large_string[24];

int i;

for( i = 0; i < 24; i++) large_string[i]= 'A';

Trang 28

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Như ta đã thấy, dữ liệu RET trở về hàm main() và EBP của hàm main() đã bị ghi đè bởi giá trị 0x41414141(“AAAA”) Do đó chương trình sẽ bị kết thúc đột ngột bởi một lỗi Segmentation fault (core dumped) thông báo rằng địa chỉ lệnh đang cố gắng truy cập 0x41414141 là không được phép Ở các HĐH họ Linux thông báo sẽ có dạng như trên Hình 4

Hình 4: Tràn bộ nhớ đệm trên Stack ghi đè SavedEIP

Tuy nhiên, nếu giả sử như địa chỉ lệnh thực thi tiếp theo mà bị ghi đè không phải 0x41414141 mà là một địa chỉ lệnh hợp lệ, vậy hệ điều hành sẽ không hề biết mà sẽ vẫn tiếp tục thực thi chương trình với địa chỉ lệnh tiếp theo trong SavedEIP Các địa chỉ mà SavedEIP có thể trỏ đến được mô tả trên Hình 5

Hình 5: Ghi đè địa chỉ trả về và trỏ đến các vùng dữ liệu khác [16]

Sau đây sẽ trình bày phương thức tấn công lợi dụng lỗi tràn bộ đệm trên Stack, trong đó con trỏ lệnh bị ghi đè địa chỉ trả về sẽ trỏ ngược lại địa chỉ bộ đệm đã bị chèn

mã tấn công lưu trong Stack Các mã tấn công khai thác lỗ hổng tràn bộ đệm được viết dưới dạng Shellcode

Trang 29

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Shellcode dạng Alphanumeric: “1Û°Í€pqesaba”

Shellcode được thể hiện bằng mã máy (Byte-code), gồm một nhóm các lệnh tuần

tự, do đó máy tính có thể hiểu được và thực thi trực tiếp Shellcode mà không cần biên dịch Một số phương pháp để tạo ra Shellcode:

+ Viết trực tiếp Shellcode sử dụng tập lệnh VXL bằng mã máy Cách này yêu cầu

am hiểu rất sâu về mã máy

+ Viết tập lệnh bằng mã hợp ngữ (Assembly), sau đó dùng trình biên dịch và trích ra Shellcode

+ Viết tập lệnh bằng ngôn ngữ lập trình bậc cao hơn (có thể là C, hoặc C++) sau

đó dùng trình biên dịch chuyển sang mã hợp ngữ, cuối cùng từ mã hợp ngữ trích rút ra Shellcode Cách này có vẻ đơn giản nhưng ít được sử dụng do mã Shellcode sinh ra thường có dung lượng lớn hơn rất nhiều so với Shellcode sinh ra bằng 2 cách trên Cách thông thường để tạo Shellcode đó là viết mã bằng hợp ngữ rồi sau đó sử dụng trình biên dịch và trích xuất ra mã máy Khi đó, cần lưu ý đến việc cách gọi các hàm hệ thống trên HĐH họ Linux và HĐH họ Windows là khác nhau

Các HĐH họ Linux cung cấp cách trực tiếp để giao tiếp với nhân của HĐH thông qua giao tiếp int 0x80 Khi lệnh int 0x80 được thực thi bởi người dùng, CPU sẽ chuyển sang chế độ nhân và thực thi System call Trong khi đó ở các HĐH họ Windows không có giao tiếp trực tiếp tới nhân của HĐH Muốn giao tiếp với lời gọi

hệ thống cần phải tải các địa chỉ hàm cần thực thi thông qua một DLL (Dynamic Link Library)

Do vậy, địa chỉ các hàm hệ thống của các HĐH họ Linux là không thay đổi, trong khi đó địa chỉ các hàm hệ thống của các HĐH Windows có thể thay đổi theo từng phiên bản

Trang 30

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống 2.3.1 Tạo Shellcode trên các HĐH họ Linux

Để gọi một hàm hệ thống ( sys_call() ) thông qua ngắt int 0x80 cần thực hiện các công việc sau:

- Đặt các đối số của hàm vào lần lượt các thanh ghi ebx, ecx, edx, esx, edi

(nếu cần)

- Đặt mã của hàm vào thanh ghi eax

- Thực hiện lời gọi tới ngắt int 0x80

Kết quả thực hiện của sys_call() sẽ được lưu trữ trong thanh ghi eax

Danh sách các lời gọi hệ thống của HĐH họ Linux có thể tham khảo khi tìm kiếm với từ khóa “Linux System call tables” một số website tham khảo [13]

Ví dụ 3: Mã Assembly thực thi hàm system_exit(): exit.asm

section text

global _start

_start:

mov ebx, 0 ; doi so dat vao la 0

mov eax, 1 ; ma cua ham sys_exit() la 1

int 0x80 ; thuc thi ham

Sau đó biên dịch và sử dụng trình debug (objdump) trích xuất mã như Hình 6

Hình 6: Trích xuất Shellcode bằng objdump (Linux)

Khi đó, Shellcode trích xuất được sẽ là:

char[] shellcode_exit = “\xbb\x00\x00\x00\x00\xb8\x01\x00\x00\x00\xcd\x80” Shellcode thực thi hàm system_exit() ta vừa lấy được có 12 Byte dung lượng Tuy nhiên, bằng một số phương pháp ta có thể vừa giảm được dung lượng Shellcode cũng như loại bỏ đi các Byte NULL (0x00) trong Shellcode Vấn đề dung lượng và các Byte NULL (0x00) chứa trong Shellcode là rất quan trọng và sẽ được đề cập trong các phần tiếp theo

Trang 31

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống 2.3.2 Cách viết Shellcode trên các HĐH họ Windows

Như ta đã biết, để có thể lấy được địa chỉ của hàm hệ thống trong các HĐH họ Windows cần thông qua một thư viện DLL Địa chỉ của hàm sẽ được tính bằng địa chỉ KERNEL + địa chỉ con trỏ của hàm

Để gọi một hàm hệ thốngcần thực hiện các công việc sau:

- Lấy địa chỉ của hàm hệ thống thông qua một thư viện DLL tương ứng

- Đặt địa chỉ hàm cần thực thi vào một thanh ghi

- Đặt ngược các đối số vào Stack thông qua push

- Thực hiện lời gọi hàm thông qua lệnh call

Ví dụ: Tạo shellcode thực hiện Sleep tiến trình 5000ms

Bước 1: Lấy địa chỉ hàm Sleep trong kernel32.dll bằng chương trình arwin.exe theo như phụ lục 1 [17] trên HĐH window XP sp2 như Hình 7

Hình 7: Lấy địa chỉ sys_call bằng arwin.exe

Bước 2: Viết mã Assembly thực hiện Sleep chương trình 5000ms: sleep.asm [15].Mã Assembly được mô tả như trong ví dụ 4

Ví dụ 4: Mã Assembly chương trình sleep.asm

mov bx, 7c802442h ;address of Sleep

mov ax, 5000 ;pause for 5000ms

push ax

call bx ;Sleep(ms);

End Start

Bước 3: Sử dụng chương trình dịch (A86 Macro Assembly/Macro Assembly) để

biên dịch từ file asm sang dạng tập tin đối tượng (*.obj)

Trang 32

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Chương 2: Cơ chế tấn công lỗi tràn bộ đệm và các PP phòng chống

Bước 4: Sử dụng trình debug (Sygnus, Ollydmg) để trích xuất Shellcode từ file tập tin đối tượng (*.obj) Phương thức trích xuất cũng giống như ví dụ ở HĐH Linux

2.3.3 Các vấn đề cần lưu ý khi viết Shellcode [22]

Việc viết Shellcode thông thường không quá khó, tuy nhiên điểm khó nhất ở chỗ

là viết sao cho Shellcode sinh ra có dung lượng nhỏ nhất và Shellcode được thực thi hoàn toàn trên máy tính cần tấn công Do đó, trong khi tạo ra Shellcode cần lưu ý một

số vấn đề như sau:

* Vấn đề xuất hiện các Byte NULL (0x00) trong Shellcode:

Giả sử trong đoạn Shellcode trích xuất ra được xuất hiện byte NULL (0x00), khi chèn Shellcode vào trong bộ đệm và Shellcode được đọc để thực thi, thì khi gặp các Byte NULL các hàm đọc dữ liệu (gets(), strcpy(), ) sẽ dừng lại Do đó các lệnh nằm sau Byte NULL trong Shellcode sẽ không được ghi vào bộ đệm, dẫn đến việc chương trình tấn công không hoàn thành mục đích hoặc có thể là bị huỷ bỏ Do đó, khi viết Shellcode không để xuất hiện các Byte NULL

Việc xuất hiện Byte NULL trong Shellcode thường có 2 nguyên nhân:

+ Chuỗi DATA gây ra Byte NULL: Ví dụ chuỗi: “ssssss”, hoặc “0x00” sẽ gây

ra Byte NULL trong Shellcode

+ Chọn lệnh hoặc thanh ghi không phù hợp: Ví dụ lệnh mov ebx,0

Để xử lý có nhiều cách nhưng thường và đơn giản nhất là thay thế các lệnh hoặc chuỗi gây ra Byte NULL bằng các chuỗi hoặc lệnh khác có ý nghĩa tương đương Ví dụ:

+ Thêm Byte NULL vào cuối chuỗi để tạo ra Shellcode không chứa Byte NULL trong khi chuỗi DATA được đọc vào không thay đổi Ví dụ đối với chuỗi “ssssss” sẽ thay bằng chuỗi “ssssss#”

+ Sử dụng lệnh xor một thanh ghi cho chính thanh ghi đó để gán giá trị 0 cho thanh ghi Ví dụ: thay mov ebx, 0 bằng xor ebx, ebx

+ Sử dụng thanh ghi 8bit thấp để gán giá trị thay vì sử dụng thanh ghi 16bit nếu

có thể Ví dụ: thay mov eax, 1 bằng mov al, 1

* Vấn đề về địa chỉ của các tham số truyền cho hàm:

Các tham số cần truyền cho hàm cần phải được đưa vào trong bộ nhớ trước khi gọi hàm, và ta cần phải biết địa chỉ bộ nhớ lưu trữ chúng để truyền cho hàm Có thể thực hiện các bước sau để lấy được địa chỉ của tham số:

+ PUSH trực tiếp vào Stack, sau đó lưu giá trị: Ta sẽ push tham số hoặc biến vào Stack Khi đó giá trị địa chỉ của biến hoặc tham số vừa push vào sẽ lưu trữ trên thanh ghi ESP (thanh ghi con trỏ Stack) Cơ chế lấy địa chỉ tham số bằng cách PUSH trực tiếp vào Stack được mô tả như trong Ví dụ 5

Ngày đăng: 13/05/2014, 11:33

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[21] Wikipedia Code_Red_(computer_worm), http://en.wikipedia.org/wiki/Code_Red_(computer_worm), tham khảo tháng 11.2013 Sách, tạp chí
Tiêu đề: Code Red (computer worm)
Nhà XB: Wikipedia
Năm: 2013
[16] Eyelublog, http://eyelublog.wordpress.com/2013/02/13/the-linux-programming-interface-%E7%AC%94%E8%AE%B0-%E4%B8%89/, tham khảo tháng 10.2013 Link
[22] Ceh.vn Shellcode, http://ceh.vn/@4rum/showthread.php?tid=2861, tham khảo tháng 10.2013 Link
[17] Vivimachines Steve Hanna, www.vividmachines.com/shellcode/arwin.c, tham khảo tháng 10.2013 Khác
[18] Bconizance, bcognizance.iiita.ac.in/?p=699, tham khảo tháng 10.2013 Khác
[19] Wikipedia Register, en.wikipedia.org/wiki/Register, tham khảo tháng 10.2013 Khác
[20] Tenouk, tenouk.com/Bufferoverflowc/bufferoverflowvulexploitdemo3.html, tham khảo tháng 10.2013 Khác

HÌNH ẢNH LIÊN QUAN

Hình 1: Tổ chức bộ nhớ ảo [16]. - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
Hình 1 Tổ chức bộ nhớ ảo [16] (Trang 19)
Hình  2: Dữ liệu trong Stack Frame của hàm  function(int a, int b) - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 2: Dữ liệu trong Stack Frame của hàm function(int a, int b) (Trang 24)
Hình  5: Ghi đè địa chỉ trả về và trỏ đến các vùng dữ liệu khác  [16] - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 5: Ghi đè địa chỉ trả về và trỏ đến các vùng dữ liệu khác [16] (Trang 28)
Hình  10: Phát hiện lỗ hổng tràn bộ đệm trên HĐH họ Windows - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 10: Phát hiện lỗ hổng tràn bộ đệm trên HĐH họ Windows (Trang 37)
Hình  12: Dữ liệu trong Stack khi bị tràn trên Windows - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 12: Dữ liệu trong Stack khi bị tràn trên Windows (Trang 39)
Hình  13: Mô hình xây dựng chuỗi tấn công đặt tại buffer hàm bị tràn - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 13: Mô hình xây dựng chuỗi tấn công đặt tại buffer hàm bị tràn (Trang 40)
Hình  14: Dữ liệu trong bộ nhớ Stack sau khi chèn mã tấn công - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 14: Dữ liệu trong bộ nhớ Stack sau khi chèn mã tấn công (Trang 41)
Hình  15: Mô hình xây dựng chuỗi tấn công đặt Shellcode lên Previous Stack Frame - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 15: Mô hình xây dựng chuỗi tấn công đặt Shellcode lên Previous Stack Frame (Trang 42)
Hình  20: Dữ liệu trong các thanh ghi sau thời điểm h - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 20: Dữ liệu trong các thanh ghi sau thời điểm h (Trang 51)
Hình  22: Xây dựng chuỗi input tấn công  3.1.4.  Kết quả demo - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 22: Xây dựng chuỗi input tấn công 3.1.4. Kết quả demo (Trang 53)
Hình  23: Chương trình sau khi bị tiêm mã tấn công qua bộ nhập - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 23: Chương trình sau khi bị tiêm mã tấn công qua bộ nhập (Trang 53)
Hình  24: Kiếm tra các k - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 24: Kiếm tra các k (Trang 54)
Hình  25: Giao diện chương trình Easy RM To MP3 Converter, version 2.7.3.700 - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 25: Giao diện chương trình Easy RM To MP3 Converter, version 2.7.3.700 (Trang 55)
Hình  26: Dấu hiệu Chương trình Easy RM To MP3 Converter bị tràn bộ đệm - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 26: Dấu hiệu Chương trình Easy RM To MP3 Converter bị tràn bộ đệm (Trang 56)
Hình  28: Tìm địa chỉ lệnh JUMP ESP từ file .DLL bằng Ollydmg - ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC:NGHIÊN CỨU XÂY DỰNG MÔ HÌNH PHÁT HIỆN TẤN CÔNG, ĐỘT NHẬP MẠNG DỰA TRÊN ĐỐI SÁNH CHUỖI
nh 28: Tìm địa chỉ lệnh JUMP ESP từ file .DLL bằng Ollydmg (Trang 58)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w