У меня есть следующий код ASM из простой запутанной программы C, заданной мне как назначение.Измените инструкции asm в двоичном файле ELF
0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax
0x00000000004006a4 <+151>: mov %rdx,%rsi
0x00000000004006a7 <+154>: mov %rax,%rdi
0x00000000004006aa <+157>: callq 0x400713 <SECRET> <======
0x00000000004006af <+162>: movl $0x0,-0x24(%rbp)
0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203>
0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax
Цель найти и удалить функцию (пропатчить файл программы), который вызывает сегментацию Fault. Я нашел, какая функция вызывает segfault, но я не знаю, как исправлять двоичный файл.
Моя проблема заключается в том, как пропатчить
0x00000000004006aa <+157>: callq 0x400713 <SECRET>
так, что я не буду называть SECRET функцию.
Если я использую gdb
, чтобы пропустить/перейти к SECRET, изменив счетчик программ, пока работает один шаг во время выполнения, программа завершает выполнение и дает мне тот результат, который я хочу.
Что я хочу - это постоянно модифицированная копия исполняемого двоичного файла, который всегда пропускает без использования отладчика.
есть способ пропустить его или прыгнуть, когда я выполняю программу без gdb –
Пропуск через нее в GDB не считается решением вашего задания, но да, gdb может прыгать туда, где вы хотите. Проверьте руководство gdb. Вы даже можете перезаписать инструкцию 'call' с помощью NOP во время этого сеанса отладки. Если это что-то вроде бинарного назначения лаборатории бомбы, вы должны дать ему разные входные данные, поэтому выполнение никогда не достигает этого блока. –
Да, я могу сделать это с помощью счетчика программ, однако я ищу способ отредактировать двоичный файл и удалить этот вызов функции и сохранить исправленный файл. –