これは私のプログラムです:
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
オペコードを変更します...この画像のように 16 進数で編集しますが、プログラムを実行するとセグメンテーション違反が発生します。
オペコードは、とが次の 5 バイトによって決定される命令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!
その有用性はせいぜい疑わしいので、そのような獣が存在するとは思えません。2 つの定数を比較することは、シリコンの無駄遣いのように思えます。
実際に変更しているのは、ほぼ確実に無効なアドレスを逆参照する命令です)。
オプション 1 として、その 3 バイト シーケンスをゼロ ビットを設定するものに置き換え (数命令下のチェックが命令であるため)、同じサイズにするのにjnz
十分な操作でパディングすることができます。nop
または、すべてのフラグが正しく設定されていることを確認できるように、cmp ecx, ecx
(適切なパディングを使用して) ステートメントを探します。これは、GNU アセンブラーによると、次のとおりです。nop
as
39 c9 cmp %ecx, %ecx
90 nop