私は割り当てとして私に与えられた単純な難読化されたCプログラムの次のASMコードを持っています。ELFバイナリで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の原因となっている機能を見つけましたが、バイナリにパッチを当てる方法はわかりません。
私の問題は、私は文句を言わないSECRET関数を呼び出すように
0x00000000004006aa <+157>: callq 0x400713 <SECRET>
にパッチを適用する方法です。
gdb
を使用して、実行時にシングルステップ実行中にプログラムカウンタを変更してSECRETをスキップ/ジャンプすると、プログラムは実行を終了し、私に必要な出力を与えます。
私が望むのは、常にデバッガを使用せずにスキップする実行可能バイナリファイルの永久に変更されたコピーです。
gdbなしでプログラムを実行すると、スキップするかジャンプする方法はありますか –
GDBでスキップすることはあなたの課題を解決するものではありませんが、gdbは必要な場所にジャンプできます。 gdbマニュアルを確認してください。そのデバッグセッション中に 'call'命令をNOPで上書きすることさえできます。これがバイナリの爆弾ラボの割り当てのようなものならば、実行はそのブロックに決して到達しないように異なる入力を与えるはずです。 –
はい私はプログラムカウンターでそれを行うことができますが、バイナリを編集し、その関数呼び出しを削除してパッチを当てたファイルを保存する方法を探しています。 –