Writeup - Contest 13 - Phu Quoc island
Trong cuộc thi Contest13 vừa rồi, mình thấy có một bài pwn khá hay, khi giới thiệu phương pháp ROP trên VDSO, đó là bài “Phu Quoc island” start_nx_64_add_stack. Mã assembly của chương trình thì rất đơn giản. Chương trình in ra dòng chữ “Welcome to my CTF. Input your weapon: ” và cho phép nhập vào ký tự, ghi đè lên địa chỉ trả về.
Lỗi rõ ràng như vậy, nhưng việc khai thác lại không dễ. Chương trình bật NX (trên stack, trên module chính), nên ta phải dùng tới ROP mới bật được shell. Tuy nhiên, chương trình không nạp vào libc, mà chỉ có VDSO. Do đó, ta chỉ có cách sử dụng ROP trong module chính và trong VDSO thôi.
Trên server bật ASLR, nên ta còn phải tính tới việc leak ra địa chỉ của vdso trước khi đưa ROP vào nữa. Theo như http://man7.org/linux/man-pages/man7/vdso.7.html, ta có thể lấy được địa chỉ của nó trên stack. Trong mã khai thác, sử dụng hàm getVDSO -> địa chỉ vdso. Và ta có image của vdso do ta ssh được lên server. Vậy phần khó còn lại là viết ROP thôi. Sau đây là mã khai thác:
Lỗi rõ ràng như vậy, nhưng việc khai thác lại không dễ. Chương trình bật NX (trên stack, trên module chính), nên ta phải dùng tới ROP mới bật được shell. Tuy nhiên, chương trình không nạp vào libc, mà chỉ có VDSO. Do đó, ta chỉ có cách sử dụng ROP trong module chính và trong VDSO thôi.
Trên server bật ASLR, nên ta còn phải tính tới việc leak ra địa chỉ của vdso trước khi đưa ROP vào nữa. Theo như http://man7.org/linux/man-pages/man7/vdso.7.html, ta có thể lấy được địa chỉ của nó trên stack. Trong mã khai thác, sử dụng hàm getVDSO -> địa chỉ vdso. Và ta có image của vdso do ta ssh được lên server. Vậy phần khó còn lại là viết ROP thôi. Sau đây là mã khai thác:
Chỉnh sửa lần cuối bởi người điều hành: