Как вызвать сборку в gdb? - PullRequest
       8

Как вызвать сборку в gdb?

4 голосов
/ 30 марта 2011

В GDB я могу использовать call для запуска функций, но что, если я хочу запустить какую-то дополнительную сборку?

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

До GCC 5 (1) я не знаю способа запуска произвольного машинного кода, если вы фактически не введете машинный код в память, а затем запустите его.

Если вы хотите запустить в памяти код, который уже , вы можете просто установить указатель инструкции на начало, точку останова в конце и затем перейти. Затем, после точки останова, верните указатель инструкции к его первоначальному значению.

Но я на самом деле не вижу варианта использования для этого. Это не значит, что не , просто то, что все, что вы можете сделать, запустив код, вы также можете достичь, напрямую изменив регистры, флаги, память и т. Д.

Например, команда:

info registers

сбросит текущие значения регистров, в то время как:

set $eax = 42

изменит регистр eax на 42.

Вы также можете изменить память следующим образом:

set *((char*)0xb7ffeca0) = 4

Это записывает один байт в ячейку памяти 0xb7ffeca0, и вы можете использовать этот же метод для хранения более широких типов данных.


(1) GCC 5 позволяет вам скомпилировать и выполнить произвольный код с помощью команды compile code, как документировано здесь .

0 голосов

compile code команда

Представлено около 7.9, позволяет компилировать и внедрять код, документация: https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

Пример:

int main(void) {
    int i = 0;
    printf("%d\n", i);
    return 0;
}

Затем в ГБД:

start
next
compile code int j = 1; i = j; asm("nop");
continue

Вывод программы:

1

Чтобы это работало, вам нужны последние GDB и GCC 5.x. Протестировано на GDB 7.9.1, GCC 5.1, с:

export LD_LIBRARY_PATH="/path/to/gcc/install/lib64:$LD_LIBRARY_PATH"

, чтобы было видно libcc1.so: это недавний компонент GCC, который предоставляет C API для компилятора cc1.

Есть несколько конструкций, которые не работали, как я ожидал, например return, поэтому я спросил, почему: В команде кода компиляции GDB, какие языковые конструкции ведут себя точно так, как если бы они присутствовали в первоисточник?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...