Khai thác Linux cơ bản – Tràn bộ đệm – Phần 4 – Bỏ qua NX (Ngăn xếp không thể thực thi) với Lập trình hướng trở lại (ROP)

Tram Ho

Sau các phần 3 phần cơ bản, phần này mình sẽ hướng dẫn các bạn cách để bypass cơ chế NX của linux. Vậy NX là gì? NX (Non-executable Stack) là cơ chế ngăn không cho thực thi mã trên stack, điều này ngăn chặn việc chúng ta tiêm shellcode vào stack, sau đó cố gắng thực thi. Hướng giải quyết đó là sử dụng re2libc.

1. Re2libc là gì?

Re2libc (Return to libc), trong đó libc là thư viện của chương trình C. Tức là ta sẽ sử dụng các hàm có trong thư viện C của chương trình đó để tạo ra 1 shell, ví dụ như gọi hàm system(“/bin/sh”). Để làm được điều này, ta cần biết được địa chỉ của hàm system trong libc, sau đó thực hiện gọi hàm, với việc truyền tham số /bin/sh vào.

Bởi vì đang thực hiện trên linux 32 bits, tham số đầu vào sẽ được đẩy vào lần lượt các thanh ghi ebx, ecx, edx,… Chúng ta tiến hành tạo file C như dưới đây:

bypass_nx.c

Complie chương trình (không sử dụng -z execstack để tắt cơ chế NX):
gcc -m32 bypass_nx.c -o bypass_nx

Để kiểm tra xem NX đã được tắt chưa, thực hiện: checksec bypass_nx và kết quả nhận được:

NX đã được bật, bây giờ không thể thực thi shellcode trong stack được nữa.

2. Bypass NX bằng ROP

Như đã nói, ta thực hiện re2libc, vậy đầu tiên cần biết libc mà chương trình sử dụng. Để làm việc này, ta sử dụng gdb và vmmap để xác định libc.

Run chương trình, break main, sau đó thực hiện vmmap

Như vậy libc chương trình sử dụng là /usr/lib32/libc.so.6 với địa chỉ là 0xf7c00000

Tiếp theo, viết file exploit sử dụng pwntools:

nx_exploit.py

Chạy file và ta có 1 shell, ngoài ra ta có thể dựa vào các gọi hàm trên linux, 32bits viết exploit như sau:

Vậy là ta đã tiến hành bypass NX. Phần tiếp theo mình sẽ hướng dẫn các bạn viết shellcode mà chúng ta đã sử dụng trong P1-3. Cảm ơn các bạn đã đọc.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo