Kỹ thuật cũ

Một phần của tài liệu Kỹ thuật tấn công lỗi phần mền (Trang 49)

Ở hai ví dụ trước chúng ta thay đổi giá trị một biến nội bộ quan trọng có ảnh hưởng đến kết quả thực thi của chương trình. Chúng ta sẽ áp dụng kỹ thuật đó để tiếp tục xem xét ví dụ trong Nguồn 3.5.

Điểm khác biệt duy nhất giữa ví dụ này và các ví dụ trước là giá trị cookie được kiểm tra với 000D0A00 do đó chúng ta phỏng đoán rằng với một chút sửa đổi tới cùng dòng lệnh tận dụng lỗi sẽ đem lại kết quả như ý.

regular@exploitation:~/src$ python -c ’print "a"*16 + "\x00\x0A\x0D\x00"’ | ./st ack4 &buf: 0xbffffa44, &cookie: 0xbffffa54 regular@exploitation:~/src$

Đáng tiếc, chúng ta không thấy dòng chữ “You win!” được in ra màn hình nữa. Phải chăng có sự sai sót trong câu lệnh tận dụng lỗi? Hay cách tính toán của chúng ta đã bị lệch vì cấu trúc bộ nhớ thay đổi?

3

python -c ’print "a"*16 + "\x00\x03\x02\x00"’ | ./stack3

main()

int cookie ;

6 char buf [1 6];

7 printf ("&buf : ␣%p, ␣&cookie : ␣%p\n" , buf , &cookie );

8 gets ( buf );

9 if ( cookie == 0x000D0A00)

10 {

11 printf ("You␣win !\n" );

12 }

13 }

1 #include <stdio .h> 2

3 int 4 { 5

Kiểm tra kết quả thực hiện lệnh ta có thể loại bỏ khả năng đầu tiên vì câu lệnh được thực hiện một cách tốt đẹp nên đảm bảo cú pháp lệnh đúng.

Bởi vì Nguồn 3.5 không có sự thay đổi các biến nội bộ trong hàm main nên cấu trúc ngăn xếp của main vẫn phải như đã được minh họa trong Hình 3.2.

Loại bỏ hai trường hợp này dẫn ta đến kết luận hợp lý cuối cùng là giá trị cookie

đã không bị đổi thành 000D0A00. Nhưng tại sao giá trị của cookie bị thay đổi đúng với giá trị mong muốn ở những ví dụ trước?

Nguyên nhân cookie bị thay đổi chính là do biến buf bị tràn và lấn qua phần bộ nhớ của cookie. Vì dữ liệu được nhận từ bộ nhập chuẩn vào biến buf thông qua hàm

gets nên chúng ta sẽ tìm hiểu hàm gets kỹ hơn.

Đọc tài liệu về hàm gets bằng lệnh man gets đem lại cho chúng ta thông tin sau:

gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with ’\0’.

Tạm dịch (với những phần nhấn mạnh được tô đậm): gets() đọc một dòng từ bộ nhập chuẩn vào bộ đệm được trỏ đến bởi s cho đến khi gặp phải một ký tự dòng mới hoặc EOF, và các ký tự này được thay bằng ’\0’.

Như đã nói đến trong Tiểu mục 2.1.3, ký tự dòng mới có mã ASCII là 0A. Ghi gặp ký tự này, gets sẽ ngừng việc nhận dữ liệu và thay ký tự này bằng ký tự có mã ASCII 0 (ký tự kết thúc chuỗi). Do đó, trạng thái ngăn xếp của hàm main đối với câu lệnh tận dụng sẽ như minh họa trong Hình 3.4.

Vì việc nhập dữ liệu bị ngắt tại ký tự dòng mới nên hai ký tự có mã ASCII 0D và 00 không được đưa vào cookie. Hơn nữa, bản thân ký tự dòng mới cũng

ngừng nhập tại 0A

Dừng đọc và suy nghĩ

và đổi thành 00

Hình 3.4: Chuỗi nhập bị ngắt tại 0A

bị đổi thành ký tự kết thúc chuỗi. Do đó giá trị của cookie sẽ không thể được gán bằng với giá trị mong muốn, và chúng ta cần một cách thức tận dụng lỗi khác.

Một phần của tài liệu Kỹ thuật tấn công lỗi phần mền (Trang 49)

Tải bản đầy đủ (PDF)

(114 trang)