課題として与えられた単純な難読化された C プログラムからの次の ASM コードがあります。
0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax
0x00000000004006a4 <+151>: mov %rdx,%rsi
0x00000000004006a7 <+154>: mov %rax,%rdi
0x00000000004006aa <+157>: callq 0x400713 <SECRET> <======
0x00000000004006af <+162>: movl $0x0,-0x24(%rbp)
0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203>
0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax
目標は、セグメンテーション違反の原因となっている関数を見つけて削除する (プログラム バイナリにパッチを当てる) ことです。segfault の原因となっている関数を特定しましたが、バイナリにパッチを適用する方法がわかりません。
私の問題は、パッチを適用する方法です
0x00000000004006aa <+157>: callq 0x400713 <SECRET>
SECRET 関数を呼び出さないようにします。
実行時gdb
にシングル ステップでプログラム カウンターを変更して SECRET をスキップ/ジャンプすると、プログラムは実行を終了し、必要な出力が得られます。
私が欲しいのは、デバッガーを使用せずに常にスキップする実行可能バイナリ ファイルの永続的に変更されたコピーです。