Команда gdb set args
может устанавливать аргументы. Используя eval
, который пропускает свои аргументы через printf
, мы можем вставлять почти произвольные символы, используя шестнадцатеричные escape-символы. (Мы ограничены тем фактом, что gdb обычно вызывает цель с помощью оболочки, поэтому это помогает добавлять одинарные кавычки вокруг каждого аргумента).
(gdb) eval "set args '%s'", "\x41\x41\x20\x41"
You can't do that without a process to debug.
Это еще одно ограничение gdb. Альтернативой, которая не заставляет gdb выделять память в целевом объекте, является предоставление eval только %c
преобразований и целочисленных аргументов, например:
(gdb) eval "set args '%c%c%c%c'", 0x41, 0x41, 0x20, 0x41
Но необходимо указать точное число %c
преобразование в эту строку формата утомительно, поэтому давайте придерживаться единственного %s
. Нам нужно запустить процесс, хотя мы собираемся перезапустить его сразу после того, как мы установили аргументы с помощью eval.
(gdb) start
Starting program: /home/mp/argprint
Temporary breakpoint 1, main (argc=1, argv=0x7ffffffee2b8) at argprint.c:4
4 for(int i=0; i < argc; i++) {
(gdb) eval "set args '%s'", "\x41\x41\x20\x41"
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/mp/argprint 'AA A'
arg 0 is <</home/mp/argprint>>
arg 1 is <<AA A>>
Если у вас есть старый gdb, в котором нет команды eval, но есть есть Python, можно так:
(gdb) python gdb.execute("set args '\x41\x41\x20\x41'")