[완료] 같은 프로그램을 돌릴때마다 brk(0)이 달라지는 이유는?

chunmok의 이미지

같은 프로그램을 수행할때마다, 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,

익명 사용자의 이미지

sbrk(0)가 data 영역의 끝부분인데, OS가 항상 똑같은 가상 주소에다가 프로그램을 올려놓지는 않겠죠..

chunmok의 이미지

늘 같은 주소로 코드나 데이타를 올리지 않나요?

malloc으로 할당된 주소가 아닌 전역 변수들은 address를 찍으면, 늘 같게 나오던데요?
즉, heap에 해당하는 주소만 바뀌는것 같더라구요.

전역 변수 주소는 늘 같고, data와 bss 크기도 늘 같을텐데, 어째서 brk(0)이 다르게 나오는지 모르겠다는 거죠.

jick의 이미지

요즘 OS는 종류에 따라서 보안을 위해 같은 프로그램이라도 시작할 때마다 address map을 랜덤한 시작주소로 만드는 기능이 있다고 들었습니다. 그러면 프로그램에 버그가 있어도 이를 이용한 크래킹이 더 어려워지겠죠.

chunmok의 이미지

커널 2.6.9기반 x86머신에서 테스트했을때는 sbrk(0)가 다른 주소들로 다르게 나왔는데,
커널 2.4.20기반 x86머신에서 테스트했더니, 언제나 같은 주소가 나오네요.

ARM 머신에서는 2.6.17에서도 sbrk(0)은 언제나 같은 주소네요.

커널 2.6에서 보안 문제로 추가된 기능인듯 싶은데, CPU마다 다른것 같네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.