Để hiểu hơn về lỗi Format String ở phần này chúng ta sẽ đi vào tìm hiểu một số ví dụ sau: Ví dụ 1: Ta viết một chương trình C đơn giản:
Ta biên dịch và chạy thử chương trình để xem kết quả:
Chương trình trên có chức năng là in ra những xâu mà ta gõ từ bàn phím. Chương trình xuất hiện một dòng cảnh báo là do chúng ta khai báo thiếu định dạng nên trình biên dịch đưa ra cảnh báo nhắc nhở những người lập trình. Bây giờ chúng ta thử nhập vào 1 đến 2 giá trị %s để xem có gì khác biệt
Như các bạn cũng đã thấy chúng ta chỉ cần thay đổi dữ liệu đầu vào là %s là đã lấy được các thông tin mà người lập trình muốn giấu đi.
Ví dụ 2:
Ví dụ này chương trình nghe có vẻ phức tạp hơn với một số hàm như : rand(), srand(), …
- Rand(): Hàm sinh ra một giá trị ngẫu nhiên trong chương trình này giá trị đó không vượt quá 100.
- Srand(): Hàm bổ trợ cho hàm rand() có chức năng là làm cho mỗi lần random không đưa ra giá trị trùng nhau.
- Atoi(): chuyển một chuỗi sang dạng số.
Nhìn qua đoạn code ta thấy chương trình yêu cầu người chơi nhập một code nào đó mà nếu đúng thì người chơi sẽ chiến thắng. Bây giờ ta chạy thử xem chương trình hiện ra điều gì:
Đúng như chúng ta nói ở trên chương trình yêu cầu người dùng nhập tên và một code bí mật nào đó nếu người chơi nhập đúng thì nó sẽ hiện ra một điều thú vị. Ta sẽ thử dùng format string để khai thác xem. Đầu tiên ta cũng thử như ví dụ 1:
Không xuất hiện một địa chỉ hay một chuỗi nào đặc biệt cả như vậy ta thử làm cách khác. Chúng ta vẫn chạy chương trình như bình thường nhưng đến đoạn nhập username chúng ta nhập tên kèm theo định dạng là là %x để xem có chuyện gì xảy ra:
Woa! Chương trình hiện ra một số các địa chỉ hình như là ở trong stack như vậy công việc của ta giờ là tìm trong stack vị trí chứa cái xâu AAAA mà ta nhập vào. Ta thử cho số lượng %x nhiều lên xem:
Thật may mắn trong số các địa chỉ hiện ra chúng ta thấy xuất hiện ở vị trí thứ 8 là 41414141 mà theo bảng ASCII thì 41 là dạng hex của A như vậy chuỗi chúng ta được lưu ở vị trí thứ 8. Nhìn vào đằng trước thấy xuất hiện một số lạ “00000048” có vẻ là code bí mật chăng? Chúng ta thử nhập vào xem thế nào.
You win! vậy suy đoán chúng ta đã đúng. Code bí mật được lưu ở vị trí trước chuỗi mà ta nhập vào. Các bạn cũng có thể thử với một số chuỗi khác.
Qua một hai ví dụ vừa rồi chắc các bạn cũng hiểu thêm phần nào về Format String. Tôi cũng xin dừng phần này ở đây hẹn gặp lại các bạn trong những vấn đề khác.