A push operation copies a value onto the stack. When a new value is pu dịch - A push operation copies a value onto the stack. When a new value is pu Việt làm thế nào để nói

A push operation copies a value ont

A push operation copies a value onto the stack. When a new value is pushed,

ESP (the stack pointer) is decremented. ESP always points to the last value pushed. The PUSH instruction is used to accomplish this (Figure 3). The PUSH instruction does not change the contents of EAX, but rather it copies the contents of EAX onto the stack. As more values are pushed, the stack continues to grow downward in

memory (Figure 4).
.
A pop operation removes a value
from the top of the stack and
places it in a register or variable.
rights
After the value is popped from the
stack, the stack pointer is
full
incremented to point to the
previous value on the stack. The
POP instruction is used to
accomplish this (Figure 5).
retains
Now that we have seen how the
stack works at the assembler and
machine code level, let’s examine
using C/C++ code. this same process from above

Stack Operations With C/C++
We have now seen how memory is
2002,
allocated when an executable is first loaded.
We have also looked specifically at the
stack segment, how a program pushes and
pops runtime data to it and from it, and how
the stack pointer (ESP) holds the address of
the last data elementInstituteadded to the top of the
stack. This is all well and good, but it has
provided little insight into how buffer
overruns are used and exploited. That
being the case,SANSit is now time to roll up our
©
sleeves and get down to some serious
business. Time is valuable, so lets not
mess around any longer. Needless to say,
though, this is where things start to get a bit
messy and complicated.
2/6/2003 Page 8 of 24





© SANS Institute 2002, As part of the Information Security Reading Room. Author retains full rights.


Enter the stack frame pointer (SFP)8. The frame pointer always points to a fixed location within the stack frame. Technically speaking, any parameters or local variables that are pushed onto the stack

could be referenced by their offsets from the stack pointer (ESP). However, due to the dynamic nature of the stack, these offsets are provided their own reference and are normally stored in the EBP (base pointer) register. In the CPU, this is accomplished by assembly instructions involving both the SFP and

EBP. Consequently, function parameters pushed onto the stack will have positive offsets from SFP, while local variables will have negative offsets from SFP9.

When a function is invoked in the

C/C++ language, variables already on the stack must be saved, and space Authorfor any new variables must be allocated.
The opposite is true when a function
exits. When this happens, the prior SFP is pushed onto the stack and a new is
SFP is created. ESP then operates with reference to the new local variables.
2002, The following function fragment is drawn from a program developed specially for
Let’s illustrate with some actual code to limit the mass confusion that must be setting in about now.


this study to demonstrate “stack smashing” and the hacking capabilities presented by the buffer overflow situation. It’s amazing the damage just a few lines of code can do. But we are not quite ready to unveil it all as we still have a
few things to learn first. At this moment, we are only concerned with the
sequential order compiledInstituteC/C++ code pushes data onto the stack. From this,
we may glean some ideas for potential exploits. So let’s take a look.
© SANS





8 The stack frame pointer (SFP) is sometimes referred to as the local base pointer (BP).

9 Remember it was stated earlier that stack operations were enough to make your head spin.
2/6/2003 Page 9 of 24





© SANS Institute 2002, As part of the Information Security Reading Room. Author retains full rights.

The authenticate() function (shown below) is anything but hypothetical. It’s going to do some real work for us. However, it has been temporarily modified so we can learn from it. Authenticate() is designed to authenticate a user attempting to
“login” to a computer
system. Access is then
either permitted or denied.
Authenticate() accepts two
string pointers as arguments
(passed in as parameters).
The two 16 byte parameters
consist of a password
entered by the user, and a
password obtained from the
system, presumable either
from the SAM database in
Windows NT or the
/etc/passwd (/etc/shadow/) in UNIX10.
Additionally, authenticate() contains two local 16 byte data buffers11 into which
the password parameter values will copied. Through a little programming
trickery12 we can actually watch the retains and local buffers be
parameter values
pushed onto the stack. The compiled assembler code, minus the printf() statements, appears as follows:
Author









When executed, thisInstitutecode first pushes the two arguments to authenticate() backwards onto the stack. It then calls authenticate(). The instruction CALL then
10 Windows NTSANSimplies any Windows system utilizing the core NT kernel to include Windows 2000 and Windows.NET. UNIX includes the feisty UNIX clone, Linux.

11 It is important© to note that even though these buffer arrays consist of eight ASCI characters, each “char” data type is allocated two bytes (one word) of memory in a 32-bit system.

12 To do this, we will supply the hexadecimal notation (%x) to the C printf() function in place of the string notation (%s).

13 Referred to as ret, EIP is now holding the address of the next code to be executed one the authenticate() function exits. 13
2/6/2003 Page 10 of 24






© SANS Institute 2002, As part of the Information Security Reading Room. Author retains full rights.

to execute on its own. First, it pushes the stack frame pointer onto the stack. The current stack pointer (ESP) is then copied into EBP, making it the new frame pointer (SFP). Next, memory space is allocated to the local buffers by subtracting their size from ESP. Finally, the printf() functions kick-in to verify that indeed this is what is occurring on the stack. Here is what we see when we run this block of code:


rights .

What we expected would happen, in fact, did happen.fullFirst, parameter 2 (char pointer string2) is pushed onto the top of the stack at address 0x12fdd8, thereby assuming the highest memory address. Next, we
2. Since the stack grows downward toward retainslower memory address, we should expect parameter 1 to
see parameter 1 (char pointer string1) pushed onto

the top of the stack, but backwards from parameter

Author





Next, although not exposed here, instruction
hold a lower memory address. In fact, it holds address value 0x12fdd4, exactly four bytes down for parameter 214.


pointer (EIP) and the stack frame pointer (EBP) are
each pushed in respective order. Finally, memory
for the two local buffers is allocated2002, on the stack.
With the stack continuing to grow downward, buffer1 takes address 0x12fdc0, and again as expected, buffer2 grabs address 0x12fdb0 at the top of the stack, exactly 16 bytes down from

buffer1. Institute

Wow. What a mouthful. To simplify this dribble and put everything in proper perspective, let’s
diagram the stack as it exits in its present condition
(Figure 6).© SANS
What we have here is a stack just

14 Since the parameter values were both 16 byte values, you might be wondering why parameter 1 is four bytes down and not 16 bytes down. In C++, parameters may be passed either by value or by reference. Since they were passed by reference in this case, they are actually holding the 32-bit address of the value, and not the value itself. Had they been passed by value, their

addresses would be 12feb0 and 12fec0 respectively.
2/6/2003 Page 11 of 24






© SANS Institute 2002, As part of the Information Security Reading Room. Author retains full rights.

waiting to be “smashed”. The time has finally come to explore the methods and tactics behind the buffer overflow attack. Let’s put on our black hats and become the attacker.

THE METHOD

For a buffer overrun attack to be possible and be successful, the following events must occur, and in this order:

1. A buffer overflow vulnerability must be found, discovered, or identified.
.
2. The size of the buffer must be determined.
3. The attacker must be able to control the data written into the buffer.
rights
4. There must be security sensitive variables or executable program instructions
stored below the buffer in memory. full


5. Targeted executable program instructions must be replaced with other
executable instructions. retains

Let’s look at each of these five conditional steps individually.
0/5000
Từ: -
Sang: -
Kết quả (Việt) 1: [Sao chép]
Sao chép!
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..
Kết quả (Việt) 2:[Sao chép]
Sao chép!
Một bản sao hoạt động đẩy một giá trị vào stack. Khi một giá trị mới được đẩy, ESP (con trỏ stack) được giảm đi. ESP luôn trỏ tới giá trị cuối cùng đẩy. Các lệnh PUSH được sử dụng để thực hiện điều này (hình 3). Các lệnh PUSH không thay đổi các nội dung của EAX, mà đúng hơn là nó sao chép nội dung của EAX vào ngăn xếp. Khi giá trị hơn được đẩy, chồng tiếp tục phát triển đi xuống trong bộ nhớ (hình 4). . Một hoạt động loại bỏ các pop giá trị từ đỉnh stack và đặt nó trong một đăng ký hoặc biến. quyền Sau khi giá trị xuất hiện từ đống , con trỏ ngăn xếp là đầy đủ tăng lên để trỏ đến các giá trị trước đó trên stack. Các hướng dẫn POP được sử dụng để thực hiện điều này (Hình 5). giữ Bây giờ chúng ta đã thấy như thế nào ngăn xếp làm việc tại các nhà lắp ráp và máy cấp mã, chúng ta hãy xem xét sử dụng C / C ++. cùng quá trình này từ trên ngăn xếp hoạt động Với C / C ++ Bây giờ chúng ta đã thấy cách bộ nhớ được năm 2002, phân bổ khi thực thi lần đầu tiên được nạp. Chúng tôi cũng đã nhìn đặc biệt tại phân khúc chồng, làm thế nào một chương trình thúc đẩy và hiện dữ liệu thời gian chạy nó và từ nó, và làm thế nào con trỏ stack (ESP) giữ địa chỉ của các dữ liệu cuối cùng elementInstituteadded để phía trên cùng của ngăn xếp. Đây là tất cả tốt và tốt, nhưng nó đã cung cấp cái nhìn sâu sắc như thế nào ít đệm vượt được sử dụng và khai thác. Đó là trường hợp, SANSit giờ là thời gian để cuộn lên của chúng tôi © tay áo và nhận được xuống để một số nghiêm trọng kinh doanh. Thời gian là có giá trị, vì vậy không cho phép lộn xộn xung quanh nữa. Không cần phải nói, mặc dù, đây là nơi mà mọi thứ bắt đầu để có được một chút lộn xộn và phức tạp. 2003/02/06 Trang 8 trong 24 © SANS Institute năm 2002, Là một phần của Reading Room bảo mật thông tin. Tác giả giữ toàn quyền. Nhập con trỏ stack frame (SFP) 8. Con trỏ khung luôn luôn chỉ vào một vị trí cố định trong khung stack. Về mặt kỹ thuật, bất kỳ thông số hoặc các biến địa phương được đẩy vào stack có thể được tham chiếu bởi hiệu số của họ từ con trỏ stack (ESP). Tuy nhiên, do tính chất năng động của ngăn xếp, các hiệu số được cung cấp tài liệu tham khảo của riêng mình và thường được lưu trữ trong các EBP (con trỏ cơ sở) đăng ký. Trong CPU, điều này được thực hiện bằng cách hướng dẫn lắp ráp liên quan đến cả hai SFP và EBP. Do đó, thông số chức năng đẩy vào stack sẽ có hiệu tích cực từ SFP, trong khi các biến cục bộ sẽ có hiệu tiêu cực từ SFP9. Khi một hàm được gọi trong C / C ++ ngôn ngữ, biến đã trên stack phải được lưu lại, và không gian Authorfor bất kỳ biến mới phải được phân bổ. Điều ngược lại cũng đúng khi một chức năng thoát. Khi điều này xảy ra, SFP trước khi được đẩy vào stack và một mới là SFP được tạo ra. ESP sau đó hoạt động với tham chiếu đến các biến địa phương mới. năm 2002, chức năng đoạn sau đây được rút ra từ một chương trình đặc biệt phát triển cho Hãy minh họa với một số mã thực tế để hạn chế nhầm lẫn khối lượng phải được thiết lập trong lúc này. nghiên cứu này để chứng minh "chồng đập "và khả năng hack được trình bày bởi tình hình tràn bộ đệm. Thật ngạc nhiên là 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 hoàn toàn sẵn sàng để công bố tất cả như chúng tôi vẫn có một số điều cần tìm hiểu đầu tiên. Tại thời điểm này, chúng tôi chỉ quan tâm đến thứ tự tuần tự compiledInstituteC / C ++ đẩy dữ liệu vào ngăn xếp. Từ đó, chúng tôi có thể thu thập một số ý tưởng để khai thác tiềm năng. Vì vậy, chúng ta hãy có một cái nhìn. © SANS 8 stack frame con trỏ (SFP) đôi khi được gọi là con trỏ cơ sở địa phương (BP). 9 Hãy nhớ rằng nó đã được tuyên bố trước đó rằng các hoạt động ngăn xếp là đủ để làm cho spin đầu của bạn. 2/6 / 2003 Trang 9 của 24 © SANS Institute năm 2002, Là một phần của Reading Room bảo mật thông tin. Tác giả giữ toàn quyền. Các xác thực () chức năng (hình dưới đây) 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 tế cho chúng ta. Tuy nhiên, nó đã được tạm thời thay đổi để chúng ta có thể học hỏi từ nó. Xác thực () được thiết kế để xác thực người dùng cố gắng "đăng nhập" vào máy tính hệ thống. Truy cập được sau đó hoặc là cho phép hoặc từ chối. Authenticate () chấp nhận hai con trỏ chuỗi như là đối số (thông qua tại như các thông số). Hai 16 byte thông số bao gồm một mật khẩu người dùng nhập vào và mật khẩu thu được từ hệ thống, hoặc có đoán từ cơ sở dữ liệu SAM trong Windows NT hoặc / etc / passwd (/ etc / shadow /) trong UNIX10. Ngoài ra, xác thực () chứa hai địa phương 16 byte dữ liệu buffers11 vào đó các giá trị tham số mật khẩu sẽ được 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 bộ đệm và giữ lại địa phương có giá trị tham số đẩy vào stack. Các mã lắp ráp biên soạn, trừ đi printf () báo cáo, xuất hiện như sau: Tác giả Khi thực hiện, thisInstitutecode đầu đẩy hai đối số để xác thực () ngược vào ngăn xếp. Sau đó các cuộc gọi xác thực (). CALL hướng dẫn sau đó 10 Windows NTSANSimplies bất kỳ hệ thống Windows sử dụng hạt nhân NT cốt lõi bao gồm Windows 2000 và Windows.NET. UNIX bao gồm các bản sao nóng tính UNIX, Linux. 11 © Đó là quan trọng cần lưu ý rằng mặc dù các mảng đệm bao gồm tám ký tự ASCI, mỗi "char" kiểu dữ liệu được phân bổ hai byte (một từ) 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 thập lục phân (% x) với C printf () chức năng ở vị trí của chuỗi ký hiệu (% s). 13 Gọi là ret, EIP hiện đang nắm giữ địa chỉ của các mã tiếp theo được thực hiện một trong những xác thực () thoát chức năng. 13 2003/02/06 Trang 10 của 24 © SANS Institute năm 2002, Là một phần của Reading Room bảo mật thông tin. Tác giả giữ toàn quyền. để thực hiện ngày của riêng mình. Đầu tiên, nó đẩy con trỏ stack frame vào ngăn xếp. Hiện nay con trỏ ngăn xếp (ESP) sau đó sao chép vào EBP, làm cho nó khung con trỏ mới (SFP). Tiếp theo, không gian bộ nhớ được phân bổ cho các địa phương vùng đệm bằng cách trừ đi kích thước của chúng từ ESP. Cuối cùng, printf () chức năng kick-để xác minh rằng thực sự đây là những gì đang xảy ra trên stack. Dưới đây là những gì chúng ta nhìn thấy khi chúng tôi chạy khối mã này: . quyền gì chúng tôi dự kiến sẽ xảy ra, trên thực tế, đã 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ả định địa chỉ bộ nhớ cao nhất. Tiếp theo, chúng ta 2. Kể từ khi chồng phát triển trở xuống hướng về địa chỉ bộ nhớ retainslower, chúng ta nên mong đợi tham số 1 để xem thông số 1 (char con trỏ string1) đẩy lên trên cùng của ngăn xếp, nhưng ngược từ tham số Tác giả Tiếp theo, mặc dù không tiếp xúc ở đây, hướng tổ chức một địa chỉ bộ nhớ thấp . Trong thực tế, nó giữ 0x12fdd4 giá trị địa chỉ, chính xác bốn byte xuống cho tham số 214. con trỏ (EIP) và con trỏ stack frame (EBP) đang từng đẩy để tương ứng. Cuối cùng, bộ nhớ đệm cho hai địa phương là allocated2002, trên stack. Với stack tiếp tục phát triển đi xuống, buffer1 có địa chỉ 0x12fdc0, và một lần nữa như mong đợi, buffer2 lấy địa chỉ 0x12fdb0 ở phía 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 ngụm. Để đơn giản hóa lừa bóng này và đặt tất cả mọi thứ trong quan điểm đúng đắn, chúng ta hãy sơ đồ ngăn xếp khi nó ra khỏi trong điều kiện hiện nay (hình 6). © SANS Những gì chúng tôi có ở đây một chồng chỉ là 14 Kể từ khi giá trị tham số đều là 16 giá trị byte, có lẽ bạn có tự hỏi tại sao thông số 1 là bốn byte xuống và không 16 byte xuống. Trong C ++, thông số có thể được thông qua bằng giá trị hoặc tham khảo. Vì họ đã được thông qua tham khảo trong trường hợp này, họ đang thực sự giữ địa chỉ 32-bit của giá trị, và không phải là giá trị bản thân. Họ đã được thông qua giá trị, họ sẽ là địa chỉ 12feb0 và 12fec0 tương ứng. 2003/02/06 Trang 11 của 24 © SANS Institute năm 2002, Là một phần của Reading Room bảo mật thông tin. Tác giả giữ toàn quyền. chờ đợi để được "đập tan". Hiện cuối cùng đã đến để khám phá những phương pháp và chiến thuật đằng sau 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 Đối với một cuộc tấn công tràn bộ đệm để có thể và thành công, các sự kiện sau đây phải xảy ra, và theo thứ tự: 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 của 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 các dữ liệu ghi vào bộ đệm. quyền 4. Có phải là biến nhạy cảm về bảo mật hoặc hướng dẫn chương trình thực thi được lưu trữ dưới đệm trong bộ nhớ. đầy đủ 5. Mục tiêu hướng dẫn chương trình thực thi phải được thay thế bằng các hướng dẫn thực thi. giữ Hãy xem mỗi năm bước có điều kiện riêng.






































































































































































































đang được dịch, vui lòng đợi..
 
Các ngôn ngữ khác
Hỗ trợ công cụ dịch thuật: Albania, Amharic, Anh, Armenia, Azerbaijan, Ba Lan, Ba Tư, Bantu, Basque, Belarus, Bengal, Bosnia, Bulgaria, Bồ Đào Nha, Catalan, Cebuano, Chichewa, Corsi, Creole (Haiti), Croatia, Do Thái, Estonia, Filipino, Frisia, Gael Scotland, Galicia, George, Gujarat, Hausa, Hawaii, Hindi, Hmong, Hungary, Hy Lạp, Hà Lan, Hà Lan (Nam Phi), Hàn, Iceland, Igbo, Ireland, Java, Kannada, Kazakh, Khmer, Kinyarwanda, Klingon, Kurd, Kyrgyz, Latinh, Latvia, Litva, Luxembourg, Lào, Macedonia, Malagasy, Malayalam, Malta, Maori, Marathi, Myanmar, Mã Lai, Mông Cổ, Na Uy, Nepal, Nga, Nhật, Odia (Oriya), Pashto, Pháp, Phát hiện ngôn ngữ, Phần Lan, Punjab, Quốc tế ngữ, Rumani, Samoa, Serbia, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenia, Somali, Sunda, Swahili, Séc, Tajik, Tamil, Tatar, Telugu, Thái, Thổ Nhĩ Kỳ, Thụy Điển, Tiếng Indonesia, Tiếng Ý, Trung, Trung (Phồn thể), Turkmen, Tây Ban Nha, Ukraina, Urdu, Uyghur, Uzbek, Việt, Xứ Wales, Yiddish, Yoruba, Zulu, Đan Mạch, Đức, Ả Rập, dịch ngôn ngữ.

Copyright ©2025 I Love Translation. All reserved.

E-mail: