본문 바로가기
Study/Linux

mprotect의 사용법!!!

by 뿡뿡대마왕 2011. 9. 28.
반응형
윈도우에서 사용하던 코드를 리눅스에 써야 할 일이 생겼다..근데 이게 뭥미??
memcpy시 바로 뻗어버리는 현상이...
분명 리눅스도 뭔가 메모리 보호속성이 있을거라 생각이 들었다..이래저래 찾아보니..
메모리에 대한 읽기/쓰기/실행 권한이 있더라.....
gdb로 별짓을 다해서 그 명령어를 못찾았는데 ..보는 방법은 아래와 같다.(gdb로 보는 방법도 있을듯 하다;;뭘까?)
cat /proc/pid/maps
pid 부분에 메모리를 보고자하는 프로세스 id를 넣으면 된다.
위 명령어를 실행하면 아래와 같은 모습이 보인다.


현재 64bit에서 해서 주소가 길다.;;; 암튼 보면 rwx가 보일것다..각 주소대 별로 read, write, execute가 가능한지를 보여준다.
암튼 난 r-xp의 속성이 있는 주소 영역에 memcpy를 하려다 뻑이난 것이다.
그래서 이래저래 찾아보니 mprotect라는 명령어가 있더라..근데 자꾸 실패가 나서...사용이 않되는 건줄 알았다.ㅠ_ㅠ
하지만 kldp에 질문을 올린결과 정말 명쾌한 답변이 올라왔다.  +.+

void func1(int *x) { *x = 1; }
void func2(int *x) { *x = 2; }

int main(int argc, char **argv)
{
mprotect((void *)((long) func1 & ~(getpagesize() - 1)), func2 - func1, PROT_READ|PROT_WRITE|PROT_EXEC);
memcpy(func1, func2, func2 - func1);
int x;
func1(&x);
printf("%d\n", x);
return 0;
}

//mprotect() 의 1번째 인자를 page align 하시면 됩니다.


정말 내가 원하던 모습이다....ㅠ_ㅠ
'mprotect() 의 1번째 인자를 page align 하시면 됩니다.' 라는 말은 아직 정확하게 이해를 하지 못했다.;;;;

암튼 위와 같은 방식으로 하니 memcpy 할 때 뻗지 않고 잘된다.!!

ㅠ_ㅠ 이 걸 알려주신 kdw2rao 님께 감사드린다..^^
반응형

댓글