(Bài viết dựa vào post của HulkOps - ib để lấy link và ref liên quan vì gr hạn chế dán link)
1. Tại sao kỹ thuật này quan trọng?
Các giải pháp bảo mật phát hiện mã độc bằng cách theo dõi call stack, tức là kiểm tra nguồn gốc của các lời gọi API hệ thống. Nếu một API quan trọng như InternetConnectA hay VirtualAlloc được gọi từ một vùng nhớ không xác thực (ví dụ: shellcode trong heap), khả năng cao nó sẽ bị gắn cờ là mã độc và bị chặn ngay lập tức.Tuy nhiên, nếu có thể làm cho AV tin rằng API này được gọi từ một DLL hợp lệ như KERNEL32.DLL, hành vi độc hại sẽ trở nên hợp pháp trong mắt hệ thống bảo vệ. Đây chính là nguyên lý hoạt động của Return Address Spoofing.
2. Cơ chế hoạt động của Return Address Spoofing
Thông thường, khi một API được gọi, hệ điều hành sẽ lưu địa chỉ trả về trên stack – đây là địa chỉ mà chương trình sẽ tiếp tục thực thi sau khi API hoàn thành.Kỹ thuật đánh lừa Antivirus
Xác định gadget phù hợp – Một gadget là một đoạn mã hợp lệ trong một DLL tin cậy (ví dụ: KERNEL32.DLL), có thể giúp điều hướng luồng thực thi.Sửa đổi địa chỉ trả về – Thay vì quay lại shellcode, địa chỉ trả về được sửa thành gadget trong DLL tin cậy. Điều hướng luồng thực thi – Khi API hoàn tất, nó sẽ quay về địa chỉ hợp lệ trong DLL, nhưng thực chất, luồng thực thi đã được chuyển hướng về shellcode.
🔥 Kết quả? Công cụ giám sát sẽ chỉ thấy một API được gọi từ một DLL hợp lệ – không có dấu hiệu bất thường!
3. Ví dụ thực tế: Chạy shellcode mà không bị phát hiện
📌 Kịch bản: Chúng ta muốn thực thi shellcode mà không bị EDR phát hiện.🔧 Cách thực hiện:
Sử dụng VirtualAlloc để cấp phát bộ nhớ cho shellcode.
Xác định một gadget trong KERNEL32.DLL có thể chuyển hướng luồng thực thi.
Sửa đổi địa chỉ trả về để khiến EDR tin rằng API được gọi từ vùng hợp lệ.
Profit! 🎉
#include <Windows.h> #include <stdio.h> unsigned char shellcode[] = { 0x57,0x48,0x89,0xe7,0x48,0x83,0xe4,0xf }; int main() { UINT64 pAddr; HANDLE hThread; pAddr = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(pAddr, shellcode, sizeof(shellcode)); hThread = CreateThread(NULL, 0x00, pAddr, NULL, 0x00, NULL); WaitForSingleObject(hThread, INFINITE); }
🔍 Khi kiểm tra bằng debugger, địa chỉ trả về sẽ được ngụy trang, giúp shellcode thực thi mà không bị phát hiện!
4. Ứng dụng thực tế của kỹ thuật này
✔ Red Teaming & Penetration Testing:
Tránh bị phát hiện khi thực thi payload trên hệ thống mục tiêu.Giúp mã độc tồn tại lâu hơn bằng cách ngụy trang hành vi đáng ngờ.
✔ Malware Evasion:
Kỹ thuật này có thể được tận dụng để vượt qua các giải pháp Antivirus & EDR tiên tiến.✔ Bypass Exploit Mitigations:
Một số cơ chế bảo vệ như Control Flow Guard (CFG) có thể bị vô hiệu hóa thông qua kỹ thuật này.5. Hạn chế và phòng chống
🔴 Hạn chế: Một số EDR tiên tiến vẫn có thể phát hiện bất thường trong call stack.🔴 Cách phòng chống:
Giám sát sự thay đổi bất thường trong call stack để phát hiện hành vi giả mạo.
Áp dụng Control Flow Integrity (CFI) để ngăn chặn các cuộc tấn công kiểu này.
6. Kết luận
🔥 Return Address Spoofing là một kỹ thuật mạnh mẽ để né tránh Antivirus & EDR, nhưng cũng là một con dao hai lưỡi. Trong tay Red Team, nó giúp kiểm thử bảo mật hiệu quả. Trong tay kẻ tấn công, nó là một vũ khí nguy hiểm.💡 Tìm hiểu thêm hoặc thử nghiệm mã nguồn tại: GitHub - ib để lấy link chi tiết do group hạn chế dán link