2014-12-15 1 views
1

다음 명령어를 반입하기 전에 foo 함수에서 "How to modify return address on Stack in C or Assembly"을 가장 잘 표현하여 *p이 메인 함수의 다음 명령어를 가리 키도록 수정하려고합니다. *p이 가리키는 내용을 수정하고 싶습니다. 예를 들어, 다음 명령을 점프 명령으로 변경하려고합니다. 어떻게 할 수 있니?gcc를 사용하여 메모리에서 다음 명령어 수정

void foo() 
{ 
    void** p = search((void**)&p, __builtin_return_address(0)); 
    // modify content of where *p points at. 
} 

int main() 
{ 

    foo(); 
    //next instruction. *p points here 
    return 0; 
} 

인텔 코어 i7 3632QM 프로세서에서 gcc 컴파일러로이 작업을 수행하려고합니다.

답변

3

예를 들어 다음 명령을 점프 명령으로 변경하려고합니다. 어떻게 할 수 있니?

실행중인 프로그램이 코드가 read-write memory pages에 유지되도록주의하지 않는 한 최신 OS가 설치된 데스크톱 시스템에서는 실행할 수 없습니다. 기본적으로 코드는 읽기 전용 메모리 페이지에로드됩니다.

+1

읽기 쓰기 기능을 사용하면 놀랄 것입니다. Intel 코어에는 MMU에 XD/XN 비트가 있습니다.이 비트는 바이러스가 데이터를 실행하지 못하도록하는 보안 목적으로 사용됩니다. 이는 MMU의 코드와 코드를 효과적으로 분리하여 실행 영역이 업데이트되지 않도록합니다. 만약 어떤 종류의 O/S가 실행되고 있다면 이것은 예외를 던질 것입니다 (그리고 당신의 코드를 당신의 virsus 스캐너를 만든 사람에게 보냄). –

+2

@MikeofSST 필자는 한번도 실험 해본 적이 없지만 http://stackoverflow.com/a/4169440/139746의 단계를 따르면 코드를 수정할 수 있습니다. –

+0

굉장한 링크 - 그건 트로이를위한 조리법과 같습니다! :-) 나는 수정 된 코드를 호출하기 전에 i-cache를 비우고 싶다. –

2

아이디어 만 있습니다. 코멘트에서 이미 언급했듯이 을 쓰십시오.을 실행하십시오 [보통] 동일한 메모리 범위에서 설정할 수 없습니다. 그러나 모든 POSIX 시스템은 동적 링커 (dlopen(), dlclose(), ...)에 대한 인터페이스를 가져야합니다. 따라서 동적 링커에서 사용되는 런타임시 프로세스 메모리 레이아웃을 수정하는 방법이 있습니다.

동적 링커를 수정하거나 같은 인터페이스를 사용하는 것이 허용 가능한 옵션 인 경우 메모리 세그먼트를 덤프 (또는 다른 범위로 복사), 수정, 원본 세그먼트 해제 및로드 된 수정 범위.

관련 문제