修改调用堆栈

时间:2016-04-28 02:53:03

标签: c++ stack-trace

是否可以在c ++中修改调用堆栈? (我意识到这是一个可怕的想法,我真的只是想知道----我不打算实际这样做)

例如:

void foo(){
  other();
  cout << "You never see this" << endl;  //The other() function modifies the stack to 
                            //point to what ever called this function...so this is not displayed
}
void other(){
  //modify the stack pointer here somehow to go down 2 levels
}

//Elsewhere
foo();

1 个答案:

答案 0 :(得分:1)

当一个函数在典型的C实现中调用另一个函数时,使用处理器堆栈并使用调用操作码。这有效地推动下一个在处理器堆栈上执行处理器指令指针。通常除了返回地址之外,还使用堆栈帧指针的值。 所以堆栈包含:
... free_space ... [local_variables] [framePtr] [returnAddr] PREVIOUS_STACK。

因此,为了更改返回地址(您应该知道它具有的大小 - 如果您通过-m64编译它将具有64位的大小),您可以获取变量的地址并添加一些它是为了到达返回指针的地址并进行更改。 下面的代码是用m64模式下的g ++编译的。 如果它也适用于你,你可能会看到效果。

#include <stdio.h>


void changeRetAddr(long* p){
    p-=2;
    *p+=0x11;
}


void myTest(){
    long a=0x1122334455667788;
    changeRetAddr(&a);
    printf("hi my friend\n");
    printf("I didn't showed the salutation\n");
}


int main(int argc, char **argv)
{ 
    myTest();
    return 0;
}