2012-01-26 3 views
0

Это моя программа:Заделки простого гр программы с IDA PRO ПОЛУЧИТЬ сбой сегментации

#include <stdio.h> 

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

} 

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

image1

image2

enter image description here

ответ

4

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

1

оригинальная инструкция:

83 F9 05 cmp ecx, 5 

Похоже, вы пытаетесь изменить, что в постоянный comaparison, что-то вроде:

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

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

Что вы на самом деле Фактически смена его на инструкцию, которая почти наверняка вызывает недействительный адрес).

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

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

39 c9  cmp %ecx, %ecx 
90   nop 
+0

Cmp ecx, ecx is 83 F9 F9? В любом случае, спасибо за ответ, я понимаю, Моя ошибка –

+0

@Usi, коды операций не так просты, вам нужно получить ассемблер, или IDA Pro должен быть в состоянии сделать это за вас. – paxdiablo