Xem mẫu
- SỰ TRÀN BỘ NHỚ ĐỆM
GVHD: Ths Lê Tự Thanh
Nhóm 13:
Phạm Nguyễn Thanh Hưng
Hà Xuân Hải
- TIN TỨC BẢO MẬT
THÔNG TIN TRONG TUẦN
Lỗi ngày trở về 0 vượt qua sự kiểm soát của Người sử dụng Windows.
Sự tràn bộ nhớ đệm cục bộ là thủ thuật đánh lừa hệ điều hành của
Microsoft để hệ thống cấp quyền sử dụng riêng cho kẻ tấn công.
Nhiều phiên bản của hệ điều hành Microsoft dễ bị tổn thương nhưng không
được tiết lộ, việc tràn bộ đệm ngày về 0 có nguy cơ bị tổn thương mà qua
đó cho phép một kẻ tấn công chiếm được quyền của hệ thống và kiểm soát
máy tính.
Theo nghiên cứu của công ty bảo mật Vupen, “vấn đề này gây ra bởi một lỗi
tràn bộ đệm trong bộ xử lý ‘win32k.sys’ khi lưu trữ các giá trị registry đã
được xử lý với ‘reg_binary’, mà qua đó có thể cho phép người dùng không
có đặc quyền phá bỏ sự quản lý của hệ thống hoặc thực thi mã nhị phân với
hạt nhân (hệ thống) đặc quyền, bằng cách thay đổi các giá trị registry liên
quan tới người dùng cuối được xác định bằng ký tự (EUDC) qua phông chữ.
Theo tổ chức nghiên cứu an ninh Chester Wisniewski tại Sophos, một kẻ tấn
công có thể sử dụng mã khóa liên quan tới EUDC “để mạo danh tài khoản
hệ thống, và có quyền truy cập gần như không giới hạn cho tất cả các thành
phần của hệ thống Windows”.
- CÁC CHỦ ĐỀ TRONG MODULE
Làm cách nào khai thác sự biến đổi
Sự tràn bộ nhớ đệm (BoF).
của việc tràn bộ nhớ đệm
Tràn bộ nhớ đệm trên stack (ngăn xếp) Xác định tràn bộ nhớ đệm
Điều kiện kiểm tra tràn bộ nhớ đệm
Tràn bộ nhớ đệm trên heap
trên heap: heap.exe
Điều khiển stack Các bước kiểm tra việc tràn bộ nhớ
đệm trên stack trong chương trình sửa
Các bước tràn bộ nhớ đệm lỗi OllyDbg
Cách thức tấn công một chương trình Công cụ phát hiện tràn bộ nhớ đệm
thực Phòng chống tràn bộ nhớ đệm
Sự phá vỡ stack Công cụ đối phó với việc tràn bộ nhớ
đệm
Ví dụ của tràn bộ nhớ đệm Bút kiểm tra tràn bộ nhớ đệm
- BIỂU ĐỒ MODULE
Phương
Khái niệm pháp luận
tràn bộ nhớ tràn bộ nhớ
đệm đệm
Công cụ
Bút kiểm
bảo mật Ví dụ tràn
tra tràn bộ
tràn bộ nhớ bộ nhớ đệm
nhớ đệm
đệm
Biện pháp
Phát hiện
đối phó
tràn bộ nhớ
tràn bộ
đệm
đệm
- Lỗi tràn bộ đệm tổng quát xảy ra khi một bộ nhớ đệm đã được phân chia cho một không gian lưu trữ cụ thể có
chứa nhiều dữ liệu được sao chép vào lớn hơn mức mà nó có thể xử lý.
Khi chương trình được biên dịch và chạy, nó sẽ chỉ định một phần của bộ nhớ có độ dài 11 bytes để chứa chuỗi
tấn công.
Hàm Strcpy sẽ sao chép chuỗi “DDDDDDDDDDDDDD” vào chuỗi tấn công, lúc này bộ đệm sẽ vượt quá kích
thước 11 bytes, dẫn tới tràn bộ đệm.
Đây là loại dễ bị tổn
thương trong hệ thống
dựa trên UNIX và NT.
- Tại Sao Các Chương Trình Và Ứng
Dụng Dễ Bị Tổn Thương ?
Phương thức kiểm tra biên không được thực
hiện đầy đủ hoặc, trong nhiều trường hợp,
chúng bị bỏ qua hoàn toàn.
Ngôn ngữ lập trình, chẳng hạn như C, có các
lỗ hổng bảo mật trong chính chúng.
Chương trình và các ứng dụng không tuân thủ
đúng các hoạt động mà chúng được lập trình.
Các chức năng trong ngôn ngữ lập trình C như strcat(), strcpy(), sprintf(),
vsprintf(), bcopy(), gets() và scanf() có thể bị khai thác như việc chúng không
kiểm tra kích thước của bộ đệm.
- Tìm Hiểu Về Stack
Các điểm SP ở
Stack sử dụng cơ chế Last-In- Phần đây
dưới
First-Out (vào sau ra trước) để của bộ
truyền hàm tham số và tham nhớ
chiếu với các biến cục bộ. Bộ Đệm2 Hướng đi
Nó hoạt động như một bộ đệm,
(biến cục bộ 2) vào
BP tại
giữ tất cả các thông tin mà hàm các nơi
cần. bên Bộ Đệm1
trong
Được tạo ra vào thời điểm bắt khung
(biến cục bộ 1)
đầu của hàm và giải phóng lúc stack
kết thúc hàm. Điểm quay trở
về
Phần Chức năng gọi Hướng tăng
trên của stack
của bộ các đối số
nhớ
- Phần dưới của Stack Phần dưới của Stack
Phần dưới của Stack
Dữ liệu trên đoạn Một số dữ liệu
Dữ liệu trên đoạn Dữ liệu trên đoạn
stack. có thể bị ghi đè
stack. stack.
Địa chỉ quay về Địa chỉ quay về mới
Dữ liệu bị ghi đè
Các dữ liệu khác
Dữ liệu trên đoạn stack
trên đoạn stack
mới
Phần cuối của Stack Phần cuối của Stack
Stack khi bị kẻ tấn công gọi Stack sau khi bị một chức
Một Stack bình thường
một chức năng năng phá hoại.
- Tìm Hiểu Về Heap
Heap là một khu vực của bộ nhớ được sử dụng bởi một ứng dụng và được
cấp phát động tại thời gian chạy của các hàm, chẳng hạn như malloc().
Các biến tĩnh được lưu trữ trên stack cùng với dữ liệu được giao, sử dụng
giao diện malloc.
Heap lưu trữ tất cả các trường hoặc thuộc tính, hàm tạo và phương thức của
một lớp hoặc một đối tượng.
Dung lượng Dung lượng Dung lượng
bộ nhớ Trường điều bộ nhớ bộ nhớ
Trường điều khiển Trường điều
khiển khiển
Dung lượng Heap đơn giản
- Sự Tràn Bộ Nhớ Đệm Trên Heap
Nếu một ứng dụng sao chép dữ liệu mà không kiểm tra dù nó phù hợp với nơi được sao chép tới, thì kẻ tấn
công có thể cung cấp một lượng lớn dữ liệu cho ứng dụng đó, thực hiện ghi đè lên thông tin quản lý của heap.
Kẻ tấn công làm một bộ nhớ đệm bị tràn trên phần dưới của heap, ghi đè lên các biến động khác gây nên các
biến đổi bất ngờ và không mong muốn.
Lưu {: trong hầu hết các môi trường, điều này sẽ cho phép kẻ tấn công kiểm soát được việc thực thi của
chương trình.
- Hoạt Động Của Stack
"Hủy bỏ" một
Đặt một mục
mục trên Các hoạt động
lên trên đỉnh
cùng của ngăn Pop quan trọng của Push
của ngăn xếp.
xếp ngăn xếp.
Hoạt động của Push và Pop
Quay trở về nội dung được chỉ bởi con trỏ
và thay đổi con trỏ.
Mở rộng con trỏ lệnh Mở rộng con trỏ Stack
Mở rộng con trỏ nền
hiện hành (EIP) (ESP)
(EBP)
EIP trỏ đến đoạn mã mà bạn ESP trỏ đến vị trí hiện tại trên ngăn
Các máy chủ EBP như một điểm
xếp và cho phép vài thứ được thêm
đang thực hiện. Khi bạn gọi tĩnh để tra cứu thông tin trên
vào và loại bỏ từ ngăn xếp bằng
một hàm, chúng sẽ được lưu ngăn xếp giống như các biến và
cách sử dụng hoạt động push và
trữ trên ngăn xếp để sử dữ liệu trong một hàm sử dụng
pop hoặc thao tác trực tiếp con trỏ
dụng sau. các hiệu số.
ngăn xếp.
- Shellcode là một mã nhỏ được sử dụng trong việc khai thác lỗ hổng
của một phần mềm.
Bộ đệm là mục tiêu ưu thích của các kẻ tấn công vì chúng rất dễ tràn
nếu xảy ra điều kiện phù hợp.
Shellcode gây tràn bộ đệm, viết bằng hợp ngữ, khai thác các lỗ hổng
trong ngăn xếp và bộ nhớ quản lí heap.
- Không Xử Lý (NOPs)
Hầu hết các CPU đều có một
Kẻ tấn công các miếng đệm
lệnh No Operation (Không
nhằm mục đích bắt đầu lỗi
hoạt động) – nó không làm
tràn bộ đệm bằng các lệnh
gì nhưng thúc đẩy lệnh con
dài hạn của NOP (một NOP
trỏ.
chuyển động hoặc trượt) vi
thế CPU sẽ không làm gì cả
Thông thường, bạn có thể cho tới khi nó nhận được “sự
đặt một trong số chúng kiện chính” (trước “con trỏ
trước chương trình của bạn quay về).
(trong chuỗi).
ADMutate (bởi K2) chấp nhận
một lỗi tràn bộ đệm nhằm
Hầu hết các xâm nhập hệ khai thác như là đầu vào và
thống phát hiện (IDSs) bằng ngẫu nhiên tạo ra một phiên
cách tìm kiếm chữ ký trượt bản có chức năng tương
của NOP. đương (đa hình).
- BIỂU ĐỒ MODULE
Phương
Khái niệm pháp luận
tràn bộ nhớ tràn bộ nhớ
đệm đệm
Công cụ bảo Bút kiểm tra
Ví dụ tràn
mật tràn bộ tràn bộ nhớ
bộ nhớ đệm
nhớ đệm đệm
Biện pháp Phát hiện
đối phó tràn tràn bộ nhớ
bộ đệm đệm
- Kiến Thức Cần Thiết Để Khai Thác Lỗi Tràn Bộ Đệm Trong
Chương Trình
Hiểu biết về hoạt
động của bộ nhớ Hiểu biết về cách hệ Quen với các công
stack và heap thống gọi công việc cụ biên dịch và sửa
ở cấp độ mã máy lỗi như gdb
Kiến thức về lắp ráp Kiến thức ngôn ngữ
và ngôn ngữ máy lập trình C và Perl
- Các Bước Tràn Bộ Đệm
Bước 2
Bước 1
Ghi nhiều dữ liệu vào bộ
Tìm sự hiện diện và vị trí
đệm hơn mức mà nó có
của lỗ hổng tràn bộ đệm
thể xử lý.
Bước 4
Bước 3
Thay đổi luồng thực hiện
Ghi đè lên địa chỉ quay về
hàm bằng các mã hacker.
của hàm.
- Tấn Công Một Chương Trình Thực
Giả sử rằng một hàm chuỗi bị khai thác, kẻ tấn công
có thể gửi một chuỗi dài đầu vào.
Con trỏ trả về của hàm tiến hành ghi đè, và kẻ tấn
công thành công trong việc thay đổi luồng thực
hiện lệnh.
Nếu người sử dụng chèn vào mã đầu vào, anh
ta hoặc cô ta có thể biết chính xác địa chỉ và
kích thước của ngăn xếp và làm con trỏ trở về
hướng tới đoạn mã của mình để thực hiện chỉ
thị.
- Chuỗi Định Dạng Có Vấn Đề
Có vấn đề nếu người dùng
=“%%%%%%%%%%%”
Chương trình có thể sụp đổ gây
Trong C, xét ví dụ của chuỗi định
ra một Dos.
dạng có vấn đề. Nếu không, chương trình sẽ in
nội dung bộ nhớ
Lỗi toàn diện xảy ra bằng cách sử
dụng người dùng =“%n”
Int func(char *user)
{
Fprintf ( stdout, user);
}
Hình thức đúng
Int func (char *user)
{
Fprintf ( stdout,
“%s”, user) ; }
- Gây Tràn Bộ Đệm Bằng Cách Sử Dụng Chuỗi Định
Dạng
Trong C, xét ví dụ của BoF sử dụng Như thế nào nếu người dùng =
chuỗi định dạng có vấn đề. “%500d ”
Sẽ bỏ qua giới hạn “%400s”
Sẽ tràn biến outbuf.
- Phá Vỡ Stack
Ý tưởng chung là gây Khi hàm được thực
ra tràn bộ đệm để sau hiện xong nó sẽ nhảy
đó ghi đè lên địa chỉ tới bất kz địa chỉ nào
trả về. trên ngăn xếp.
Tràn bộ nhớ đệm cho
Đặt một số mã trong bộ
phép chúng ta thay đổi
đệm và thiết lập địa chỉ
địa chỉ trả về của một
trở về.
hàm.
nguon tai.lieu . vn