我试图通过更改此代码中函数的返回地址来更改程序执行流程:
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
注意:我通过将 *(&b+3) 与之前 __builtin_return_address(0) 返回的值进行比较来验证它是返回地址。
函数体main
必须f
保持不变。
谢谢。