2011-11-20 33 views
5

Tôi đang cố gắng thực hiện một cuộc tấn công tràn bộ đệm cho một mã dễ bị tổn thương nhất định. Nhưng có vẻ như nó sai vì, Mặc dù các chuỗi khai thác của tôi không làm hỏng ngăn xếp, tôi không thể lấy mã assembly của mình (được nhúng trong chuỗi khai thác).Không có chức năng nào chứa bộ đếm chương trình cho khung được chọn

Đây là phần giá trị bộ nhớ trước khi thực hiện lệnh 'ret' của chương trình tôi muốn tấn công.

0x55683984:  0x5568398c 0x...(old r.a)  0x68e322a1  0x0000c31c 
0x55683994:  0xf7fa9400  0x0804a3d7  0x556839c0  0xf7e518d0 

Tại thời điểm này, Mọi thứ trở nên tồi tệ vì không thể bật ngăn xếp và tạo% eip cho giá trị xuất hiện? Vì vậy, mã khai thác khai thác của tôi không hoạt động (0x68e322a1 0x0000c31c) Gdb nói Không có hàm nào chứa bộ đếm chương trình cho khung đã chọn. và khi tôi cố gắng thực thi nó mà không cần gỡ lỗi, Nó gây ra lỗi phân đoạn.

Vấn đề này có liên quan gì đến thời gian lắp ráp của tôi không? (trong trường hợp này là 6)?

Program received signal SIGSEGV, Segmentation fault. 
0x5568398c in ??() 
(gdb) x 0x5568398c 
0x5568398c: 0x68e322a1 

làm thế nào điều này có thể xảy ra khi tôi có thể nhìn thấy những gì bên trong địa chỉ gây ra segfault?

+0

Bạn có thể sử dụng 'disassemble' hoặc' x/10i $ eip' để xem mã nơi nó segfaulted và 'bt' để xem ngăn xếp cuộc gọi. Sẽ dễ dàng hơn nếu bạn hiển thị mã mà bạn đang cố gắng thực hiện (Nếu đó là 68 e3 .. có vẻ như nó có một byte không bị gián đoạn). BTW, nếu đây là bài tập về nhà, bạn nên đánh dấu nó như vậy. – user786653

+0

Tôi đã sử dụng bố cục asm để xem điều gì đang diễn ra và điều đó không hữu ích. Hơn nữa, bây giờ mã khai thác của tôi đã kết thúc bằng một c3 (có nghĩa là chỉ dẫn ret), một byte không đi lạc là không có vấn đề gì. điểm quan trọng ở đây là tôi vô tình cố gắng để đạt được một địa chỉ bộ nhớ mà có lẽ là không xác định. – bfaskiplar

Trả lời

3

Ok, đây là câu chuyện tôi quên đặt '$' trước địa chỉ trong lệnh movl trong mã assembly của tôi. Vì vậy, chương trình đã cố gắng truy cập vào một địa chỉ bộ nhớ không xác định gây ra lỗi phân đoạn.

Nhưng, tôi không thích cách GDB thông báo tình trạng này bằng cách nói rằng chỉ cần 'Không có chức năng chứa truy cập chương trình cho khung chọn'

+0

Cảm ơn người đàn ông, bạn đã lưu thịt xông khói của tôi – JustGage

5

Theo mặc định disassemble in ra mã chức năng hiện hành. Trong trường hợp của bạn, điểm truy cập chương trình ở đâu đó để ngăn xếp và gdb sẽ không hiểu ranh giới của hàm hiện tại ở đâu. Đó là lý do tại sao thông báo lỗi.

Nhưng bạn có thể tự xác định một loạt các địa chỉ để tháo rời:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff 
+1

Mẹo rất hay. Ngoài ra, bạn có thể sử dụng tháo rời $ rip, $ rip + bù đắp mà làm giảm nỗi đau của tìm ra nơi khung stack của bạn là – Eric

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