Ret và Ret2Win
Sơ lược về lệnh RET và lỗi Ret2Win
1. Analysis
Để mọi người hiểu rõ hơn. Mình xin lấy bài easybin ở GrapCON CTF 2021.
Main function không hề đề cập đến hàm vuln ở chương trình của nó. Chúng ta cần phải can thiệp vào chương trình để hàm trả về của nó sẽ là hàm vuln.
Khai thác tiếp theo thì mình thấy được ở chương trình này còn 1 lỗi nữa ở đây:
Đó chính là Stack OverFlow. Hàm gets thể kiểm soát được được số lượng input được nhập vào. Chính vì vậy ta có thể ghi đè lên stack địa chỉ của hàm vuln.
Chế độ bảo vệ stack CANARY ,NX, PIE, FORTIFY đều đã bị disable. Trong đó FORTIFY dùng cho lỗi GOT overwrite mình sẽ cố tìm hiểu nó ở những bài viết sau.
Vì vậy kịch bản khai thác chương trình của chúng ta sẽ là:
1. Tìm được địa chỉ của hàm vuln
2. Tính địa chỉ từ lúc nó được nhập đến câu lệnh ret
3. Overwrite địa chỉ đó lên stack
4. RET nó và lấy shell.
2. Exploit.
A. Check vuln address
B. Calc byte to overwrite [ret - get]
Đầu tiên set breakpoint tại hàm gets và ret bằng b* <address> sau đó continue c để tìm argument của nó:
Và địa chỉ trên đỉnh stack để hàm ret gọi nó là RSP = 0x7fffffffdf88
+----------------------------------------------------------------------------+
| 0x7fffffffdf50 | ... | ... | 0x7fffffffdf88 |
+----------------------------------------------------------------------------+
^ ^
argument stack
Hiểu đơn giản thì bạn có thể nhìn sơ đồ trên --> số byte cần overwrite :
stack - argument = 56 bytes
C. Overwrite byte onto stack
Check thử bằng gdb-peda
Khi mà bạn muốn overwrite nó lên stack thì bạn cần 1 payload đủ 56 byte + 8 byte trên đỉnh stack tức là đỉnh đó sẽ chứa 8 byte đằng sau kia.
Thì ret instruction sẽ lấy 8 byte đó để chạy chương trình
3. Payload here
Thì đây là những gì mà bạn nhận được 🙂
Comments
Post a Comment