Tesla123
VIP Members
-
25/03/2014
-
7
-
141 bài viết
[Write Up] Whitehat Contest lần 5
PWN500Theo đánh giá của mình đây là một bài exploit cũng khá cơ bản
Việc đầu tiên trước khi pwn là mình sẽ phân tích cái code và tìm bug của nó. Sau vài phút mình thấy được đoạn code như sau:
Chương trình sẽ kiểm tra input (4096 bytes tối đa, nằm ở trong vùng nhớ heap) của mình phải là ký tự in được (printable) rồi mới cho mình nhảy vào hàm để overflow stack, nếu chứa bất kỳ kí tự nào (kể cả ký tự xuống dòng) đền đưa ra thông báo “Ban nhap co khi tu khong hop le”
Tạm gác qua chuyện check input, mình vào hàm sub_00402360 (overflow) để xem cụ thể như thế nào.
Hàm này nhận cái input mình vừa nhập và copy vào buffer(v8) với size tối đa là 0×400(1024 bytes, mục đích để mình control đc eip). Những đoạn tiếp theo, sẽ nối chuỗi “Hello “ với input, tính lại length và send lại cho client.
Bây giờ tới fuzzing rồi
Mình input với payload = ‘A’*1020 + ‘C’*4 (bằng input của buffer luôn) và mình control được eip luôn (EIP : 43434343).
Để ý thanh ghi EBX (mình sẽ nói sau, cái này rất quan trọng) , nó chứa địa chỉ của input mình nhập vào (trong heap). (1)
Vấn đề đặt ra của bài này là làm sao mình có thể chèn được shellcode với printable character và địa chỉ chứa ít nhất 3 bytes in được vd 0×0041424344
Sau một lúc google thì mình tìm được cách encode shellcode thành printable character ở link sau : http://www.offensive-security.com/metasploit-unleashed/Alphanumeric_Shellcode .
Tuy nhiên vấn đề sau khi encode xong vẫn còn một đoạn bytes ở đầu shellcode vẫn chưa được encode, và đoạn này dùng để tìm địa chỉ của shellcode.
Tuy nhiên mình có thể fix địa chỉ của shellcode bằng cách trong các thanh ghi có một địa chỉ trỏ để nó, và thật là ngẫu nhiên EBX lại trỏ đến nó
Mình sẽ chỉnh lệnh :
cat shellcode | msfencode BufferRegister=ECX -e x86/alpha_mixed cat shellcode | msfencode BufferRegister=EBX -e x86/alpha
Còn một vấn đề nữa đặt ra là, địa chỉ mà EBX chứa địa chỉ có tất cả ký tự không printable được
Sau một lúc thì mình có giải pháp sau, nếu mình tìm được một địa chỉ nào đó chứa instruction jmp ebx (‘ff e3” x86 bytes code), mà địa chỉ đó là địa chỉ có 3 bytes printable được thì vấn đề có thể được giai quyết
Và thật là may mắn mình đã tìm được nó
ở một địa chỉ khá là đẹp 0x00565F5B là các bytes in được
Chạy thử payload một lần nữa
và EIP đã nhảy đến jmp EBX , nhấn F8 để trace
Và nó đã nhảy vào địa chỉ input mình nhập
Payload sẽ là : shellcode + junk + 0x00565F5B
Và mình có kết quả
FLAG : Flag{Nice_Weekend!}
PWN400 (Do mình bận sẽ cập nhật sau)
Việc đầu tiên trước khi pwn là mình sẽ phân tích cái code và tìm bug của nó. Sau vài phút mình thấy được đoạn code như sau:
Chương trình sẽ kiểm tra input (4096 bytes tối đa, nằm ở trong vùng nhớ heap) của mình phải là ký tự in được (printable) rồi mới cho mình nhảy vào hàm để overflow stack, nếu chứa bất kỳ kí tự nào (kể cả ký tự xuống dòng) đền đưa ra thông báo “Ban nhap co khi tu khong hop le”
Tạm gác qua chuyện check input, mình vào hàm sub_00402360 (overflow) để xem cụ thể như thế nào.
Hàm này nhận cái input mình vừa nhập và copy vào buffer(v8) với size tối đa là 0×400(1024 bytes, mục đích để mình control đc eip). Những đoạn tiếp theo, sẽ nối chuỗi “Hello “ với input, tính lại length và send lại cho client.
Bây giờ tới fuzzing rồi
Mình input với payload = ‘A’*1020 + ‘C’*4 (bằng input của buffer luôn) và mình control được eip luôn (EIP : 43434343).
Để ý thanh ghi EBX (mình sẽ nói sau, cái này rất quan trọng) , nó chứa địa chỉ của input mình nhập vào (trong heap). (1)
Vấn đề đặt ra của bài này là làm sao mình có thể chèn được shellcode với printable character và địa chỉ chứa ít nhất 3 bytes in được vd 0×0041424344
Sau một lúc google thì mình tìm được cách encode shellcode thành printable character ở link sau : http://www.offensive-security.com/metasploit-unleashed/Alphanumeric_Shellcode .
Tuy nhiên vấn đề sau khi encode xong vẫn còn một đoạn bytes ở đầu shellcode vẫn chưa được encode, và đoạn này dùng để tìm địa chỉ của shellcode.
Tuy nhiên mình có thể fix địa chỉ của shellcode bằng cách trong các thanh ghi có một địa chỉ trỏ để nó, và thật là ngẫu nhiên EBX lại trỏ đến nó
Mình sẽ chỉnh lệnh :
cat shellcode | msfencode BufferRegister=ECX -e x86/alpha_mixed cat shellcode | msfencode BufferRegister=EBX -e x86/alpha
1 2 | cat shellcode | msfencode BufferRegister=ECX -e x86/alpha_mixed cat shellcode | msfencode BufferRegister=EBX -e x86/alpha_mixed |
Còn một vấn đề nữa đặt ra là, địa chỉ mà EBX chứa địa chỉ có tất cả ký tự không printable được
Sau một lúc thì mình có giải pháp sau, nếu mình tìm được một địa chỉ nào đó chứa instruction jmp ebx (‘ff e3” x86 bytes code), mà địa chỉ đó là địa chỉ có 3 bytes printable được thì vấn đề có thể được giai quyết
Và thật là may mắn mình đã tìm được nó
ở một địa chỉ khá là đẹp 0x00565F5B là các bytes in được
Chạy thử payload một lần nữa
và EIP đã nhảy đến jmp EBX , nhấn F8 để trace
Và nó đã nhảy vào địa chỉ input mình nhập
Payload sẽ là : shellcode + junk + 0x00565F5B
Và mình có kết quả
FLAG : Flag{Nice_Weekend!}
PWN400 (Do mình bận sẽ cập nhật sau)