리눅스 커널 2.6.14.6 에서 데이터섹션의 execute 와 관련하여....
글쓴이: criny333 / 작성시간: 목, 2014/06/12 - 5:30오후
일단 소스는 다음과 같습니다.
**********************************
char cmd[] = "\x55\x5d\xc3";
main(){
(void) (*fun)(void);
fun = cmd;
fun();
}
**********************************
이 소스가 커널 2.6.14.6 에서는 실행이 됩니다...물론 그 상위 버전 커널에서는 실행이 안되구요...
소스 내용이 데이터섹션으로 eip를 옮겨서 데이터섹션 영역 코드를 실행하는 것인데...
2.6.14.6 해당 커널에서 위 프로그램을 프로세스로 만들고 pmap을 통해서 가상메모리 설정을 살펴보면
cmd 전역데이터가 위치하는 데이터섹션 페이지의 읽기/쓰기 권한은 "rw--"로 나옵니다. "x" 옵션이 없기에 실행이 안되어야 정상인데 말이죠...
무엇이 문제일까요... 커널 버그일까요...? /proc/"PID"/maps 를 읽어올때 분명히 프로세스구조체에서 vm_list를 직접참조하여 읽어 올텐데 말이죠....
Forums:
?
혹시 2.6.14.6 을 어떤식으로 설치하셨는지 알 수 있을까요?
어떤 특정 배포판 버전을 설치하신건지 직접 커널 컴파일 하신건지.
구버전 데비안을 사용하였고, 커널 자체는 따로 컴파일
구버전 데비안을 사용하였고, 커널 자체는 따로 컴파일 하여 사용하였습니다.
?
제가 방금 직접 커널 컴파일해서 실행을 해보았습니다만 예상했듯이 실행이 되지 않습니다.(SIGSEGV)
물론 maps 파일의 내용만을 믿으면 안될 것이, http://passket.tistory.com/ 에 나와있듯이 이러한 경우도
분명히 존재하기 때문에 확실한 것은 아니나 지금 겪으신 문제는 이것과는 관련이 없어 보입니다.
만약 현재 리눅스를 VM 에서 실행하고 계시다면 VM 이미지라도 받아서 해보고 싶네요.
감사힙니다.
메일 주소를 가르켜 주신다면 네이버 대용량 첨부기능 사용하여서 버츄얼박스 머신 세팅파일과 vdi 가상하드파일 보내드리겠습니다.
?
whitehkchoi@gmail.com 으로 보내주세요.
매일 보내드렸습니다.
매일 보내드렸습니다.
?
전송이 안된 것 같습니다. 아무것도 오지 않았습니다.
다시
다시 보냈습니다.
whitehkchoi@gmail.com
감사합니다.
?
확인 해 본 결과 이 문제 역시 제가 위에 얘기한 http://passket.tistory.com/ 에 있는 내용과
동일한 현상으로 생각됩니다. 이 부분의 경우 저도 아직 정확한 원인 파악을 못하였고 계속 알아보는 중입니다.
현재 이 버전대의 커널에서는 라이브러리 영역 뿐 아니라 바이너리 영역까지 전부 실행 권한이 존재하고
조금 더 높아지는 2.6.35 정도(Ubuntu 10.10 기준) 에서는 바이너리 영역엔 실행 권한이 없지만
라이브러리 영역에는 여전히 실행 권한이 존재합니다.
(위에서 얘기한 것은 모두 maps 상으로는 실행 권한이 없는 것처럼 보입니다.)
그리고 그보다 더 최근 커널에서는 이제 라이브러리 영역도 실행 권한이 없고 maps 와 차이가 별로 없습니다.
저도 아직 왜 이런지는 잘 모르겠습니다.
http://stackoverflow.com/questions/24202190/why-is-it-that-librarys-memory-area-is-executablenot-nx-on-ubuntu-10-10
이런 질문도 올려보았으나 딱히 답변이 없는 상황이라 좀 더 알아봐야 할 것 같습니다.
답변을 기대하셨다면 죄송합니다.
아닙니다. 많은 도움이 되었습니다. 답변 감사합니다.
아닙니다. 많은 도움이 되었습니다. 답변 감사합니다.
해당 버전의 /proc/"PID"/maps 가상 파일시스템 부분 코드와 프로세스 가상 페이지 테이블 구성하는 커널 코드를 살펴본 뒤 답 찾으면 저도 답변 달겠습니다.
댓글 달기