Giới thiệu NX và ASLR
Trong bài trước (Video hướng dẫn khai thác BoF cơ bản - https://whitehat.vn/threads/video-huong-dan-khai-thac-bof-co-ban.8391/), mình chưa đề cập đến hai vấn đề: cơ chế ASLR và NX trên Ubuntu (hay Linux nói chung). Hôm nay mình trình bày về hai nội dung này.
NX (Non-eXecute – Chống thực thi)
Đây là tính năng ngăn chặn việc thực thi các đoạn mã trong các vùng nhớ chứa data (stack, heap,…). Tính năng này yêu cầu CPU phải hỗ trợ, và HĐH phải sử dụng chế độ địa chỉ “PAE”.
PAE - Page Address Extension (hay Physical Address Extension), là chế độ truy cập địa chỉ theo Page của CPU. Khi CPU thực thi một lệnh, nó sẽ kiểm tra trong Page Table Entry xem bít NX có được bật không. Nếu không được bật thì lệnh tại đó sẽ không được thực thi. Như trong hình dưới (XP – Settings) là tùy chọn cài đặt cho một máy ảo XP của VirtualBox. Các bạn thấy trong đó có một tùy chọn là Enable PAE/NX. Nếu bật tùy chọn này lên thì máy ảo mới có tính năng Chống thực thi dữ liệu DEP – Data Execution Prevention.
Khi bật tính năng này lên, shellcode trên stack của ta sẽ không chạy được (trong bài printHello lần trước mình dùng con shellcode binsh vất lên stack). Để có thể demo được, mình phải tắt tính năng này đi
Các cách tắt DEP trên Ubuntu:
Tắt khi biên dịch: gcc -z execstack -o outFile inFile.c
Tắt bằng cách này, gcc sẽ đánh dấu stack là RWE, tức là có quyền thực thi.
Để kiểm tra quyền thực thi trên stack, dùng:
readelf -l fileName
Tắt tại kernel (HĐH):
Kể cả các vùng nhớ được đánh dấu là không có quyền thực vẫn thực thi được.
Thêm noexec=off vào dòng linux trong menu-entry của grub.cfg (thông thường, grub.cfg nằm trong /boot/grub/)
Mỗi lần update-grub thì file này bị thay đổi dữ liệu hoàn toàn, nên ta phải sửa lại menu-entry sau mỗi lần update-grub
Kiểm tra nx đang bật hay tắt bằng: dmesg | grep NX
Tắt NX của máy ảo VirtualBox
Như hình “XP – settings” trên, để tiện việc demo, ta có thể tắt DEP luôn bằng tùy chọn của VirtualBox mà không phải động đến file thực thi hay HĐH.
ASLR (Address space layout randomization – Random địa chỉ)
Tính năng này được cài đặt bởi HĐH. Mỗi khi load một file chạy lên, địa chỉ các phân vùng bộ nhớ (stack, heap, thư viện chia sẻ shared library) sẽ thay đổi. Điều này khiến hacker khó tạo file exploit hơn, vì địa chỉ của các hàm, dữ liệu không cố định.
Khi nghiên cứu khai thác, ta đôi khi phải tắt ASLR đi, để khai thác được dễ dàng hơn.
Để tắt ASLR:
Tắt aslr tạm thời (khi khởi động lại thì aslr lại bật): echo 0 > /proc/sys/kernel/randomize_va_space
Bật aslr lại: echo 2 > /proc/sys/kernel/randomize_va_space
Muốn tắt vĩnh viễn, tạo file /etc/sysctl.d/01-disable-aslr.conf có nội dung
kernel.randomize_va_space = 0
Như vậy, khi thực hiện tìm hiểu cơ bản về khai thác trên Linux, hãy nhớ tắt 2 tính năng này đi trước nhé.
Tham khảo:
NX (Non-eXecute – Chống thực thi)
Đây là tính năng ngăn chặn việc thực thi các đoạn mã trong các vùng nhớ chứa data (stack, heap,…). Tính năng này yêu cầu CPU phải hỗ trợ, và HĐH phải sử dụng chế độ địa chỉ “PAE”.
PAE - Page Address Extension (hay Physical Address Extension), là chế độ truy cập địa chỉ theo Page của CPU. Khi CPU thực thi một lệnh, nó sẽ kiểm tra trong Page Table Entry xem bít NX có được bật không. Nếu không được bật thì lệnh tại đó sẽ không được thực thi. Như trong hình dưới (XP – Settings) là tùy chọn cài đặt cho một máy ảo XP của VirtualBox. Các bạn thấy trong đó có một tùy chọn là Enable PAE/NX. Nếu bật tùy chọn này lên thì máy ảo mới có tính năng Chống thực thi dữ liệu DEP – Data Execution Prevention.
Khi bật tính năng này lên, shellcode trên stack của ta sẽ không chạy được (trong bài printHello lần trước mình dùng con shellcode binsh vất lên stack). Để có thể demo được, mình phải tắt tính năng này đi
Các cách tắt DEP trên Ubuntu:
Tắt khi biên dịch: gcc -z execstack -o outFile inFile.c
Tắt bằng cách này, gcc sẽ đánh dấu stack là RWE, tức là có quyền thực thi.
Để kiểm tra quyền thực thi trên stack, dùng:
readelf -l fileName
Tắt tại kernel (HĐH):
Kể cả các vùng nhớ được đánh dấu là không có quyền thực vẫn thực thi được.
Thêm noexec=off vào dòng linux trong menu-entry của grub.cfg (thông thường, grub.cfg nằm trong /boot/grub/)
Mỗi lần update-grub thì file này bị thay đổi dữ liệu hoàn toàn, nên ta phải sửa lại menu-entry sau mỗi lần update-grub
Kiểm tra nx đang bật hay tắt bằng: dmesg | grep NX
Tắt NX của máy ảo VirtualBox
Như hình “XP – settings” trên, để tiện việc demo, ta có thể tắt DEP luôn bằng tùy chọn của VirtualBox mà không phải động đến file thực thi hay HĐH.
ASLR (Address space layout randomization – Random địa chỉ)
Tính năng này được cài đặt bởi HĐH. Mỗi khi load một file chạy lên, địa chỉ các phân vùng bộ nhớ (stack, heap, thư viện chia sẻ shared library) sẽ thay đổi. Điều này khiến hacker khó tạo file exploit hơn, vì địa chỉ của các hàm, dữ liệu không cố định.
Khi nghiên cứu khai thác, ta đôi khi phải tắt ASLR đi, để khai thác được dễ dàng hơn.
Để tắt ASLR:
Tắt aslr tạm thời (khi khởi động lại thì aslr lại bật): echo 0 > /proc/sys/kernel/randomize_va_space
Bật aslr lại: echo 2 > /proc/sys/kernel/randomize_va_space
Muốn tắt vĩnh viễn, tạo file /etc/sysctl.d/01-disable-aslr.conf có nội dung
kernel.randomize_va_space = 0
Như vậy, khi thực hiện tìm hiểu cơ bản về khai thác trên Linux, hãy nhớ tắt 2 tính năng này đi trước nhé.
Tham khảo:
Chỉnh sửa lần cuối bởi người điều hành: