프로세스의 스택 시작 주소를 알아내는 간단한 코드이다.
하지만 이 코드를 컴파일해서 실행해보면,
이처럼 프로세스가 실행될 때마다 프로세스의 스택 시작 주소가 불규칙하게 변한다는 사실을 알 수 있다.
이것을 두고 랜덤 스택이라고 하는 것 같다.
이 글에서는 이러한 랜덤 스택을 disable 하는 방법에 대해 설명하고자 한다.
먼저 랜덤스택이라고 하는 것은 위의 그림에서처럼 /proc/sys/kernel/randomize_va_space의 값에 의해 설정이
되는데, randomize_va_space 값은 0, 1, 혹은 2 값을 가질 수 있다.
0값은 randomization을 diasble하는 옵션이고 1이나 2는 randomization을 수행하게 하는 값이다.
(각 값들에 대한 자세한 설명은 글 맨 밑의 참고주소나 구글에 randomize_va_space로 검색을 해보시라)
그래서, 랜덤 스택을 disable 하려면 단순히 randomize_va_space 값을 0으로 바꿔주면 된다.
echo 0 > /proc/sys/kernel/randomize_va_space
혹은 sysctl -w kernel.randomize_va_space=0 이라고 명령을 내려도 된다.
그리고 다시 맨 처음에 작성했던 sp프로그램을 실행해보면 이번에는 프로세스의 스택 시작 주소가 변하지 않고
동일하다는 것을 알 수 있다.
참고로 방금 한 설정은 일시적으로만 유효하며, 재부팅을 하면 randomize_va_space의 값이 초기값인 2로 다시
돌아가게 된다. 설정 값을 계속 유지하려면 그림에서처럼 /etc/sysctl.conf 파일을 열고 맨 밑에다가
kernel.randomize_va_space = 0
을 추가해주면 된다. 이제 재부팅을 해도 randomize_va_space의 값이 0으로 유지될 것이다.
참고)
랜덤 스택으로 알고 있는 내용인데, 찾아보니 ASLR이라고 Address Space Layout Randomization이라는 기법과
연관이 있는 모양이다.
http://docs.oracle.com/cd/E37670_01/E36387/html/ol_kernel_sec.html
'Linux > 공개글' 카테고리의 다른 글
셸에서 실행할때와 gdb에서 실행할 때 주소가 달라지는 문제 (2) | 2015.02.26 |
---|---|
버퍼 오버플로우 공격 환경 구성 (0) | 2015.02.26 |
gdb 자주 쓰이는 명령어들 정리 (0) | 2015.01.10 |
Couldn't get registers: Operation not permitted (0) | 2015.01.10 |
SetUID, SetGID, Sticky Bit에 대해서 (0) | 2015.01.05 |