1

これは私のプログラムです:

#include <stdio.h>

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

}

オペコードを変更します...この画像のように 16 進数で編集しますが、プログラムを実行するとセグメンテーション違反が発生します。

画像1

画像2

ここに画像の説明を入力

4

2 に答える 2

5

オペコードは、とが次の 5 バイトによって決定される命令83 05を意味するため、セグメンテーション違反が発生します。したがって、この場合、命令は. つまり、無効なメモリ アドレスを参照しています。ADD DWORD PTR [address],constantaddressconstant05 89 45 F4 75ADD DWORD PTR [F4458905],75

于 2012-01-26T21:57:43.693 に答える
1

元の指示は次のとおりです。

83 F9 05  cmp ecx, 5

それを次のような一定の比較に変更しようとしているようです:

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

その有用性はせいぜい疑わしいので、そのような獣が存在するとは思えません。2 つの定数を比較することは、シリコンの無駄遣いのように思えます。

実際に変更しているのは、ほぼ確実に無効なアドレスを逆参照する命令です)。

オプション 1 として、その 3 バイト シーケンスをゼロ ビットを設定するものに置き換え (数命令下のチェックが命令であるため)、同じサイズにするのにjnz十分な操作でパディングすることができます。nop

または、すべてのフラグが正しく設定されていることを確認できるように、cmp ecx, ecx(適切なパディングを使用して) ステートメントを探します。これは、GNU アセンブラーによると、次のとおりです。nopas

39 c9      cmp  %ecx, %ecx
90         nop
于 2012-01-26T22:01:06.293 に答える