このコードの関数の戻りアドレスを変更して、プログラムの実行フローを変更しようとしています:
void s(int signum) {
int b = 1;
*(&b+3) = *(&b+3) + 4;
}
void f() {
while(true);
printf("f exit\n");
}
int main() {
signal( SIGCONT, s );
f();
printf("end of prog");
return 0;
}
この目的のために、f
関数を呼び出します。そのため、 でスタックしwhile(true)
ます。次に、コマンドSIGCONT
を使用してプログラムにシグナルを送信しますkill -SIGCONT <PID>
。ここで、プログラムは実行を中断while(true)
し、関数f
を実行する必要がありs
ます。関数では、ランタイムスタックで関数の戻りアドレスを見つけるようs
に定義しました。この値を で変更して、 に戻ったときにの実行をスキップして を実行するようにします。しかし、それは行き詰まり続けており、これを機能させる方法がわかりません。b
s
*(&b+3)
*(&b+3) = *(&b+3) + 4
f
while(true)
printf("f exit\n")
while
注: 以前に __builtin_return_address(0) によって返された値と比較して、*(&b+3) がリターン アドレスであることを確認しました。
関数の本体でmain
ありf
、変更されていない必要があります。
ありがとう。