pwnable.tw
pwnable.tw > Starbound
pwnable.tw > criticalheap
Vuln: User được setenv() tuỳ ý.
tl;dr: Sử dụng strace; Đọc man page; localtime() có sử dụng đến env var "TZ".
pwnable.tw > Food Store
Vuln: Con trỏ next trỏ đến Recipe tiếp theo ko đc init khi tạo Recipe mới, có thể bị lợi dụng để trỏ về chunk đã free, dẫn đến UAF, tạo chunk overlap.
tl;dr: Không chỉ setup heap cho mục tiêu ngay trước mắt, mà cần tính toán cho các bước về sau; Heap spray, rồi lợi dụng alignment khi cấp phát để kiểm soát uninit data.
pwnable.tw > Break Out
Vuln: Không xoá reference sau khi free, gây UAF và chunk overlap; Không kiểm tra con trỏ next trỏ đến object hợp lệ trong linked list.
pwnable.tw > Ghost Party
Vuln: Vi phạm Rule Of Three trong C++ do thiếu copy constructor, gây double free sau khi pass by value; Gán raw pointer vào thành viên class, pointer được free ngay khi out of scope, gây UAF.
pwnable.tw > Bounty Program β
Vuln: Không kiểm tra NULL trước khi sử dụng strtok().
tl;dr: Bounty Program α
pwnable.tw > Bounty Program α
Vuln: Không kiểm tra NULL trước khi sử dụng strtok().
tl;dr: Hành vi nguy hiểm của strtok(NULL, delim); Hàm calloc() bỏ qua tcache; Env var có thể tác động đến hành vi của ptmalloc.
pwnable.tw > WannaHeap
tl;dr: Bớt map to another variable trong IDA lại :); Tìm gadgets hiệu quả hơn; Setcontext gadget để setup toàn bộ register.
pwnable.tw > unexploitable
pwnable.tw > Printable
tl;dr: Tận dụng địa chỉ ld còn sót trên stack; Ghi đè l_addr, để nhảy đến fini_array entry giả; printf() tự ghi đè return address của nó; printf() luôn thông qua bss của binary để tìm đến stdout; Dùng stderr thay cho stdout.
pwnable.tw > De-ASLR
tl;dr: Tận dụng địa chỉ libc, ld còn sót lại trên stack, phía dưới stack frame thì do tổ tiên caller, phía trên thì do callee; Bruteforce ASLR với xác suất; Exploit trên remote có thể cần nhiều lần chạy kể cả khi local chỉ cần 1 lần;
pwnable.tw > Re-alloc Revenge
Vuln: Chương trình không kiểm tra cẩn thận sau khi sử dụng realloc, cho phép kẻ tấn công thực hiện use-after-free.
tl;dr: Partially overwrite địa chỉ libc, cần bruteforce với xác suất thành công 1/16; Có thể gộp các chunk liền kề nhau trong fastbin và đặt vào unsortedbin bằng cách trigger malloc_consolidate().
pwnable.tw > MnO2
Vuln: Alphanumeric shellcode.
tl;dr: Tạo alphanumeric shellcode, sử dụng ModR/M byte.
pwnable.tw > CAOV
Vuln: Chương trình C++ vi phạm cơ chế return by value của SYSV ABI, dẫn đến lời gọi destructor trên dữ liệu trên stack trước đó được attacker kiểm soát.
tl;dr: Cơ chế của sysv abi ở C++, trên C ko có cái này.
pwnable.tw > Heap Paradise
tl;dr: Chunk overlap, vừa trong unsortedbin, vừa trong fastbin; Partially overwrite ko cần leak libc; Ghi đè flags của stdout thành 0xfbad1800 và _IO_write_base để leak libc.
pwnable.tw > Kidding
tl;dr: Tương tác out-of-band; Mở socket để tạo reverse shell.
pwnable.tw > BookWriter
Vuln: Off-by-one error cho phép attacker ghi out-of-bound vào kích thước của page, dẫn đến buffer overflow tuỳ ý trên heap khi chỉnh sửa page content.
pwnable.tw > Secret Of My Heart
Vuln: Chương trình đặt null byte sau input của user không cẩn thận, gây 1 null byte overflow, ghi đè vào size của chunk liền sau, attacker có thể gây chunks overlap từ đó.
tl;dr: Lại là 1 null byte overflow; Heap chunk consolidation, overlapping.
pwnable.tw > Secret Garden
tl;dr: Bớt giả định, nhìn xem dòng code đang thực sự làm gì; Ghi one gadget vào realloc hook, ghi realloc vào malloc hook; hoặc ghi one gadget vào malloc hook và double free để trigger malloc printerr.
pwnable.tw > BabyStack
Vuln: Chương trình kiểm tra mật khẩu không cẩn thận với hàm strncmp(), dẫn đến bị bruteforce bởi attacker. Chương trình copy dữ liệu với hàm strcpy() nhưng không kiểm tra kích thước buffer, dẫn đến stack buffer overflow.
tl;dr: Từ hàm này có thể gây overflow trên stack frame của hàm khác.
pwnable.tw > Spirited Away
Vuln: Chương trình sử dụng sprintf() cho ra chuỗi kết quả vượt quá kích thước buffer, gây buffer overflow ghi đè vào len, tiếp tục gây buffer overflow ở các buffer khác.
tl;dr: Buffer overflow rất tinh vi, check size buffer thật kỹ.
pwnable.tw > seethefile
Vuln: Hàm scanf() với format %s gây buffer overflow trên vùng bss dẫn đến ghi đè file pointer.
tl;dr: fclose() gọi đến _IO_SYSCLOSE() ở offset 0x44 của vtable nếu flags có 0x2000, finish() luôn đc gọi ko phụ thuộc flags; Kiểm soát RIP đến printf() để có fmb.
pwnable.tw > Tcache Tear
Vuln: Chương trình ép kiểu không cẩn thận từ int về unsigned, dẫn đến buffer overflow trên heap do có chênh lệch giữa kích thước cấp phát và kích thước thực tế được input.
pwnable.tw > Re-alloc
Vuln: Chương trình không kiểm tra cẩn thận sau khi sử dụng realloc, cho phép kẻ tấn công thực hiện use-after-free.
tl;dr: Hành vi của realloc() phụ thuộc nhiều vào tham số đc đưa vào.
pwnable.tw > applestore
Vuln: Chương trình giữ reference toàn cục đến biến cục bộ của hàm. Khi hàm khác được gọi, vị trí biến cục bộ bị overlapped, dẫn đến chương trình sử dụng input do attacker kiểm soát.
tl;dr: Cần check xem biến cục bộ nào trong stack bị lưu lại tham chiếu; Không giả định rằng chương trình sử dụng bao nhiêu data đc input vào thì mình chỉ nhập bấy nhiêu đó.
pwnable.tw > Silver Bullet
Vuln: Việc sử dụng strncat() không cẩn thận dẫn đến 1 null byte overflow ở cuối, ghi đè bộ đếm gây ra stack buffer overflow.
tl;dr: 1 null byte overflow cần để ý kỹ (sau khi user input); Stack pivot để đặt rbp vào nơi hợp lý và control RIP đến nơi tính toán địa chỉ dựa trên rbp.
pwnable.tw > hacknote
tl;dr: Đôi khi ko cần heap fengshui quá phức tạp; Cần để ý tham số cần truyền vào là gì, ko mặc định plt giống với hàm wrapper custom của chương trình.
pwnable.tw > dubblesort
Vuln: Chương trình không kiểm tra số lượng số được nhập vào, dẫn đến buffer overflow trên stack, kết hợp với việc stack canary bị bypass do hành vi của hàm scanf().
tl;dr: scanf() gặp input ko khớp với format thì sẽ bỏ qua buffer cần ghi; offset ở local và remote có thể khác nhau dù đã patch binary.
pwnable.tw > 3x17
tl;dr: Ghi đè fini_array; Break toàn bộ địa chỉ trong GOT entries.
pwnable.tw > calc
Vuln: Chương trình tin rằng bộ đếm luôn nằm trong khoảng hợp lệ, tuy nhiên thực tế bộ đếm được cộng trừ bất kiểm soát, dẫn đến ghi out-of-bound.