Cách đây vài ngày, tôi đã xuất bản một bài viết trình bày chi tiết cách thứ hai, trong quá trình bắt tay vào kênh TLS, có thể cho phép kẻ tấn công kích hoạt chồng lỗi DecodeSigAndReverse trong một chỉ chứng chỉ ứng dụng. Tôi đã nói rằng tôi không quen thuộc với ký tự ECC và không chắc chắn về cách kích hoạt khai thác; Tuy nhiên, một vài nghiên cứu đã được khôi phục.
Bài đăng của BeyondTrust có ý nói rằng họ đã hoạt động tràn ngập bằng cách sửa đổi ECC ngẫu nhiên ký tự, mặc dù tôi tin rằng điều này khó xảy ra và chỉ là một giải pháp thay thế an toàn hơn để tiết lộ chính xác cách kích hoạt hoạt động khai thác. Tôi có thể đạt được công việc thực thi mã từ xa với ASLR hoặc DEP được vô hiệu hóa, nhưng trên một hệ thống có cả hai điều đó sẽ chứng minh một công thức khá lớn, do đó tôi không quá lo lắng về việc nêu chi là ra từ isflow isflow isflow isflow isflow isflow isflow isflow isflow isflow isflow isflow isflow is the
DecodeSigAndReverse
Chúng tôi đã biết chức năng của nó tràn ra, vì vậy tôi quyết định làm việc ngược lại từ đó. Đây là ký tự ECC giải mã chức năng được mã hóa ASN.1 (DER) và gửi lại để được xác minh.

Lần đầu tiên được thực hiện ở đây là ECC ký tự được chuyển sang CryptDecodeObject để tính kích thước của ký tự được giải mã, được sử dụng để cấp cho một số cách sử dụng SPExternalAlloc (LocalAlloc Wrapper). CryptDecodeObject sẽ luôn xử lý ký tự một cách xác định chính xác, với kích thước trả về là đủ.

CryptDecodeObject được gọi lại, nhưng lần này nó được chuyển một con trỏ tới bộ nhớ cấp phát để sao chép ký tự đã giải mã. “Cmp ebx, 2Fh” kiểm tra ký tự loại (X509_ECC_SIGNATURE) và sẽ hướng mã sang bên trái.
Chữ ký được giải mã được trỏ tới bởi một tiêu đề ECC_SIGNATURE, có kích thước byte 12, giống như thế này.

R và S là những gì không quan trọng ở đây, tất cả những thứ chúng ta cần biết chúng là Nhân dân tệ quan trọng nhất. ECC trúc của chúng tôi, tôi đang hiện tại, tôi chứa kích thước của mỗi số nguyên và một điểm mà nó đã được lưu trữ.
Hiện tại hoạt động ghi nhớ đã được xác định rõ ràng, tác vụ đầu tiên sao chép byte rSize from R vào một bộ nhớ được cấp, sau đó tác vụ thứ hai sao chép byte sSize của S vào cùng một bộ nhớ. R; If sắp có sự cố tràn ra Nó sẽ có trong thứ hai của bộ nhớ. Chúng tôi không biết gì về kích thước của bộ nhớ hoặc cách thức nó được cấp phát.

Tất cả những gì tôi phải làm để tìm kiếm bộ nhớ được cấp phát là xem biểu đồ, tìm kiếm chức năng giải mã DecodeSigAndReverse, sau đó tìm kiếm tham số “Dst”.
Điều này đúng với tất cả các thứ tự (hoặc không tốt nếu bạn là Microsoft). _BCryptGetProperty đang được chuyển “KeyLength” cho… Làm trống rỗng…. lấy độ dài khóa. Ngay dưới that length is shared for 8 (is move from byte sang bit) after that kernel; Điều này là do chiều dài ký hiệu (nên) gấp đôi chiều dài ký hiệu. Ngay trước cuộc gọi tới DecodeSigAndReverse, chúng ta có thể thấy rằng bộ đệm đích cũng được cấp phát trên heap.

Vì vậy, bây giờ hãy quay lại 2 memcpys với kiến thức về kích thước đệm mục tiêu, chúng ta có thể thấy cái gì đó tạo ra chất lượng chồng chính xác. Nếu chúng ta sử dụng kích thước khóa là 256 bit (32 byte), thì hàm mong đợi một ký tự 512 bit (64 byte), bất kỳ ký tự nào khác sẽ tràn ra chồng và khi nó được giải phóng sẽ tạo ra sự cố .
Có rất ít ràng buộc đối với các ký tự, do toàn bộ thực tế chỉ là 2 số lớn. Miễn phí là chúng tôi duy trì hợp lệ ASN.1 (DER) mã hóa và chữ ký có hợp lệ kích thước, chúng tôi có thể ghi dữ liệu tùy chọn vào tiêu đề ngăn xếp vào phạm vi quyền truy cập hoặc thậm chí là Thực hiện mã từ xa khi hệ thống cố gắng phóng to bộ nhớ.