Tôi đang ở bên ngoài mục tiêu thực thi của gdb và tôi thậm chí không có ngăn xếp tương ứng với mục tiêu đó. Tôi vẫn muốn thực hiện từng bước một để có thể xác minh điều gì đang xảy ra trong mã lắp ráp của mình, bởi vì tôi không phải là chuyên gia về lắp ráp x86. Thật không may, gdb từ chối thực hiện gỡ lỗi cấp lắp ráp đơn giản này. Nó cho phép tôi đặt và dừng ở điểm ngắt thích hợp, nhưng ngay sau khi tôi cố gắng thực hiện một bước trở đi, gdb báo lỗi "Không thể tìm thấy giới hạn của chức năng hiện tại" và EIP không thay đổi.
Chi tiết bổ sung:
Mã máy được tạo bởi các câu lệnh gcc asm và tôi đã sao chép nó vào vị trí bộ nhớ hạt nhân nơi nó đang thực thi, từ đầu ra của objdump -d. Tôi sẽ không ngại một cách đơn giản để sử dụng trình tải để tải mã đối tượng của tôi đến một địa chỉ được di dời, nhưng hãy nhớ rằng việc tải phải được thực hiện trong mô-đun hạt nhân.
Tôi cho rằng một giải pháp thay thế khác sẽ là tạo một mô-đun hạt nhân giả hoặc tệp thông tin gỡ lỗi để cung cấp cho gdb, để khiến nó tin rằng khu vực này nằm trong mã chương trình. gdb hoạt động tốt trên chính tệp thực thi của nhân.
(Đối với những người thực sự muốn biết, tôi đang chèn mã trong thời gian chạy vào không gian dữ liệu nhân Linux bên trong VMware VM và gỡ lỗi nó từ gdb từ xa gỡ lỗi hạt nhân thông qua sơ khai gdb tích hợp sẵn của VMware Workstation. Lưu ý rằng tôi không viết hạt nhân khai thác; Tôi là một sinh viên tốt nghiệp bảo mật đang viết một nguyên mẫu.)
(Tôi có thể đặt điểm ngắt trên mỗi lệnh bên trong lắp ráp của mình. Điều này hoạt động nhưng sẽ khá mất công sau một thời gian, vì kích thước của lệnh lắp ráp x86 khác nhau và vị trí của cụm sẽ thay đổi mỗi khi tôi khởi động lại.)