Writeup challenge objdump - Grandprix 2017
Thể loại: pwnable
Đề bài:
Khai thác một dịch vụ web, chạy các chức năng giống như công cụ objdump của GNU binutils:
File thực thi objdump của dịch vụ được biên dịch từ binutils 2.24, nhưng được sửa đi một chút, để có thể khai thác được. Mã nguồn binutils 2.24 phiên bản sửa, file thực thi objdump và file thông tin cấu hình biên dịch đều được cung cấp: https://drive.google.com/drive/folders/0B943jnA--r3YY0pmR0ZLUDIzWDQ
Cách làm:
Để tìm ra chỗ mã nguồn bị sửa, ta tải mã nguồn binutils 2.24 thật về, và dùng diff để so sánh:
File bị sửa là bfd/peicode.h. Điều kiện internal_f.f_opthdr > bfd_coff_aoutsz (abfd) bị comment đi.
Do đó kích thước của optional hdr có thể lớn tùy ý. Ngoài ra, tác giả biên dịch với option -fno-stack-protector => hướng khai thác là stack BoF, bằng cách cung cấp một file PE với optional header có kích thước thật lớn. Cấu trúc của optional header như sau:
Ở cuối cấu trúc này là một mảng lưu trữ các IMAGE_DATA_DIRECTORY. Mình thử tạo một file PE có số lượng IMAGE_DATA_DIRECTORY thật lớn, lớn hơn IMAGE_NUMBEROF_DIRECTORY_ENTRIES, thì lập tức có BoF!!!
Mã khai thác trong file đính kèm.
Phần còn lại là viết mã khai thác. Stack BoF => sử dụng ROP trong file objdump để leak thông tin libc, rồi ghi đè hàm fread bằng hàm system.
Đề bài:
Khai thác một dịch vụ web, chạy các chức năng giống như công cụ objdump của GNU binutils:
File thực thi objdump của dịch vụ được biên dịch từ binutils 2.24, nhưng được sửa đi một chút, để có thể khai thác được. Mã nguồn binutils 2.24 phiên bản sửa, file thực thi objdump và file thông tin cấu hình biên dịch đều được cung cấp: https://drive.google.com/drive/folders/0B943jnA--r3YY0pmR0ZLUDIzWDQ
Để tìm ra chỗ mã nguồn bị sửa, ta tải mã nguồn binutils 2.24 thật về, và dùng diff để so sánh:
Do đó kích thước của optional hdr có thể lớn tùy ý. Ngoài ra, tác giả biên dịch với option -fno-stack-protector => hướng khai thác là stack BoF, bằng cách cung cấp một file PE với optional header có kích thước thật lớn. Cấu trúc của optional header như sau:
Mã khai thác trong file đính kèm.
Phần còn lại là viết mã khai thác. Stack BoF => sử dụng ROP trong file objdump để leak thông tin libc, rồi ghi đè hàm fread bằng hàm system.
Chỉnh sửa lần cuối bởi người điều hành: