Возможно ли то, что я пытаюсь сделать?
Да, вы можете изменить .text двоичного файла.
Обратите внимание, что это изменение повлияет только на текущее выполнение;после run
ваше изменение «испарится» (если вы хотите навсегда исправить бинарный файл, это тоже возможно, но процедура другая).
Если это так, я что-то не так делаю?
Вероятно.Вы не сказали нам, на что пытаетесь изменить инструкцию.
Если так, что я делаю не так и как я могу это исправить?
Использование(gdb) disas/r
покажет вам фактические необработанные байты инструкции и, вероятно, облегчит вам понимание того, что вы сделали неправильно.Когда я использую его, я вижу это:
0x080483ed <+9>: c7 44 24 1c d0 84 04 08 movl $0x80484d0,0x1c(%esp)
То есть адрес (который вы, очевидно, хотели перезаписать) для инструкция выше [1] не начинается с &instruction+1
начинается с &instruction+4
Кроме того, вы не должны обращать байты, когда просите GDB написать слово (я полагаю, вы хотели, чтобы новый адрес был 0x0804785b
, а не 0x5b870408
):
(gdb) set *(0x080483ed+4)=0x01020304
(gdb) disas
Dump of assembler code for function main:
0x080483e4 <+0>: push %ebp
0x080483e5 <+1>: mov %esp,%ebp
0x080483e7 <+3>: and $0xfffffff0,%esp
0x080483ea <+6>: sub $0x20,%esp
=> 0x080483ed <+9>: movl $0x1020304,0x1c(%esp)
0x080483f5 <+17>: mov 0x1c(%esp),%eax
0x080483f9 <+21>: mov %eax,(%esp)
0x080483fc <+24>: call 0x8048318 <puts@plt>
0x08048401 <+29>: mov $0x0,%eax
0x08048406 <+34>: leave
0x08048407 <+35>: ret
[1] очень вероятно, что ваша инструкция:
0x080487e0 <+17>: movl $0x8048640,0x20(%esp)
имеет ту же кодировку, что и моя инструкция:
0x080483ed <+9>: movl $0x80484d0,0x1c(%esp)
, поскольку они "одинаковые", и имеюттакой же длины в 8 байтов, но, как указал ФрэнкХ, может существовать другое кодирование одной и той же инструкции.В любом случае, disas/r
покажет вам все, что вам нужно знать.