Abstract

Introduction

Initial Enumeration

Trong challenge này, ba file được cung cấp bao gồm file thực thi runic, thư viện C chuẩn libc.so.6, và dynamic linker ld.so:

image.png

File libc.so.6 là thư viện C chuẩn (GNU C Library) chứa các hàm cơ bản của ngôn ngữ C như malloc(), free(), printf(), và các system call wrappers. Việc cung cấp phiên bản cụ thể của libc giúp đảm bảo tính nhất quán trong quá trình khai thác, vì các cơ chế bảo vệ, cấu trúc dữ liệu heap, và địa chỉ các hàm có thể khác nhau giữa các phiên bản.

File ld.so là dynamic linker/loader, chương trình chịu trách nhiệm load các shared libraries vào memory và resolve các symbol khi chương trình được thực thi. Dynamic linker đảm bảo rằng các hàm từ libc và các thư viện khác được liên kết đúng cách với địa chỉ trong không gian bộ nhớ của process.

GLIBC Version

image-2.png

Kết quả từ lệnh strings libc.so.6 | grep "GLIBC_2." cho thấy thư viện được cung cấp là GLIBC phiên bản 2.34, được xác định thông qua symbol version cao nhất là GLIBC_2_34. Việc xác định chính xác phiên bản GLIBC là bước quan trọng trong quá trình phân tích và khai thác các lỗ hổng liên quan đến heap.

Phiên bản GLIBC có ảnh hưởng trực tiếp đến cơ chế quản lý heap và các biện pháp bảo vệ được triển khai. Cụ thể, GLIBC 2.34 là phiên bản quan trọng vì đã loại bỏ hoàn toàn các hook functions như __malloc_hook, __free_hook, và __realloc_hook - những target phổ biến trong các kỹ thuật khai thác heap truyền thống. Ngoài ra, mỗi phiên bản GLIBC có các cấu trúc dữ liệu heap khác nhau về offset, size, và cách tổ chức tcache bins, fastbins, unsorted bins. Các kiểm tra an ninh (security checks) như tcache key, safe-linking trong fastbins, và các validation khác cũng được bổ sung hoặc thay đổi qua các phiên bản.

Mitigations

image.png

Kết quả từ công cụ checksec cho thấy file thực thi runic được biên dịch cho kiến trúc amd64-64-little với các cơ chế bảo vệ sau:

Full RELRO đảm bảo toàn bộ Global Offset Table được đánh dấu read-only sau khi dynamic linker hoàn tất, ngăn chặn khả năng ghi đè các địa chỉ hàm trong GOT. Canary found cho biết chương trình sử dụng stack canaries - một giá trị ngẫu nhiên được đặt trên stack để phát hiện stack buffer overflow trước khi hàm return. NX enabled đánh dấu các vùng nhớ dữ liệu như stack và heap là non-executable, ngăn việc thực thi shellcode trực tiếp tại các vùng này. PIE enabled cho phép binary được load vào địa chỉ ngẫu nhiên trong memory mỗi lần thực thi, khiến các địa chỉ code và data không thể dự đoán trước.

RUNPATH được đặt là b'.' có nghĩa là dynamic linker sẽ tìm shared libraries trong thư mục hiện tại, đảm bảo chương trình load đúng phiên bản libc được cung cấp. Stripped: No cho biết binary vẫn chứa debug symbols và tên hàm gốc, giúp quá trình phân tích dễ dàng hơn.

Setup

image-3.png

Source Code