Я перебуваю поза цільовим виконуваним файлом gdb, і у мене навіть немає стека, який відповідає цій цілі. Я все одно хочу зробити крок, щоб я міг перевірити, що відбувається в моєму коді збірки, оскільки я не фахівець у збірці x86. На жаль, gdb відмовляється виконувати цю просту налагодження на рівні збірки. Це дозволяє мені встановити та зупинити відповідну точку зупинки, але як тільки я спробую зробити крок далі, gdb повідомляє про помилку "Не вдається знайти межі поточної функції", і EIP не змінюється.
Додаткові деталі:
Машинний код був сформований за допомогою операторів gcc asm, і я скопіював його до пам'яті ядра, де він виконується, з виводу objdump -d. Я не заперечував би проти простого способу використання навантажувача для завантаження мого об’єктного коду за перенесеною адресою, але майте на увазі, завантаження має виконуватися в модулі ядра.
Я припускаю, що ще однією альтернативою може бути створення підробленого модуля ядра або інформаційного файлу налагодження для передачі в gdb, щоб він повірив, що ця область знаходиться в коді програми. gdb чудово працює на самому виконуваному файлі ядра.
(Для тих, хто справді хоче знати, я вставляю код під час виконання в простір даних ядра Linux у віртуальній машині VMware і налагоджую його із віддаленої налагодження gdb ядра за допомогою вбудованого заглушки gdb VMware Workstation. Примітка. Я не пишу ядро експлуатує; я аспірант із безпеки, пишу прототип.)
(Я можу встановити точку зупинки для кожної інструкції всередині моєї збірки. Це працює, але через деякий час це стане досить трудомістким, оскільки розмір інструкцій з монтажу x86 змінюється, і розташування збірки змінюватиметься при кожному перезавантаженні.)