Tải bản đầy đủ (.pdf) (65 trang)

ĐỒ Á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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.18 MB, 65 trang )

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
i
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












ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
ii
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




ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Mục lục
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
iii
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


ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Mục lục
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
iv
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

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Danh mục các bảng, sơ đồ, hình vẽ
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
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
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
vi
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
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Ký hiệu các cụm từ viết tắt
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
vii
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
SF Stack Frame Khung 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 đó
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Đặt vấn đề
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
8
ĐẶ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).



ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
9
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).


ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
10

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).

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
11

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ố.

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
12

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ỗ hổng trong vùng người dùng;
- Lỗ hổng trong vùng máy trạm;
- Lỗ hổng trong vùng mạng LAN;
- Lỗ hổng trong vùng LAN-to-WAN;
- Lỗ hổng trong vùng WAN;
- Lỗ hổng trong vùng truy nhập từ xa;
- Lỗ hổng trong vùng hệ thống/ứng dụng.
Trong các hệ điều hành và phần mềm ứng dụng, các lỗ hổng an ninh thường gặp
có thể 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).
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
13
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.

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
14
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.
1.3.2.2. Tấn công bằng mã độc
Tấn công bằng mã độc có thể gồm một số dạng, như lợi dụng lỗ hổng về lập trình
(như lỗi tràn bộ nhớ đệm), lỗ hổng cấu hình hệ thống để chèn và thực thi mã độc trên
hệ thống nạn nhân. Cụ thể các dạng tấn công bằng mã độc:
+ Tấn công lợi dụng lỗi tràn bộ nhớ đệm: Kẻ tấn công lợi dụng lỗi tràn bộ đệm
trên hệ thống nạn nhân để “tiêm” các đoạn mã độc vào và thực thi chúng.
+ Tấn công lợi dụng lỗi không kiểm tra đầu vào: Tấn công chèn mã SQL (SQL
injection), tấn công sử dụng mã javascript, kiểu XSS, CSRF, … Kẻ tấn công khéo léo
chèn mã SQL vào dữ liệu đầu vào và gửi các dữ liệu này tới máy chủ. Nếu máy chủ
không có cơ chế kiểm soát và lọc dữ liệu đầu vào đủ mạnh, mã SQL của kẻ tấn công
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
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
15
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
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
16
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.

ĐỒ Á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

SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
17
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.
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
18
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,
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
19
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].

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
20
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()

free()
. Lời gọi hệ thống
brk()

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.
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
21
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.

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
22
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.

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

void function(int a, int b){
char buffer1[5];
char buffer2[10];
}
void main() {
function(5, 10);
}
Assembly code

(gdb) disas function
push %ebp

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
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
23
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
a,int b)
sẽ gồm các dữ liệu: Các đối số truyền cho hàm, địa chỉ lệnh trở về để thực
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.

ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
24

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

a($5)
[4 byte]


ret(main)(SavedEIP)
[4 byte]

sfp(main)(SavedEBP)
[4 byte]


buffer1
[5 byte]

buffer2
[10 byte]

 SP (ESP register)



Void function(int a, int b){
char buffer1[5];
char buffer2[10];
}
void main() {
function(5, 10);
}


 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.
ĐỒ Á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
SVTH: Nguyễn Thăng Long, lớp D09-CNPM3 Page
25
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

×