Archive for Tháng Mười, 2011

Tháng 10 28 2011

Chuỗi ROP cho Windows 8

Published by admin under Nghiên cứu

Không lâu sau khi Microsoft chính thức giới thiệu bản Developer Preview của Windows 8, tôi đã đọc được bài viết về cơ chế ngăn chặn ROP (Return Oriented Programming) trên Windows 8 và cách để vượt qua nó. Theo đó, tôi đã thực nghiệm và viết một chuỗi ROP có thể dùng chung cho các mã khai thác dùng kỹ thuật ROP trên Windows 8.

Để các bạn có thể hình dung rõ hơn, tôi sẽ miêu tả thêm một chút về cơ chế chống lại phương thức khai thác ROP của Windows 8. Như chúng ta đã biết, khi viết mã khai thác ROP, ta thường phải sắp xếp một chuỗi lệnh để thực thi các hàm có thao tác với Virtual Memory như VirtualProtect, VirtualAlloc… Chính vì thế, Windows 8 sẽ thực hiện kiểm tra ngăn xếp (stack) trước khi gọi các hàm này bằng cách so sánh thanh ghi ESP. Nếu ESP nằm giữa StackBase (FS:[8]) và StackTop (FS:[4]), khi đó địa chỉ stack là hợp lệ và hàm được thực thi. Ngược lại stack là không hợp lệ và quá trình gọi hàm sẽ không được thực hiện. Tuy nhiên, thực tế là cơ chế này không có tác dụng với những lỗi tràn bộ nhớ đệm trên stack (stack buffer overflow), và cũng không khó để vượt qua đối với nhiều lỗi khác. Giải pháp ở đây là chúng ta lưu lại địa chỉ stack (thanh ghi ESP) và phục hồi lại trước khi gọi hàm.

Tôi đã thực nghiệm phương pháp trên với lỗi CVE-2011-0065 của Firefox. Lỗi này đã có mã khai thác trên Windows 7 , trong đó có sử dụng chuỗi ROP cho Windows 7 của Corelan . Vì Windows 8 được bổ sung thêm cơ chế bảo vệ mới (như đã nêu trên) nên chuỗi ROP này (cũng như các chuỗi ROP khác đã được viết và sử dụng phổ biến trên Windows 7 trước đây) không có tác dụng trên hệ điều hành mới này của Microsoft.

Từ đây, như đã nói từ đầu, tôi đã xây dựng một chuỗi ROP mới có thể vượt qua cơ chế bảo vệ trên Windows 8 và tiện dụng cho những lần khai thác sau này.

Chuỗi ROP được xây dựng dựa trên:

-         Sử dụng module msvcr71.dll – v7.10.3052.4

-         Được gắn với: JRE (Java) 1.6

-         Load với trình duyệt.

-         Làm việc được trên Windows XP/Vista/Win7/Win8/2003/2008.

-         Module không bị ASLR.

-         Sử dụng hàm kernel32.VirtualProtect.

-         Địa chỉ cơ sở: 0×7c340000.

-         Kích thước 0×56000.

Tất nhiên bạn chỉ cần sử dụng chuỗi ROP này thay cho cái cũ, khi mà việc thay đổi địa chỉ stack là bắt buộc cho mã khai thác ROP của bạn. Chuỗi ROP của tôi có thể hoạt động với điều kiện EAX đang trỏ đến một vùng stack hợp lệ nào đó (tức thuộc khoảng giữa FS:[4] và FS:[8]). Vì vậy để sử dụng nó, trước khi vào chuỗi ROP, bạn phải có thanh ghi hoặc vùng nhớ nào đó lưu giữ một địa chỉ stack hợp lệ (thường chính là địa chỉ stack cũ trước khi thay đổi). Sau đó chuyển nó vào EAX và bắt đầu chuỗi ROP.

Chuỗi ROP đã được kiểm thử và chạy ổn định trên Windows 7, Windows 8 và một vài hệ điều hành khác.

Nguyễn Hồng Sơn – Bkav Security

1 Comment