Các tràn bộ đệm Một lỗi tràn bộ đệm là rất nhiều như đổ mười ounce nước trong một ly thiết kế để giữ tám ounce. Rõ ràng, khi điều này xảy ra, nước tràn ra mép của thủy tinh, đổ ra một nơi nào đó và tạo ra một mớ hỗn độn. 6. Ở đây, kính đại diện cho các bộ đệm và các nước đại diện cho ứng dụng hoặc dữ liệu người dùng. Hãy xem xét một đơn giản C / C ++ đoạn mã mà vượt một bộ đệm. Trong chức năng này, chúng ta có một bộ đệm có khả năng giữ tám ký tự ASCII. quyền Giả sử chúng ta đang ở trên một hệ thống 32-bit, điều này có nghĩa là 16 byte của bộ nhớ đã được phân bổ cho các đệm. Sau đó chúng tôi đặt toàn bộ đệm trong một vòng lặp khởi tạo và force- thức ăn 15 "x" ký tự vào nó thông qua lỗi lập trình. Rõ ràng họ không phải là tất cả sẽ phù hợp với, và chín trong số họ phải đổ hơn vào một số khu vực bộ nhớ khác như nước tràn ly của nó. Chú ý có không có mã trong chức năng này để kiểm tra các giới hạn của mảng hoặc để ngăn chặn điều này xảy ra lỗi lập trình. Theo hầu hết các điều kiện này, tràn ngập của aAuthorbuffer không trình bày một vấn đề an ninh trong một bãi chứa lõi. Các buffer2002, tràn bản thân thực sự là đơn giản. Như chúng ta sẽ sớm thấy, mặc dù xác định và khai thác lỗ hổng này làm phức tạp vấn đề riêng của mình. Thông thường, một lỗi phân khúc sẽ xảy ra và chương trình sẽ chấm dứt Các tài liệu definesInstitutethe "Stack" và "Heap" là hai loại chính của các tình huống tràn bộ đệm. Stack tràn có hai kiểu khác nhau. Một loại rất nhanh. Các loại đệm tràn liên quan đến việc ghi đè lên (và do đó thay đổi) biến nhạy cảm an ninh, kiểm soát 5 Với ngoại lệ của VMS, hầu hết các kiến trúc máy tính, bao gồm Spark, xử lý bộ nhớ SANS sử dụng trong một thời trang tương tự. Một sự khác biệt phải được xem xét là lớn về cuối, ít về cuối © tượng. Trong kiến trúc lớn về cuối, các byte tận cùng bên trái (những người có địa chỉ thấp hơn) là quan trọng nhất. Trong kiến trúc ít về cuối, các byte ngoài cùng bên phải là quan trọng nhất. Nhiều máy tính lớn, đặc biệt là máy tính lớn IBM, sử dụng một kiến trúc lớn về cuối. Hầu hết các máy tính hiện đại, bao gồm máy tính, sử dụng hệ thống ít về cuối. Hệ thống PowerPC là bi về cuối bởi vì nó có thể hiểu được cả hai hệ thống. 6 Trong thuật ngữ đơn giản của nó, một bộ đệm là một đoạn bộ nhớ được sử dụng để tạm thời lưu trữ dữ liệu người dùng. 2003/02/06 Trang 4 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 lưu trữ trong bộ nhớ tiếp giáp với bộ đệm không được kiểm soát. Loại phổ biến nhất của chồng tràn liên quan đến việc ghi đè lên các con trỏ chức năng có thể được sử dụng để thay đổi dòng chảy chương trình được đặc quyền nâng cao trong môi trường hệ điều hành. Các đống tràn ngập phức tạp hơn liên quan đến việc cấp phát bộ nhớ động, hoặc cấp phát bộ nhớ lúc chạy thời gian bằng một ứng dụng. Trong nghiên cứu này, chúng tôi sẽ đặt trọng tâm vào việc Stack tràn bộ đệm. Tuy nhiên, trong cả hai trường hợp, người ta phải có một sự hiểu biết tốt về hệ điều hành cấp phát bộ nhớ, và cách ứng dụng sử dụng phân bổ này. Ngoài ra, . này có thể là cơ hội thận trọng để xác định và chứng minh những gì stack và heap và làm thế nào họ làm việc trong ứng dụng thực tế. quyền cơ cấu và quản lý bộ nhớ Chương trình Bất kỳ ứng dụng hoặc chương trình một cách hợp lý có thể được chia thành hai phần cơ bản của văn bản và dữ liệu. Văn bản là chỉ đọc chương trình thực tế fullcode ở định dạng máy có thể đọc được, và dữ liệu là những thông tin mà các văn bản hoạt động trên vì nó thực hiện hướng dẫn. Văn bản dữ liệu cư trú trong khu vực thấp hơn của một quá trình phân bổ bộ nhớ. Một số trường hợp của cùng một chương trình có thể chia sẻ vùng nhớ này. dữ liệu, lần lượt, có thể được chia thành ba phần logic tĩnh, ngăn xếp, và đống dữ liệu. Sự khác biệt giữa các loại là vẫn giữ được phụ thuộc vào khi nào và như thế nào bộ nhớ được phân bổ, và nơi mà nó được lưu trữ hoặc nằm. Khi thực thi lần đầu tiên được tải bởi các hệ điều hành, các văn bản segmentAuthoris nạp vào bộ nhớ đầu tiên. Các dữ liệu phân đoạn sau đó làm theo. Hình 1 thể hiện các mối quan hệ. năm 2002, dữ liệu tĩnh, nằm ở trên và liền kề với các dữ liệu văn bản, thông tin trước khi được biết đến có không gian lưu trữ được biên dịch vào chương trình. Vùng nhớ này thường được dành cho variablesInstitute toàn cầu và C ++ tĩnh thành viên lớp. Dữ liệu tĩnh có thể ở một trong hai trạng thái khởi tạo hoặc chưa được khởi tạo. Đống dữ liệu, nằm ở trên và tiếp giáp với tĩnh dữ liệu, là allocatedSANS trong thời gian chạy của C © chức năng ngôn ngữ malloc () và calloc (), và C ++ điều hành mới. Các đống lớn lên từ một địa chỉ bộ nhớ thấp hơn đến một địa chỉ bộ nhớ cao hơn. 2003/02/06 Trang 5 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. Stack là một cấu trúc dữ liệu thực tế trong bộ nhớ, truy cập trong LIFO (last-in, đầu ra) theo thứ tự. Phân đoạn bộ nhớ này, nằm ở trên và tiếp giáp với dữ liệu heap, phát triển xuống từ một địa chỉ bộ nhớ cao hơn đến một địa chỉ bộ nhớ thấp hơn. Giống như dữ liệu đống, đống dữ liệu còn được phân bổ trong thời gian chạy. Stack là giống như một "đầu pad" tạm thời nắm giữ các thông số của chức năng và biến địa phương, cũng như các địa chỉ trả lại cho lệnh tiếp theo được thực hiện. Địa chỉ trở lại này là quan trọng hàng đầu vì nó đại diện cho mã thực thi ngồi trên đống chờ đợi đến lượt của mình để thực hiện. Một sự hiểu biết thấu đáo về chồng và làm thế nào nó hoạt động và. biểu diễn là điều cần thiết để có thể hiểu như thế nào lỗ hổng tràn bộ đệm có thể được sử dụng và khai thác cho mục đích quanh co và nguy hiểm. Đây là trường hợp, chúng ta cần phải khám phá những ngăn xếp và phân đoạn ngăn xếp trong một chi tiết nhỏ hơn. Để làm điều này, chúng tôi sẽ quyền phải đi đường vòng tạm thời và mạo hiểm xuống đến cấp độ phần cứng và vào ruột của Intel 80386 CPU. Hãy bắt đầu với CPU Đăng ký. đầy đủ Đăng ký Đăng ký hoặc là 16 hoặc 32 BIT7 tốc độ cao địa điểm lưu trữ trực tiếp bên trong CPU, được thiết kế để truy cập tốc độ cao. Theo mục đích của cuộc thảo luận, đăng ký có thể được nhóm lại thành bốn loại dữ liệu, bộ phận, chỉ số và kiểm soát giữ lại (xem bảng II). Chắc chắn, có một số thuật ngữ ở đây là nên có vẻ hơi quen thuộc. Các thiết lập đăng ký hoàn toàn được minh họa trong hình 2. BẢNG II ĐĂNG KÝ SET INTELAuthor80386 KIẾN TRÚC mục Đăng ký chức năng dữ liệu EAX (ắc quy) năm 2002, được sử dụng cho số học và dữ liệu movement.Each EBX (cơ sở) đăng ký có thể được giải quyết hoặc là một chút 16 hoặc 32 ECX (truy cập) giá trị. EBX có thể giữ địa chỉ của một thủ tục hoặc EDX (dữ liệu) biến. Segment CS (đoạn mã) được sử dụng làm địa điểm cơ sở để được hướng dẫn chương trình, dữ liệu, DS (đoạn dữ liệu) và ngăn xếp. Tất cả các tham chiếu tới bộ nhớ liên quan đến một SS (stack phân khúc) đoạn đăng ký sử dụng như một địa điểm cơ sở. ES (bộ phận phụ) FS & GS Viện Index EBP (con trỏ cơ sở) Bao gồm các hiệu số của dữ liệu và hướng dẫn. Thuật ngữ ESP (ngăn xếp con trỏ) bù đắp đề cập đến khoảng cách của một biến hoặc hướng dẫn ESI (chỉ số nguồn) từ phân khúc cơ sở của nó. Các con trỏ ngăn xếp chứa EDI (chỉ đích) offset của đỉnh ngăn xếp SANS kiểm soát © EIP (hướng dẫn con trỏ) Các con trỏ chỉ dẫn luôn luôn có bù đắp của EFLAGS lệnh tiếp theo được thực hiện trong hiện tại đoạn mã. Ví dụ, đoạn ghi CS, DS, ES, SS và sử dụng như địa điểm cơ sở để được hướng dẫn chương trình (dữ liệu văn bản), dữ liệu (dữ liệu tĩnh và heap), và chồng 7 32-bit và 64-bit trong 64 bit hệ thống như Alpha và mới Intel Itanium. 2003/02/06 Trang 6 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. (ngăn xếp dữ liệu). Chỉ số đăng ký EBP và ESP chứa tài liệu tham khảo để bù đắp sổ đăng ký mã số, dữ liệu, và ống khói. Họ đang có, có hiệu lực, một la bàn định vị hoặc dịch vụ cho phép các chương trình để theo dõi chính xác nơi mà tất cả các dữ liệu và hướng dẫn của nó được đặt. Việc đăng ký dữ liệu chứa các bit dữ liệu thực tế và được sử dụng để di chuyển và thao tác dữ liệu này. EBX đặc biệt hữu ích để giữ địa chỉ của một chức năng hoặc biến. EBX đóng một vai trò quan trọng trong việc khai thác một bộ đệm tràn ngập. Việc đăng ký kiểm soát là đơn vị lưu trữ bit-khôn ngoan sử dụng để cảnh báo . hoặc chương trình chương trình hoặc CPU của các quốc gia quan trọng hoặc các điều kiện, trong các dữ liệu của chính nó. EIP có tầm quan trọng đặc biệt vì nó chứa địa chỉ của lệnh kế tiếp để được thực thi. Một lần nữa, đây là một yếu tố quan trọng trong việc khai thác tràn bộ đệm. Stack quan tâm chính của chúng tôi, tất nhiên, là chồng. Hãy nhìn vào cấu trúc dữ liệu này một chút gần gũi hơn và xem làm thế nào nó liên quan đến giao diện và với đăng ký. Chúng ta buộc phải nhìn vào một chút mã ngôn ngữ lắp ráp tại thời điểm này, nhưng như bạn sẽ thấy, nó thực sự không phải là tất cả những gì đáng sợ. Như đã đề cập trước đó, chồng là một đặc biệt bộ nhớ đệm bên ngoài của CPU usedAuthoras một khu vực tạm giữ cho địa chỉ và dữ liệu. Ngăn xếp nằm bên trong của ngăn xếp phân khúc. Mỗi vị trí 16-bit trên stack là năm 2002, chỉ bởi ESP đăng ký, hoặc ngăn xếp con trỏ. Các con trỏ ngăn xếp, lần lượt, giữ địa chỉ của các phần tử dữ liệu cuối cùng được thêm vào , hoặc đẩy vào stack. Điều quan trọng là noteInstitutethat hoạt động đẩy là đẩy dữ liệu ngược trở lại vào ngăn xếp. Đây là những gì gây ra ngăn xếp bộ nhớ để phát triển đi xuống, hoặc phát triển theo hướng SANS các địa chỉ bộ nhớ thấp hơn. Bây giờ điều này có thể thực sự © gây nhầm lẫn và làm cho một người quay đầu, nhưng nó phải được hiểu để thực hiện một cuộc tấn công trên stack. Vì vậy, xin vui lòng, chỉ cần treo chặt chẽ. Ngược lại, giá trị cuối cùng được thêm vào stack cũng là người đầu tiên được gỡ bỏ, hoặc xuất hiện từ ngăn xếp. Do đó, thứ
đang được dịch, vui lòng đợi..
