Một hoạt động đẩy sao chép một giá trị vào ngăn xếp. Khi một giá trị mới đẩy,
ESP (con trỏ stack) là sai. ESP luôn luôn điểm đến cuối cùng giá trị đẩy. Hướng dẫn đẩy được sử dụng để thực hiện việc này (hình 3). Hướng dẫn đẩy không thay đổi nội dung của EAX, nhưng thay vì nó sao chép nội dung của EAX vào ngăn xếp. Giá trị như ngày càng được đẩy, ngăn xếp tiếp tục phát triển xuống tại
bộ nhớ (hình 4).
.
Một hoạt động pop loại bỏ một giá trị
từ phía trên cùng của ngăn xếp và
đặt nó trong một đăng ký hoặc biến.
quyền
sau khi giá trị popped từ các
ngăn xếp, con trỏ ngăn xếp là
đầy đủ
incremented để trỏ đến các
trước giá trị trên ngăn xếp. Các
POP hướng dẫn là được sử dụng để
thực hiện điều này (hình 5).
giữ lại
Bây giờ mà chúng tôi đã thấy làm thế nào các
ngăn xếp làm việc tại lắp ráp và
máy móc mã cấp, hãy kiểm tra
sử dụng C/C mã. quá trình này cùng một từ trên
Stack hoạt động với C/C
bây giờ chúng tôi đã thấy làm thế nào bộ nhớ là
2002,
phân bổ khi thực thi một lần đầu tiên được nạp.
Chúng tôi cũng đã xem xét cụ thể tại các
ngăn xếp phân đoạn, làm thế nào một chương trình đẩy và
bật dữ liệu thời gian chạy để nó và từ đó, và làm thế nào
con trỏ ngăn xếp (ESP) giữ địa chỉ của
elementInstituteadded dữ liệu cuối cùng lên đỉnh các
ngăn xếp. Điều này là tất cả tốt và tốt, nhưng nó có
cung cấp cái nhìn sâu sắc nhỏ vào làm thế nào bộ đệm
nghiêm được sử dụng và khai thác. Rằng
là trường hợp, SANSit là bây giờ thời gian để cuộn lên chúng tôi
©
tay áo và nhận được để một số nghiêm trọng
kinh doanh. Thời gian là có giá trị, vì vậy cho phép không
lộn xộn xung quanh nữa. Không cần phải nói,
mặc dù, đây là nơi mọi thứ bắt đầu để có được một chút
lộn xộn và phức tạp.
2/6/2003 trang 8 / 24
© SANS viện năm 2002, như là một phần của phòng đọc sách bảo mật thông tin. Tác giả vẫn giữ đầy đủ quyền.
nhập stack khung con trỏ (SFP) 8. Khung con trỏ luôn trỏ tới một vị trí cố định trong khung stack. Về mặt kỹ thuật nói, bất kỳ tham số hoặc biến địa phương được đẩy vào ngăn xếp
có thể được tham chiếu bởi của offsets từ con trỏ ngăn xếp (ESP). Tuy nhiên, do tính chất động của chồng, các offsets được cung cấp tài liệu tham khảo riêng của họ và thường được lưu trữ trong EBP (cơ sở con trỏ) đăng ký. Ở CPU, điều này được thực hiện bởi hội hướng dẫn liên quan đến cả hai SFP và
EBP. Do đó, tham số chức năng đẩy vào ngăn xếp sẽ có tích cực offsets từ SFP, trong khi biến địa phương sẽ có tiêu cực offsets từ SFP9.
khi một chức năng được đề xướng trong các
C/C ngôn ngữ, biến đã vào ngăn xếp phải được lưu, và không gian Authorfor bất kỳ biến mới phải được phân bổ.
đối diện là đúng khi một chức năng
thoát khỏi. Khi điều này xảy ra, SFP trước được đẩy vào ngăn xếp và một mới là
SFP được tạo ra. ESP sau đó hoạt động với tham chiếu đến biến mới địa phương.
2002, mảnh chức năng sau đây được rút ra từ một chương trình phát triển đặc biệt cho
của Hãy để minh họa với một số mã thực tế để hạn chế sự nhầm lẫn hàng loạt rằng phải thiết lập về bây giờ.
nghiên cứu này để chứng minh "ngăn xếp đập" và khả năng hack trình bày bởi tình trạng tràn bộ đệm. It's amazing những thiệt hại chỉ là một vài dòng mã có thể làm. Nhưng chúng tôi không khá sẵn sàng để công bố tất cả như chúng tôi vẫn còn có một
vài điều để tìm hiểu đầu tiên. Tại thời điểm này, chúng tôi chỉ có liên quan với các
thứ tự tuần tự compiledInstituteC/C mã đẩy các dữ liệu vào ngăn xếp. Từ đây,
chúng tôi có thể soi sáng một số ý tưởng cho tiềm năng khai thác. Vì vậy, chúng ta hãy xem xét.
© SANS
8 con trỏ khung stack (SFP) đôi khi được gọi là con trỏ cơ sở địa phương (BP).
9 nhớ đó tuyên bố trước đó rằng ngăn xếp hoạt động đã đủ để làm cho quay đầu của bạn.
2/6/2003 trang 9 / 24
© SANS viện năm 2002, như là một phần của phòng đọc sách bảo mật thông tin. Tác giả vẫn giữ đầy đủ quyền.
Chức năng authenticate() (dưới) là bất cứ điều gì nhưng giả thuyết. Nó sẽ làm một số công việc thực sự cho chúng tôi. Tuy nhiên, nó đã được tạm thời thay đổi vì vậy chúng tôi có thể học hỏi từ nó. Authenticate() được thiết kế để xác thực một người dùng cố gắng
"đăng nhập" vào một máy tính
hệ thống. Truy cập là sau đó
cho phép hoặc từ chối.
Authenticate() chấp nhận hai
chuỗi con trỏ như là đối số
(thông qua tại dưới dạng tham số).
Hai 16 byte tham số
bao gồm một mật khẩu
nhập bởi người sử dụng, và một
mật khẩu thu được từ các
hệ thống, presumable hoặc
từ cơ sở dữ liệu SAM trong
Windows NT hoặc các
/ etc/passwd (/ etc/bóng /) ở UNIX10.
Ngoài ra, authenticate() có chứa hai địa phương 16 byte dữ liệu buffers11 mà
giá trị tham số mật khẩu sẽ sao chép. Thông qua một chút lập trình
trickery12 chúng tôi thực sự có thể xem các giữ lại và địa phương bộ đệm
giá trị tham số
đẩy vào ngăn xếp. Mã biên dịch lắp ráp, trừ những điều khoản printf(), xuất hiện như sau:
tác giả
khi thực thi, thisInstitutecode đầu tiên đẩy hai đối số để authenticate() ngược vào ngăn xếp. Nó sau đó gọi authenticate(). Hướng dẫn cuộc gọi sau đó
10 Windows NTSANSimplies bất kỳ hệ thống Windows bằng cách sử dụng hạt nhân lõi NT bao gồm Windows 2000 và Windows.NET. UNIX bao gồm bản sao feisty UNIX, Linux.
11 điều quan trọng là © cần lưu ý rằng mặc dù các mảng đệm bao gồm tám ASCI ký tự, mỗi kiểu dữ liệu "char" được giao hai byte (một từ) của bộ nhớ trong một hệ thống 32-bit.
12 để làm điều này, chúng tôi sẽ cung cấp các ký hiệu hệ thập lục phân (%x) đến chức năng printf() C thay cho chuỗi ký hiệu (%s).
13 gọi là ret, EIP là bây giờ đang nắm giữ địa chỉ của mã tiếp theo được thực hiện một lối ra chức năng authenticate(). 13
2/6/2003 trang 10 của 24
© SANS viện năm 2002, như là một phần của phòng đọc sách bảo mật thông tin. Tác giả vẫn giữ đầy đủ quyền.
để thực hiện ngày của riêng mình. Đầu tiên, nó đẩy stack khung con trỏ vào ngăn xếp. Con trỏ chồng hiện tại (ESP) sau đó sao chép vào EBP, làm cho nó mới khung con trỏ (SFP). Tiếp theo, không gian bộ nhớ được cấp phát cho các bộ đệm địa phương bởi trừ kích thước của họ từ ESP. Cuối cùng, printf() chức năng kick trong để xác minh rằng thực sự đây là những gì đang xảy ra trên ngăn xếp. Dưới đây là những gì chúng ta thấy khi chúng tôi chạy này khối mã:
quyền.
Trong thực tế, những gì chúng tôi dự kiến sẽ xảy ra, đã làm happen.fullFirst, tham số 2 (char con trỏ string2) được đẩy lên phía trên cùng của ngăn xếp tại địa chỉ 0x12fdd8, do đó giả sử địa chỉ bộ nhớ cao nhất. Tiếp theo, chúng tôi
2. Kể từ khi ngăn xếp phát triển xuống về phía retainslower nhớ địa chỉ, chúng tôi nên mong đợi tham số 1 để
xem tham số 1 (char con trỏ string1) đẩy lên
phía trên cùng của ngăn xếp, nhưng ngược trở lại từ tham số
tác giả
tiếp theo, mặc dù không được tiếp xúc ở đây, chỉ dẫn
giữ một địa chỉ bộ nhớ thấp hơn. Trong thực tế, nó có giá trị địa chỉ 0x12fdd4, chính xác bốn byte cho tham số 214.
con trỏ (EIP) và con trỏ khung stack (EBP)
mỗi đẩy theo thứ tự tương ứng. Cuối cùng, bộ nhớ
cho hai bộ đệm địa phương là allocated2002, trên chồng.
Với chồng tiếp tục phát triển xuống, các buffer1 có địa chỉ 0x12fdc0, và một lần nữa như mong đợi, buffer2 lấy địa chỉ 0x12fdb0 ở trên cùng của ngăn xếp, chính xác 16 byte xuống từ
buffer1. Viện
Wow. Những gì một mouthful. Để đơn giản hóa này dribble và đặt tất cả mọi thứ trong quan điểm đúng đắn, của cho
sơ đồ ngăn xếp như nó ra khỏi của nó hiện tại tình trạng
(Figure 6). © SANS
Những gì chúng tôi có ở đây là một chồng chỉ
14 kể từ khi các giá trị tham số là cả hai byte 16 giá trị, bạn có thể tự hỏi tại sao tham số 1 là bốn byte xuống và không 16 byte xuống. C, tham số có thể được thông qua bởi giá trị hoặc bằng cách tham khảo. Kể từ khi họ được thông qua bởi tham chiếu trong trường hợp này, họ đang thực sự nắm giữ 32-bit địa chỉ của giá trị, và không có giá trị riêng của mình. Họ đã được thông qua bởi giá trị, của
địa chỉ nào là 12 tháng hai 0 và 12fec0 respectively.
2/6/2003 trang 11 của 24
© SANS viện năm 2002, như là một phần của phòng đọc sách bảo mật thông tin. Tác giả vẫn giữ đầy đủ quyền.
chờ đợi để được "đập vỡ". Thời gian cuối cùng đã đến để khám phá những phương pháp và chiến thuật đằng sau các cuộc tấn công tràn bộ đệm. Hãy đặt trên mũ đen của chúng tôi và trở thành những kẻ tấn công.
Phương pháp
cho một cuộc tấn công bộ đệm tràn ngập để có thể và được thành công, các sự kiện sau đây phải xảy ra, và theo thứ tự này:
1. Một lỗ hổng tràn bộ đệm phải được tìm thấy, phát hiện, hoặc xác định.
.
2. Kích thước bộ đệm phải được xác định.
3. Những kẻ tấn công phải có khả năng kiểm soát dữ liệu bằng văn bản vào bộ đệm.
quyền
4. Phải có an ninh nhạy cảm biến hoặc thực thi chương trình hướng dẫn
được lưu trữ dưới đây các bộ đệm trong bộ nhớ. đầy đủ
5. Hướng dẫn chương trình thực thi được nhắm mục tiêu phải được thay thế bằng nhau
thực thi hướng dẫn. giữ lại
hãy nhìn vào mỗi của những năm có điều kiện bước cá nhân.
đang được dịch, vui lòng đợi..
