Lỗi tràn bộ đệm, hẳn là mọi người khi lập trình thì ai cũng gặp phải lỗi này. Tràn bộ đệm xảy ra khi lưu trữ dữ liệu vượt ra ngoài biên của bộ nhớ đệm có chiều dài cố định. Kết quả là dữ liệu có thể bị đè lên các bộ nhớ liền kề. Dữ liệu bị ghi đè có thể bao gồm các bộ nhớ đệm khác, các biến và dữ liệu điều khiển luồng cả chương trình. Hiện này hầu hết chúng ta đều code các ngôn ngữ bậc cao nên khi xảy ra lỗi tràn bộ đệm thì sẽ dẫn đến chương trình bị crash nên sẽ dễ dàng để fix lỗi. Còn nếu không thì sao?.... Nếu không thì chúc mừng bạn, chương trình của bạn rất có thể sẽ bị hacker tấn công qua lỗi tiềm ẩn này. Và lỗi này thì thường xảy ra ở các ngôn ngữ bậc thấp, chúng ta phải tự quản lý vùng nhớ khi sử dụng các biến ví dụ assemble, C, C++. Ví dụ tràn bộ đệmVừa trên làm một ít khái niệm cơ bản mà ai cũng biết, giờ cùng xem nó tràn như thế nào qua ví dụ với một chương trình bằng ngôn ngữ
Một chương trình C đơn giản với mục đích nhập giá trị cho mảng Cùng chạy xem hiện ra gì nhé. Chương trình in ra địa chỉ của 2 biến
2. Vậy có nghĩa là biến 2 biến cách nay
3. Mặc dù mảng buf chỉ có
4kí tự nhưng hãy cùng nhập 28 kí tự vào xem sao nhé :D Chương trình vẫn chạy đúng, biếnkey không bị thay đổi.
Cùng nhập kí tự thứ
6 xem có gì xảy ra??? Bùm.... Biến
7 đã thay đổi giá trị. Như vậy là dữ liệu đã bị tràn sang vùng nhớ của biến
7. Vậy làm sao để thay đổi đúng giá trại của biến
9 ??? . Kí tự thứ 29 chúng ta vừa điền là `C`0 kết quả `C`1. Và đó cũng là giá trị của kí tự `C`2 tương ứng với `C`3 trong `C`4. Mọi chuyện đơn giản rồi, chúng ta chỉ cần biến đổi số `C`5 về kiểu char là xong. Đầu tiên `C`6 trong kiểu nhị phân. Vì mỗi `C`7 sẽ là `C`8 nên ta tách 8 bit một rồi kiểm tra với bảng mã acsii. `C`9 và `buf`0với kiểu `buf`1. Check trong bảng mã Ascii tương ứng với ... kí tự đặc biệt nên mình không viết được, các bạn check bảng nhé :D.. Kí tự đặc biệt thì mình phải làm thế nào @@. (Lấy ngay phải ví dụ đen thế không biết @@). Không viết không copy được thì chúng ta lại đành phải dùng một chương trình nhỏ để in ra đoạn mã chứa kí tự đặc biệt này.
Ở trên mình có điền sẵn
2 số `C`0 và thêm 2 kí tự char có giá trị Dec là`buf`4 và `buf`5. Cùng ghi giá trị ra file nhé. Chương trình trên mình lưu tên là Bùm bùm .... vậy là biến
7 đã thay đổi giá trị theo ý muốn. Kết luậnNhư vậy chúng ta có thể thấy lỗi tràn bộ đệm khá là nguy hiểm, nó khiến thay đổi luồng chương trình, chương trình bị đổ vỡ... và rất có thể bị kẻ gian khai thác. |