2016-09-16 3 views
2

У меня есть следующий код 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, изменив счетчик программ, пока работает один шаг во время выполнения, программа завершает выполнение и дает мне тот результат, который я хочу.

Что я хочу - это постоянно модифицированная копия исполняемого двоичного файла, который всегда пропускает без использования отладчика.

+0

есть способ пропустить его или прыгнуть, когда я выполняю программу без gdb –

+0

Пропуск через нее в GDB не считается решением вашего задания, но да, gdb может прыгать туда, где вы хотите. Проверьте руководство gdb. Вы даже можете перезаписать инструкцию 'call' с помощью NOP во время этого сеанса отладки. Если это что-то вроде бинарного назначения лаборатории бомбы, вы должны дать ему разные входные данные, поэтому выполнение никогда не достигает этого блока. –

+0

Да, я могу сделать это с помощью счетчика программ, однако я ищу способ отредактировать двоичный файл и удалить этот вызов функции и сохранить исправленный файл. –

ответ

1

Мне было любопытно, что еще я могу сделать с GDB. Мне удалось сменить сборку с GDB, и исправленная программа работает так, как должна.

Я пробовал использовать nop, но это не сработало, тогда я посмотрел на функцию прыжка. Как работает мой патч:

(gdb) set {unsigned char *}0x4006aa = 0xEB 
(gdb) set {unsigned char *}0x4006ab = 0x0C 

Я делаю это короткий прыжок. Код короткого перескока - это EB XX, где XX - относительный прыжок с IP/ПК. Итак, в этом случае я должен перепрыгнуть вперед на 12 байт, а также инструкция составляет 2 байта, поэтому я пишу ее в последовательных ячейках памяти. Я пишу новый модифицированный двоичный файл на жесткий диск и все отлично.

Мне потребовался день экспериментов, но в конце я многому научился. : D

+1

Возможно, вы можете сделать 'set {unsigned short *} 0x4006aa = 0x0CEB' –

+1

Поскольку я впервые сделал это, я сделал это шаг за шагом. –

Смежные вопросы