PIE: cơ chế giúp file load vào các vùng nhớ khác nhau, làm cho địa chỉ không cố định.
Để kiểm tra, tôi sẽ sử dụng checksec tool.
Vì đây là một challenge đơn giản, các cơ chế bảo vệ đã được disable để dễ dàng trong việc exploit.
Load vào IDA để phân tích.
Luồng chương trình:
Khởi tạo 0x20 bytes trên stack để lưu input.
Cho phép người dùng nhập lên đến 0x100 bytes.
Giải phóng 0x20 bytes trên stack và lệnh pop edx sẽ lấy giá trị để so sánh. Nếu edx bằng với chuỗi _KMA thì sẽ được vào shell.
Từ đây, tôi có thể kết luận đây là Buffer Overflow.
Để exploit ta chỉ cần nhập đủ 0x20 bytes, theo sau là chuỗi _KMA.
2. Amazingg
Kiểm tra các cơ chế bảo vệ của file.
Chú ý, ta thấy đây là một file 64 bit. Load file vào IDA để phân tích.
Tại hàm gets() cho phép nhập với độ dài tùy ý, nên tôi xác định đây là Buffer Overflow.
Nhìn vào các function của chương trình, tôi thấy thêm các hàm Func1(), Func2(), Func3(), Puts_flag().
Hàm Puts_flag() sẽ kiểm tra các biến check1, check2, check3 do các hàm Func1(), Func2(), Func3() gán. Do vậy, ta phải lợi dụng lỗ hổng Buffer Overflow để thực thi được tất cả các hàm này mới có thể lấy được flag.
Để làm được điều này, ta phải tính toán offset hợp lý để tạo payload.
Đầu tiên, trong hàm main() có lệnh sub rsp, 10h và leave nên ta sẽ nhập đủ 0x10 bytes. (Vì sao thì các bạn xem ý nghĩa của lệnh leave).
Tiếp theo, các hàm Func1(), Func2(), Func3() đều có lệnh cmp [rbp-4], 539h. Nên ta sẽ nhập 4 bytes tùy ý và 0x539 để ghi đè vào rbp.
Cuối cùng, return address tôi sẽ nhập vào các hàm cần thực thi.
1. KMA
Đối với các bài thử thách về Pwn, đầu tiên chúng ta sẽ kiểm tra các kiến trúc và cơ chế bảo vệ của nó như:
Để kiểm tra, tôi sẽ sử dụng
checksec
tool.Vì đây là một challenge đơn giản, các cơ chế bảo vệ đã được disable để dễ dàng trong việc exploit.
Load vào IDA để phân tích.
Luồng chương trình:
pop edx
sẽ lấy giá trị để so sánh. Nếuedx
bằng với chuỗi_KMA
thì sẽ được vào shell.Từ đây, tôi có thể kết luận đây là Buffer Overflow.
Để exploit ta chỉ cần nhập đủ 0x20 bytes, theo sau là chuỗi
_KMA
.2. Amazingg
Kiểm tra các cơ chế bảo vệ của file.
Chú ý, ta thấy đây là một file 64 bit. Load file vào IDA để phân tích.
Tại hàm
gets()
cho phép nhập với độ dài tùy ý, nên tôi xác định đây là Buffer Overflow.Nhìn vào các function của chương trình, tôi thấy thêm các hàm
Func1()
,Func2()
,Func3()
,Puts_flag()
.Hàm
Puts_flag()
sẽ kiểm tra các biếncheck1
,check2
,check3
do các hàmFunc1()
,Func2()
,Func3()
gán. Do vậy, ta phải lợi dụng lỗ hổng Buffer Overflow để thực thi được tất cả các hàm này mới có thể lấy được flag.Để làm được điều này, ta phải tính toán offset hợp lý để tạo payload.
main()
có lệnhsub rsp, 10h
vàleave
nên ta sẽ nhập đủ 0x10 bytes. (Vì sao thì các bạn xem ý nghĩa của lệnh leave).Func1()
,Func2()
,Func3()
đều có lệnhcmp [rbp-4], 539h
. Nên ta sẽ nhập 4 bytes tùy ý và 0x539 để ghi đè vàorbp
.return address
tôi sẽ nhập vào các hàm cần thực thi.Đây là script exploit.
3. fs
Kiểm tra các cơ chế bảo vệ của file.
Challenge này đã bật cơ chế Stack Canary, nên sẽ không có lỗ hổng Buffer Overflow nữa.
Load file vào IDA để phân tích.
Trong hàm
vuln()
, tôi thấy có lệnhprintf(s);
nên tôi xác định đây là lổ hổng Format String.Để khai thác lỗi này, ta phải tìm được offset, từ
esp
đến vùng nhớ flag được lưu trữ ở stack.Bật debug, tôi tìm được offset bắt đầu của flag sẽ là
57
. Để lấy được giá trị tại offset này, tôi dùng format$p
.Viết Script khai thác.