我试图通过更改此代码中函数的返回地址来更改程序执行流程:
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
必须不变。
谢谢。
最佳答案
解决方案是以某种方式告诉 while 循环发生了某些变化。 例如
volatile int flag = 0 ;
void s(int signum) {
int b = 1;
__sync_fetch_and_add( &flag, 1 ) ;
}
void f() {
while(__sync_fetch_and_add( &flag, 0 ) == 0);
printf("f exit\n");
}
添加了原子内部函数(函数 __sync_fetch_and_add)以避免优化循环。我不确定一个简单的 volatile 是否足够。等待自己对此发表评论....
关于c++ - 通过信号和返回地址改变程序执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324869/