2014-04-30 6 views
0
내가 GDB와 C. 의 버퍼에서 함수를 빌드하려고

나는 C 코드를 작성ASM 쉘 코드 - 프롤로그

push rbp 
mov rbp,rsp 
(...) 
leave 
ret 

그래서

0x55 
0x48 0x89 0xe5 
(...) 
0xc9 
0xc3 

에 내가 번역 할 수 있습니다 :
int main() 
{ 
    char buffer[]={0x55,0x48,0x89,0xe5,0xc9,0xc3}; 
    void (*j)(void)=buffer; 
    j(); 
} 

하지만 내 프로그램은 intruction (버퍼에 0x55) "푸시 RBP" 당신이 KN 수행에 충돌이 보인다 왜?

+0

어떻게 충돌합니까? ..... –

+1

** 많은 정보를 제공해야합니다 **. 아키텍처 및 운영 체제 란 무엇입니까? 데이터 공간을 실행할 수 있습니까? 캐시 일관성을 보장하기 위해 특별한 조치를 취해야합니까? –

답변

2

일반적으로 스택 (여기서 buffer이 저장 됨)은 실행 가능하지 않습니다. 그 주위에 두 가지 방법이 주로 있습니다 : 스택이 실행 표시되도록

  1. 컴파일/링크 (예 gcc -z execstack.) 코드가 실행입니다 페이지를 표시하는 런타임에
  2. 사용 mprotect
+0

이제 작동합니다. – user2199104