2015-02-07 2 views
2

스택에 char 및 함수 포인터를 덮어 쓰려고합니다. 이 질문 (How can I store a value at a specific location in the memory?)에서 내가 발견 한 것을 바탕으로 그 캐릭터를 덮어 쓰는 방법을 알 수있었습니다. 내 문제는 지금 내가 잘못 캐스팅했다는 컴파일 오류가 발생한다는 것입니다.C++ 함수 포인터를 메모리에 삽입하십시오.

void foo(char letter); 
void bar(char letter); 

void function1() 
{ 
    void (*pointer)(char); 
    pointer = foo; 
    letter = 'B'; 
    function2(); 
    (*pointer)(letter); 
} 

void function2() 
{ 
    int number; // Used in omitted code 

    *(char *)(&number + 75) = 'A'; 
    *(void (*)(char)) (&number + 42) = &bar; // This is the line with the error 
} 

첫 번째 분사는 작동하지만 두 번째 분사는 나에게 컴파일 오류를 발생시킵니다.

g ++ 컴파일러를 사용하여 Redhat Linux를 실행 중입니다. 컴파일러에서 얻은 오류는 다음과 같습니다.

"* (void (char))로 변경하면 컴파일러에서 오류가 발생합니다. 컴파일러는 다음과 같이 말합니다.
"함수 유형 'void (char)'에 대한 캐스트가 잘못되었습니다."

이 구문은 무엇입니까?

+0

'pass'의 주소를 메모리의 한 위치에 쓰려면 메모리 주소를 함수 포인터로 캐스트하지 마십시오. 함수 포인터를 메모리 주소로 변환하십시오. –

+0

컴파일러의 정확한 출력을 게시하고 오류가 발생한 행을 명확하게 표시하는 것이 좋습니다. 또한 까다로운 작업을 수행하고 컴파일러 최적화 문제에 부딪 힐 수도 있으므로 사용중인 컴파일러, 컴파일하는 데 사용한 명령 및 실행중인 운영 체제를 정확하게 말해야합니다. –

+0

그래서 악성 코드를 작성하려고하는데 도움을 청합니다. –

답변

1

당신의 목표는 메모리에 pass의 주소를 작성하는 것입니다 (이것은 학교 보안 과제에서 코드를 수정, 나는 악성 코드 쓰고 있지 않다), 그래서 당신은 왜 함수 포인터에 (&number + 13)을 캐스팅? 그냥 전에 한 일을하십시오 :

*(long *)(&number + 13) = (long)&pass; 

그러면 컴파일러 오류가 발생하지 않습니다. 이 정의되지 않은 동작이 호출 될 때 어떤 일이 일어날 지에 관해서는 알 수 있습니다.

편집 : @DavidGrayson이 지적했듯이 방정식의 오른쪽면을 고찰하면 포인터가 아닌 함수의 내용을 얻을 수 있습니다. 따라서 포인터가 아닌 POD 타입으로 변환해야합니다.

+0

도움을 주셔서 감사합니다! – Schuyler