Bypass Stack Canary (Linux 64 bits) by Brute force

Tram Ho

Sau phần 4, hướng dẫn cách bypass NX (Non-executable Stack), hôm nay mình sẽ hướng dẫn cách bypass stack canary trên Linux 64 bits bằng phương pháp brute force.

1. Stack canary là gì?

Stack canary là cơ chế bảo mật cho stack, nó ngăn chúng ta thực hiện khai thác thỗi buffer overflow nhằm thay đổi thanh ghi và truyền shellcode. Hiểu đơn giản, mình có hình ảnh stack trước và sau khi sử dụng stack canary như sau:

Như vậy, 8 bytes được thêm vào sau phần buffer, đảm bảo răng nếu xảy ra lỗi buffer overflow, stack canary sẽ bị thay đổi, từ đó ngăn chặn việc khai thác có thể xảy ra.
Theo cơ chế này, chúng ta có cách khai thác là brute force, tìm ra stack canary sau đó gửi kèm payload để thực hiện khai thác

2. Phân tích chương trình khai thác với gdb

Sau bài viết về socket programming, mình thực hiện viết server để khai thác với mã code c như sau, mình đã update lên link github : https://github.com/vuongle-vigo/BinaryExploit/tree/master/Buffer Overflow/StackCanary_Bypass

server_vuln.c

Thực hiện compile chương trình: gcc -fstack-protector server_vuln.c -o server_vuln
Sử dụng checksec ta thầy stackcanary đã được bật.
Chạy thử chương trình cùng với netcat ta được kết quả như sau:

Chương trình yêu cầu nhập password, nếu sai sẽ trả về Invalid password.

3. Viết chương trình khai thác với python3 pwntools

Đầu tiên mình sẽ viết file python để xác định xem cần bao nhiêu kí tự để ghi đè lên stack canary:

Chạy file ta được kết quả như sau:

Vậy kết quả là 72, ta thấy ở server hiện thị stack smashing detected. Tức là ở kí tự thứ 73 đã gây ra lỗi này.
Dưới đây là file python khai thác hoàn thiện của mình, kết hợp với NX_bypass mình viết ở phần trước, ta sẽ lấy được 1 shell.

Kết quả nhận được như sau:

Vậy là mình đã lấy được 1 shell.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo