Патч простой программы c с IDA PRO получить ошибку сегментации
Это моя программа:
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
Я изменяю код операции... в шестнадцатеричном редактировании, как на этом изображении, но когда я запускаю свою программу, я получаю ошибку сегментации.
2 ответа
Вы получаете ошибку сегментации, потому что код операции 83 05
означает инструкцию ADD DWORD PTR [address],constant
где address
а также constant
определяются следующими пятью байтами 05 89 45 F4 75
, Так что в этом случае инструкция ADD DWORD PTR [F4458905],75
, Итак, вы ссылаетесь на неверный адрес памяти.
Оригинальная инструкция:
83 F9 05 cmp ecx, 5
Похоже, вы пытаетесь изменить это в постоянное сопоставление, что-то вроде:
83 05 05 cmp 5, 5 ; not what you think it is!
Я сомневаюсь, что такой зверь даже существует, так как его полезность была бы в лучшем случае сомнительной. Сравнение двух констант может показаться пустой тратой кремния.
На самом деле вы меняете его на инструкцию, которая почти наверняка разыменует неверный адрес).
В качестве первого варианта вы можете заменить эту трехбайтовую последовательность той, которая устанавливает нулевой бит (поскольку проверка нескольких инструкций ниже jnz
инструкция), и дополните его достаточно nop
операции, чтобы сделать его одинакового размера.
В качестве альтернативы ищите cmp ecx, ecx
заявление (опять же с соответствующим nop
padding), чтобы вы могли быть уверены, что все флаги установлены правильно. Это, по словам сборщика GNU as
:
39 c9 cmp %ecx, %ecx
90 nop