[완료] 같은 프로그램을 돌릴때마다 brk(0)이 달라지는 이유는?
같은 프로그램을 수행할때마다, malloc으로 할당되는 변수의 주소가 늘 바뀌는 이유를 찾고 있습니다.
strace로 프로그램을 돌려봤더니, 같은 프로그램이라도 돌릴때마다 sbrk(0)가 다른값이 나오네요.
그러다보니, 작은 크기를 malloc하는 경우는 주소가 달라지네요. (아래 예제 참조)
task마다 주소 공간이 별도로 관리되는것으로 아는데, 어째서 이런건지, 아시는분의 조언 부탁드립니다.
1 #include
2 #include
3
4 char *cp[1024];
5
6 int main( void )
7 {
8
9 int i=0;
10 unsigned long* heap = (unsigned long *)sbrk( 0 );
11
12 printf( "sbrk(0)= %p\n", heap );
13
14 for( i=1; i<1024; i*=2 ) {
15 cp[i] = (char *)malloc( i*1024 );
16 if( !cp[i] ) {
17 perror( "malloc" );
18 exit( -1 );
19 }
20 printf( "%p, ", cp[i] );
21 }
22 printf( "\n" );
23
24
31 return 0;
32 }
[chunmok@raf temp]$ a.out
sbrk(0)= 0x94a1000
0x94a1008, 0x94a1410, 0x94a1c18, 0x94a2c20, 0x94a4c28, 0x94a8c30, 0x94b0c38, 0xf6fbe008, 0xf6f7d008, 0xf6efc008,
[chunmok@raf temp]$ a.out
sbrk(0)= 0x8847000
0x8847008, 0x8847410, 0x8847c18, 0x8848c20, 0x884ac28, 0x884ec30, 0x8856c38, 0xf6fbe008, 0xf6f7d008, 0xf6efc008,
OS 맘이 아닐런지..
sbrk(0)가 data 영역의 끝부분인데, OS가 항상 똑같은 가상 주소에다가 프로그램을 올려놓지는 않겠죠..
늘 같은 주소로
늘 같은 주소로 코드나 데이타를 올리지 않나요?
malloc으로 할당된 주소가 아닌 전역 변수들은 address를 찍으면, 늘 같게 나오던데요?
즉, heap에 해당하는 주소만 바뀌는것 같더라구요.
전역 변수 주소는 늘 같고, data와 bss 크기도 늘 같을텐데, 어째서 brk(0)이 다르게 나오는지 모르겠다는 거죠.
보안 문제 때문에...
요즘 OS는 종류에 따라서 보안을 위해 같은 프로그램이라도 시작할 때마다 address map을 랜덤한 시작주소로 만드는 기능이 있다고 들었습니다. 그러면 프로그램에 버그가 있어도 이를 이용한 크래킹이 더 어려워지겠죠.
그런가 보네요...
커널 2.6.9기반 x86머신에서 테스트했을때는 sbrk(0)가 다른 주소들로 다르게 나왔는데,
커널 2.4.20기반 x86머신에서 테스트했더니, 언제나 같은 주소가 나오네요.
ARM 머신에서는 2.6.17에서도 sbrk(0)은 언제나 같은 주소네요.
커널 2.6에서 보안 문제로 추가된 기능인듯 싶은데, CPU마다 다른것 같네요.
댓글 달기