2011-01-31 30 views
7

Tôi đang tham gia một khóa học bảo mật cần chúng ta thực hiện tấn công chuỗi định dạng trên một máy ảo unix. Lỗ hổng là một chuỗi định dạng sử dụng đối số dòng lệnh.Cách viết giá trị vào một địa chỉ trong tấn công chuỗi định dạng

Câu hỏi của tôi là làm thế nào tôi có thể viết giá trị vào một địa chỉ trong chuỗi định dạng (như viết địa chỉ mã shell vào địa chỉ trả về hàm)?

Ví dụ: tôi cố gắng viết giá trị 987654 vào vị trí địa chỉ trả về 0xaabbccdd. Tôi đã thử một số chuỗi như "AAAA_%10$x" và điều này có thể dẫn chương trình in AAAA_41414141.

Sau đó, tôi thay thế các chữ cái bằng địa chỉ của mình và cố gắng ghi đè lên nó.

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n" 

Nhưng nó không hoạt động. Tôi thấy một bài viết nói rằng tôi nên sử dụng một số nhỏ hơn trong %54321x vì có một số ký tự tôi đã viết, nhưng tôi không biết có bao nhiêu ký tự tôi đã viết trước %54321x, một trong hai.

lưu ý: Môi trường có phiên bản cũ của gcc, vì vậy không cần phải lo lắng về giá trị quá lớn. Bất kỳ đề xuất nào? Cảm ơn.

Trả lời

3

printf không thể viết ở bất kỳ nơi nào mà không sử dụng thông số định dạng %n. Đây là cái bạn đang thiếu. Một cái gì đó như %.987654d%n sẽ viết số 987654 (số lượng ký tự đầu ra cho đến nay) đến một địa chỉ được chỉ định bởi đối số thứ hai, trong đó đối số đầu tiên là int. Điều này là đủ để bạn bắt đầu.

+0

'sprintf' ghi vào bộ đệm char trên ngăn xếp cũng có thể được sử dụng để gây sát thương độc hại ... –

+0

@Oli: có nhưng đó không phải là một cuộc tấn công chuỗi định dạng, nhiệm vụ của OP có vẻ là ... –

+0

A chuỗi định dạng do người dùng cung cấp có thể được sử dụng để làm hỏng. –

0

Định dạng lỗ hổng chuỗi được khai thác bằng cách thay đổi định dạng in chuỗi của chức năng printf và làm cho nó ghi một số giá trị vào vị trí địa chỉ mong muốn trong bộ nhớ. Vui lòng đọc this blog bài cho việc học làm thế nào để làm điều này

0

bạn nên xác định Mà bù đắp của ngăn xếp để viết với các định dạng% n như %[offset]\$n

dụ: %23\$n

hãy chắc chắn để có được một cách chính xác đúng địa chỉ bằng cách cheking kết quả của \ xdd \ xcc \xbb\xaa_%54321x_%[offset]\$x "điều này có thể được thực hiện với python hoặc bash script

bạn nên truy xuất địa chỉ aabbccdd

Các vấn đề liên quan