2014-11-30 6 views
1

아시다시피 서브 루틴 호출시 현재 PC (프로그램 카운터) 값이 스택에 저장됩니다. 아래처럼 서브 루틴 안에서 수정하고 싶습니다. gcc 컴파일러를 사용하여 Intel Core-i7 3632QM에서이 작업을 수행하려고합니다.C 또는 어셈블리의 스택에서 반송 주소를 수정하는 방법

+1

어떤 컴파일러를 사용합니까? 나는 인라인 어셈블리가 필요하다고 확신한다. 그러나 이것은 실제로 [X/Y 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 일 수 있습니다. – usr2564301

+0

gcc 컴파일러 사용 –

+1

물론 귀국 주소를 수정할 수는 있지만 어디로 돌아갈 예정입니까? 또한 모든 매개 변수를 고려하십시오. –

답변

6

이것은 거의 확실하게 XY 문제이며, 실제로하고 싶은 것을 말하지 않았습니다.

#include <stdio.h> 
#include <stdlib.h> 

void bar() 
{ 
    puts("entered the bar ;)"); 
    exit(0); 
} 

void** search(void** addr, void* value) __attribute__((noinline)); 
void** search(void** addr, void* value) 
{ 
    while(*addr != value) addr++; 
    return addr; 
} 

void foo() __attribute__((noinline)); 
void foo() 
{ 
    void** p = search((void**)&p, __builtin_return_address(0)); 
    *p = bar; 
} 

int main() 
{ 
    foo(); 
    return 0; 
} 

See it in action : 어쨌든, 여기에 리턴 주소를 수정 예제 코드입니다.

분명히 foo은 반송 주소를 포함하기 위해 인라인되어서는 안되며 컴파일러가 반환 주소에 대한 쓰기를 제거하는 일부 모호한 최적화 문제에 대해 search을 자체 함수로 분리해야했습니다. 이와 같이 반환 주소를 검색하면 로컬 변수에서 특정 오프셋을 하드 코딩 한 것보다 스택 레이아웃 차이에 더 관대합니다.