Патчинг простой программы на C с помощью IDA PRO приводит к ошибке сегментации - PullRequest
0 голосов
/ 27 января 2012

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

#include <stdio.h>

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

}

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

image1

image2

enter image description here

Ответы [ 2 ]

4 голосов
/ 27 января 2012

Вы получаете ошибку сегментации, поскольку код операции 83 05 означает инструкцию ADD DWORD PTR [address],constant, где address и constant определяются следующими пятью байтами 05 89 45 F4 75.Так что в этом случае инструкция ADD DWORD PTR [F4458905],75.Итак, вы ссылаетесь на неверный адрес памяти.

1 голос
/ 27 января 2012

Исходная инструкция:

83 F9 05  cmp ecx, 5

Похоже, вы пытаетесь превратить это в постоянное сопоставление, что-то вроде:

83 05 05  cmp 5, 5     ; not what you think it is!

Я сомневаюсь, что такой зверьдаже существует, так как его полезность была бы в лучшем случае сомнительной.Сравнение двух констант может показаться бесполезной тратой кремния.

То, что вы на самом деле изменили на это, - это инструкция, которая почти наверняка разыменует неверный адрес.В качестве первого варианта вы можете заменить эту трехбайтовую последовательность на ту, которая устанавливает нулевой бит (поскольку проверка нескольких инструкций является инструкцией jnz), и дополнить ее достаточным количеством операций nop, чтобы сделать ее одинакового размера.

В качестве альтернативы ищите оператор cmp ecx, ecx (снова с соответствующим заполнением nop), чтобы вы могли быть уверены, что все флаги установлены правильно.Это, по словам сборщика GNU as:

39 c9      cmp  %ecx, %ecx
90         nop
...