2011-10-12 28 views
10

Về cơ bản các chức năng tôi đang khai thác là thế này:Cần khai thác tràn bộ đệm. Không thể tìm hiểu làm thế nào để uncorrupt ngăn xếp sau khi thực hiện mã khai thác?

int getbufn() 
{ 
    char buf[512]; 
    Gets(buf); 
    return 1; 
} 

Khi tôi chạy chương trình chính chức năng thực hiện 5 lần và mỗi lần vị trí của những thay đổi buf và do đó, vị trí của% ebp. Những gì tôi phải làm là đặt một giá trị hex cụ thể, cho phép nói 0xFFFFFFFF, vào một biến và chương trình chính kiểm tra mỗi lần để xem nếu biến đó là có. Nếu nó được thực hiện một lần nữa cho đến khi tất cả 5 lần được thực hiện và chương trình thoát ra lặng lẽ.

Sự cố tôi gặp phải là trước khi kiểm tra giá trị hex có một kiểm tra cho một giá trị khác không đổi, cho phép nói 0x12345678. Nếu tôi đã bị hỏng 0x12345678 và nó không có, chương trình phát nổ trên tôi.

Tôi đã tìm ra rằng 0x12345678 được lưu trữ trong -0x10 (% ebp) vì vậy tôi biết nó dựa trên% ebp và tôi biết địa chỉ% ebp mỗi lần nhưng tôi chỉ có thể khai thác để làm việc lần đầu tiên . Tôi làm điều này bằng về cơ bản nopsled-ing 496 byte và có mã máy này ở định dạng byte:

mov 0xFFFFFFFF, %eax 
movl address old ebp, %ebp 
push correct return adress in function main 
ret 

mà kết thúc lên được 5 lời nói và một byte trong thời gian dài trở lại mà tôi đầy 0x313131 để làm cho nó dài 6 chữ . Tại thời điểm này, chuỗi khai thác của tôi dài 520 byte, chính xác là bao nhiêu bộ đệm dưới% ebp và vì vậy tôi thêm vào địa chỉ của ebp cũ và địa chỉ ở đâu đó bên trong nopsled của tôi ghi đè giá trị hiện tại ở% ebp cũng như trả về địa chỉ cho getbufn.

Vấn đề là khi chương trình thực thi lần thứ 2% ebp ở địa chỉ 0x10 thấp hơn địa chỉ trước đó, do đó cách của tôi không hoạt động% ebp không hoạt động và phát hiện chính 0x12345678 không phải là -0x10 (% ebp). Làm thế nào để tôi không bị hỏng% ebp?

+1

Bạn không thể tính% ebp là khoản chênh lệch từ% esp? I E. khôi phục% ebp không bằng 'movl' của địa chỉ ngay lập tức, nhưng bằng cách sao chép% esp vào% ebp và thêm một phần bù vào nó? – pmdj

+0

Bạn đang sử dụng cờ trình biên dịch nào, trình biên dịch nào. Bạn có thể cung cấp toàn bộ chương trình và mã khai thác không? – Stellarator

+3

Một trường học cho đệm khai thác bài tập về nhà ... Tôn trọng! –

Trả lời

5

pmjordan là đúng, bạn sẽ có thể tính toán% ebp có liên quan đến% esp. Hãy nhớ rằng,% esp là con trỏ ngăn xếp hiện tại của bạn và% ebp là nơi con trỏ ngăn xếp của bạn là cho hàm trước đó. Thay vì có một% ebp tĩnh, bạn cần phải có một số động được tính từ% esp (hoặc thực sự chỉ nhìn vào những gì được lưu trữ ở bộ nhớ nằm trong% esp bù đắp bởi các biến stack). Mã giả sẽ là một cái gì đó như:

  1. tính toán bù đắp của% ebp từ% esp
  2. đọc giá trị được lưu trữ ở vị trí bộ nhớ và lưu trữ cho chính mình
  3. làm bạn khai thác
  4. khôi phục cũ giá trị của% ebp được lưu trữ trong bước 2
  5. ret
Các vấn đề liên quan