Патч простой программы c с IDA PRO получить ошибку сегментации

Это моя программа:

#include <stdio.h>

int main(){
  int var=5;
  if(var==5) printf("Accesso effettuato!");
  else printf("Access denied");

}

Я изменяю код операции... в шестнадцатеричном редактировании, как на этом изображении, но когда я запускаю свою программу, я получаю ошибку сегментации.

image1

image2

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
Другие вопросы по тегам