다음 명령어를 반입하기 전에 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 컴파일러로이 작업을 수행하려고합니다.
읽기 쓰기 기능을 사용하면 놀랄 것입니다. Intel 코어에는 MMU에 XD/XN 비트가 있습니다.이 비트는 바이러스가 데이터를 실행하지 못하도록하는 보안 목적으로 사용됩니다. 이는 MMU의 코드와 코드를 효과적으로 분리하여 실행 영역이 업데이트되지 않도록합니다. 만약 어떤 종류의 O/S가 실행되고 있다면 이것은 예외를 던질 것입니다 (그리고 당신의 코드를 당신의 virsus 스캐너를 만든 사람에게 보냄). –
@MikeofSST 필자는 한번도 실험 해본 적이 없지만 http://stackoverflow.com/a/4169440/139746의 단계를 따르면 코드를 수정할 수 있습니다. –
굉장한 링크 - 그건 트로이를위한 조리법과 같습니다! :-) 나는 수정 된 코드를 호출하기 전에 i-cache를 비우고 싶다. –