1

我试图通过更改此代码中函数的返回地址来更改程序执行流程:

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) + 4fwhile(true)printf("f exit\n")while

注意:我通过将 *(&b+3) 与之前 __builtin_return_address(0) 返回的值进行比较来验证它是返回地址。

函数体main必须f保持不变。

谢谢。

4

1 回答 1

0

解决方案是以某种方式告诉 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 就足够了。等待自己对此发表评论......

于 2015-07-09T18:13:23.630 回答