Bài viết này là một ví dụ cơ bản cho những người new tiếp cận pwnable, hỗ trợ cho rất nhiều bạn rất có thể dễ dãi đọc hơn Khi đi theo mảng này.

Bạn đang xem: Pwnable là gì

Target : Tokyo Western CTF 2019 Chall : nothing more khổng lồ say

File here

Description: Japan is fucking hot.

nc nothing.chal.ctf.westerns.tokyo 10001


*

ta dùng lệnh $ file nhằm kiểm tra

File này cho ta biết nó là file executable chạy 64bit, cùng với link hễ (libc) cùng không stripped (nghĩa là tên gọi hàm tên trở thành không biến thành giản lược)

ta sẽ run tệp tin để xem tệp tin làm gì
*

*

Tại đây nó in ra description cùng hint rồi đến chúng ta nhập, đưa sử ở chỗ này bản thân nhập là “input” thì nó trả về công dụng là “input” rồi out chương trình. Giờ mình vẫn debug xem test nó làm cái gi.Mình đang thực hiện IDA để xem
*

*

Tại phần description họ bảo không có SSPhường, không NX, ko PIESSP.. là hiệ tượng chống staông chồng overflow, NX (Non-eXecutable) vẫn không tồn tại quyền exedễ thương trong stack, PIE đang random cửa hàng vùng code nhằm ta cực nhọc exploit hơn.Rất may là nó tắt không còn cảbài này mang đến ta nhtràn vào từ bỏ bàn phím với hàm gets(&format). Theo như tìm hiểu về hàm ta thấy hàm này còn có lỗ hổng hoàn toàn có thể dẫn cho tràn cỗ đệm
Cụ thể là hàm ko check maximum size buộc phải ta hoàn toàn có thể thoải mái cùng với số kí tự nhập vàoMục tiêu là ta đã get shell đúng ý cùng với description nhưng BTC giới thiệu. thường thì đa phần các chall phần đa cần phải get shell để mang được flag.Trước hết ta đề xuất demo bên trên local trước, ta đã đề nghị dùng đến gdb.

Xem thêm: Ken Miles Là Ai - 9 Fakta Di Balik Film Ford V Ferrari


Chương trình vẫn giới hạn tại hàm gets. Hiện nay ta hoàn toàn có thể kiểm tra được các tđắm say số của hàm trước lúc call hàm.Ở đây ta thấy lịch trình chạy 64bit yêu cầu những tmê say số vẫn nằm tại trên những tkhô hanh ghi theo thứ tự: RDI, RSI, RDX, RCX, R8, R9, stackTa biết hàm gets(&format) dấn 1 tđê mê số do đó tmê man số vẫn vị trí thanh khô ghi RDI tại địa chỉ 0x7ffffffffe320
Ta hoàn toàn có thể dùng lệnh “telescope ” để kiểm tra layout của stack cùng bởi buffer ta nhập vị trí stachồng bắt buộc ta vẫn tận dụng điều này nhằm khai thác lỗ hổng bên trên stackTa thấy tác động trả về của hàm main vẫn ở sau shop của tkhô nóng ghi RBP.. Suy ra trên địa điểm RBP+8 = return addressSau Lúc hàm main xúc tiến chấm dứt đang quay về hàm sẽ Hotline nó (__libc_start_main) thế cho nên ví như ta ghi đè lên trên cửa hàng trả về thì ta có thể redirect luồng thực hiện thanh lịch phía khác mà lại ta mong cơ mà ví dụ nghỉ ngơi đấy là get shellVì NX disable do đó ta rất có thể thực hiện shellcode ngay lập tức vào stack. Shellcode là 1 trong những đoạn code asm dùng để làm get shell hoặc có tác dụng phần nhiều việc không giống tùy mình thích.
Okay hướng giải quyết đang nhỏng sau: ta đã nhập input đầu vào làm sao cho kí từ bỏ ta nhập lệ tràn qua khỏi bộ đệm và tràn đến return address, nạm ảnh hưởng ret thành tác động shellcode vào staông chồng. Để làm được vấn đề này ta rất cần phải tìm gadget nhằm ghi hệ trọng shellcode vào retVì shellcode nằm tron stachồng nhưng staông chồng thì luôn luôn random (ASLR) đề xuất ta rất cần phải cần sử dụng gadget.
Theo nlỗi ta thấy thì không tồn tại gadget làm sao để lấy ảnh hưởng shellcode vào staông xã cả cần ta đã search cách không giống. Nếu ta xem xét một chút ít ta sẽ thấy một vùng ghi nhớ được load thuộc binary với thắt chặt và cố định, với có cả exexinh đẹp sẽ là vùng .bss
Vậy ta đang giải theo hướng không giống sẽ là ghi đè cổ ret thành gets để nhập thêm nữa, ta vẫn nhập shellcode vào vùng đó rồi ret về vị trí ta nhập shellcode thì đang tiến hành được shellcode.
Ta thấy tại phần “lea rax, ; mov rdi, rax” tức là gửi địa chỉ staông xã phương pháp rbp khoảng chừng là 0x100 vào rax và chuyển vào rdi. Suy ra offset giữa rbp và buffer là 0x100 tốt nói theo cách khác rbp-0x100 = buff -> buff + 0x100 = rbpmà ret ở dưới rbp cùng với rbp + 0x8 = ret buộc phải buff + 0x108 = retSuy ra offphối là 0x108Để đưa địa chỉ vùng .bss địa điểm mà lại ta nhập shellcode vào tkhô cứng ghi rdi thì ta phải gadget “pop rdi; ret”
Lấp đầy buffer tràn cho ret rồi tiếp nối gửi shellcode address lên rdi có tác dụng tsay mê số với ret về gets lần tiếp nữa để nhập shellcode vào (shellcode có thể đem nghỉ ngơi trên web shell-storm.org)sau đó ret về shellcode nhằm thực hiện.Ta hoàn toàn có thể attach file nhằm kiểm tra nlỗi sau:

trước hết mlàm việc thêm 1 tab nhằm run tệp tin .py, ta sửa lại một chút nlỗi sau:


Thêm 2 loại context.log_level=’debug’ sẽ giúp ta debug rất đẹp hơn

cùng pause() vẫn làm công tác tạm dừng ngóng ta attach vào

Sau đó đặt breakpoint vào gdb, ví dụ đặt breakpoint tại ret, Tiếp theo run file .py lên


attach ngừng ta gõ lệnh “continue” nhằm công tác thường xuyên, tiếp nối quý phái file .py ta nhận phím bất kể nhằm công tác chạy tiếp

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *