1
Module 17
Buffer Overflow
Các Ch Đề Chính Trong Chương Này
Tổng Quan Về Buffer Overflow
Shell Code
khai thác buffer overflow
Tìm Kiếm Lỗi Tràn Bộ Đệm
Minh Họa Khai Thác Lỗi Tràn Bộ Đệm
2
Tổng Quan Về Buffer Overflow
Buffer Overflow hay BoF li tràn bđệm, nguyên nhân gn giống với tình huốn
tấnng SQL injection khi người dùng hay hacker cung cấp các biến đầu vào hay dliu
vượt quá khả năng xử của chương trình làm cho hthống bị treo dẫn đến từ chố dịch
vụ (DoS) hay khnăng bị các hacker lợi dụng chèn các chỉ thị trái phép nhằm thực thi
các đoạn mã nguy hiểm t xa. hai dng li tràn b đệm là stack-based heap-
based.
Chai thành phần stack và heap đều được sử dụng để lưu trữ các biến người dùng khi
chạy chương trình. Khi mt chương trình được nạp vào bnhớ được chia thành 6 giai
đoạn tương ứng với sơ đồ phân đoạn trong bộ nhớ như hình minh họa bên dưới :
Hình 17.1 - Sơ đồ các phân đoạn trong bộ nhớ
Đầu tiên, các ch thị lệnh hay mã máy (phần tập tin thực thi nhị phân) sẽ được nạp qua
phân đoạn text để thực thi các tác vụ của ứng dụng, vùng này được n giá tr chỉ đọc
kích thước c định tùy thuc vào giá tr khởi tạo khi chương trình được nạp. Tiếp theo là
phân doạn data chưa các biến toàn cục gtrkhởi tạo ban đầu. Sau đó là vùng bss
(below stack session) cũng ng để lưu c biến toàn cục nhưng không giá tr khởi
to, ch thươc của vùng y data cũng cố định khi chương trình được nạp. cuối
cùng là vùng ENV, dùng đnạp các biến i trường đối số, cũng giai đoạn sau
cùng khi ng dụng được nạp và thực thi.
Trong các phân đoạn trên t phân doạn heap và stack những nơi hacker sẽ tiến
hành khai thác li tràn bđệm, vùng heap dùng để cấp pt các biến động trong khi thực
thi bc lời gọi hàm như malloc(). Heap phát trin tvùng b nhđa chỉ tthấp
đến cao theo nguyên tắt FIFO (Firt in first out, biến nào nạp trước sẽ lấy ra sử dụng
trước). Như hình dưới minh họa mt nội dung của Heap :
Hình 17.2 – Một nội dung của heap
Khi mt ứng dụng sao chép dữ liệu mà không kim tra kích thước phù hợp với khả
năng lưu trhay không thi hacker sẽ tận dụng để cung cấp những dữ liệu kích thươc
lớn làm tràn heap ghi đè lên các biến động khác dn đến tình trạng heap-based
overflow.
3
Còn vùng stack tngược lại ng để lưu trữ các lời gọi hàm theo nguyên tắt LIFO (Last
in first out, lời gọi nào nạp vào sau sđược sử dụng trước). Những biến được lưu trữ
trong các vùng này schờ cho đến khi nhận được lời gọi m để thc thi, mi khi các
biến này bghi đè bi mt chương trình nguy hiểm nào đó thì chương trình sthực hiện
chỉ thị này của hacker thông qua lời gọi hàm của mình, và tình hung bị khai thác li như
vậy gọi là stack-based buffer overflow.
Shell Code
Shellcode hay paypload thuật ngữ dùng đchỉ nhng chương trình thường ch
thước khá nhỏ mà hacker schèn vào đúng các v trí thực thi lệnh kế tiếp của con trỏ khi
btràn b đệm. Với mục tiêu s tiến hành các hành động mà hacker mong mun như
trong phần video minh họa mt dạng tấn công lỗi tràn bđệm trên Windows XP i chọn
shell code nạp giao din dòng lệnh trên máy tính btấn ng, shellcode y tên là
reserver_shell, ngoài ra có nhiều loi shell code khác nhau đã được viết sẳn như chèn các
dll mới lên máy tính bị tấn công, hay tạo tài khoản người dùng mới …
Các shellcode thường được viết bằng hợp ngữ và chèn trực tiếp vào các đoạn mã khai
thác. dvào ngày 26.3.2012 một mã khai thác li buffer overflow của UltraVNC
1.0.2 Client được ng b ti địa chỉ http://www.exploit-db.com/exploits/18666/ vi
shellcode là :
Hoặc các shellcode khác có dạng như :
Hình 17.3 – Một đoạn shellcode
Các bước tiến hành khai thác buffer overflow
1. Tìm v trí hay các điểm gấy ra lỗi tràn bđệm của ứng dụng.
2. Ghi các dliệu ch thước lớn để vượt quá khả năng kiểm soát của chương trình.
3. Ghi đè lên địa chỉ trả về của các hàm.
4. Thay đổi chương trình thực thi bằng đoạn mã ca hacker.
4
Như đoạn code bên dưới mô tả mt tình huống bị li bof của hàm bof (), do ch thước
buffer chi chứa ti đa 8 tự nhưng hàm strcpy sao chép đến 20 tự vào bnhớ vượt
quá khả năng lưu trữ đã được khai báo trong bộ nhớ đệm.
Hình 17.4 – Một đoạn mã b li tại hàm bof()
Các bạn hãy tham khảo thêm một dụ về tràn bộ đệm viết bằng ngôn ngữ C là overrun.c
5
Hình 17.5 – Một dụ khác về tràn bđệm
Trong phn đầu của đoạn mã skhai báo hai biến kiểu chuỗi và gán b nhcho chúng.
Tiếp theo biến name sđược cấp phát 10 byte trong bộ nhớ (thể lưu tối đa 10 tự)
còn biến dangerous_system_command được cấp phát đến 128 byte, như vy hacker
th chạy đè (overrun) lên vùng nh của biến name thông qua các giá tr nhập vào qua
biến dangerous_system_command để thực thi các shellcode của mình (chúng ta sthảo
luận về chủ đề shell code ở phần tiếp theo)
Khi các bạn biên dịch đoạn mã overrun.c trên linux sẽ cho kết quả như sau :
Hình 17.6 – Kết quả biên dịch overrun.c
Như vậy, nếu như hacker nhập vào một biến đ dài 16 kí tthì sbị tràn 6 t cho
phép thực thì các ch thị ngoài ý mun như cat /etc/passwd trong hình 17.7 :