우리집에 GDB 있는데… 메모리 보고갈래? (1)

  • 들어가기에 앞서…

컴(존)알못들이여 오라.
보안 공부하다 높다란 진입장벽 앞에서 좌절하신 분들께 이 글을 바칩니다.
해커가 되겠다는 청운을 안고 대학을 입학했으나.. 4년째 뉴비..★
컴알못인 제가 자세히 친절하게 하나하나 꼭꼭 씹어보겠습니다.


season 1. 우리집에 gdb 있는데… 메모리 보고갈래?

Day #1. 듀근듀규뉸구누균ㄱ 첫만남

 

gdb-memory-day1-inro

구체적으로  뭐하는지가 궁금하시다구여?

…뭘 하더라도 기초가 중요한 것 같네요.

메모리에 대한 썰부터 간단히 풀어볼게요!!

gdb-memory-day1-1
[그림 1] 썰 주제 되십니다

 

1. 주소는 왜 때문에 0000 0000 ~ FFFF FFFF ???

램은 몇 기가 쓰세여?
제 노트북은 4GB의 램을 쓰고 있네요.

gdb-memory-day1-1
[그림 2] 이런거 은근 헷갈리지 않음요?

위의 계산에 의하면 4GB는 2^32 byte 사이즈의 메모리죠.

1Byte는  주소공간 한 개의 크기입니다
즉, 4GB는 2^32개의 주소를 가질 수 있어요

그리고 1bit는 0 또는 1의 값만 가질 수 있기 때문에 32bit는 2^32만큼의 숫자를 표현할 수 있어요

32bit라는 것은 2^32개의 주소를 가지고 있다라는 뜻으로 이해하시면 됩니다!

그런데 우리가 메모리를 뭐로 접근합니까? 주소로 접근 하죠.
32bit 운영체제는 수 표현을 최대 2^32까지 밖에 못 하기 때문에,  8GB나 16GB의 램을 가지고 있다고 하더라도 접근을 할 수가 없어요.

0000…0000(32개) 부터  1111….1111(32개) 까지를 보기 편하게 16진수로 변환하면?

00000000 ~ FFFFFFFF !


 

2. 유저 영역, 커널 영역은 왜 나뉘어져 있나

시스템 운영에 필요한 메모리, 그리고 운영체제가 커널 영역에 올라가 있습니다.
사용자가 운영체제가 올라가 있는 커널 영역에 마음대로 접근할 수 있다면…? 시스템이 안정적으로 운용될 수 없을거예여.

그렇기 때문에 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널영역을 나누어 사용하는 겁니다. 나누는 크기는 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수도 있어여.


 

3. 유저 영역의 메모리

유저 메모리의 영역을 조금 더 자세히 살펴볼까요?

gdb-memory-day1-3
[그림 3] 안녕하새오 웬만한 기본서 펼치면 2n 페이지 쯤 있는 친구애오
3-1. 코드영역

일단 메모리에 코드가 올라옵니다. 코드가 뭐냐구요?

gdb-memory-day1-3
[그림 3] 네 바로 이겁니다
이런거 어디서 많이 봤죠?  c소스를 컴파일하면 어셈블리 코드로 번역(?)되잖아요. 이 저급한 애들이 코드 영역에 올라 간다는 거져ㅎㅎ
주소보면 32bit 시스템에서 익숙한 0804~로 시작함다. 메모리에 코드가 올라갈 때 보통 저 영역에 올라갑니다.

 

3-2. 데이터영역

그 다음은 데이터 영역입니다. 전역변수가 이 영역에 로드되는데 항상 동일한 메모리에 위치하게 됩니당.

사용자가 입력하는 값이 전역변수로 정의되어있다고 가정해봅시다.

고정된 메모리 주소 그리고 그 주소에 원하는 값을 쓸 수 있다면?  익스플로잇에 활용될 가능성이 갱장히 높아지겠죠?

여기까지가 고정된 주소에 올라오는 영역입니다.

 

3-3. 힙영역

힙 영역은 동적으로 메모리를 할당하여 사용하는 공간입니다.
대표적인 메모리 할당 함수로는 malloc 이 있죠. malloc으로 필요한 공간을 할당하면 힙 영역을 쓰게 되는겁니다. 쓰다가 필요 없어지면 해제 해주면 되죠.

이 말인 즉슨 내가 힙 영역에 어떤 값을 엄청 많이 뿌려놓고 free 해준 후
다시 이 공간을 재사용한다면..? 후.. 뭔가 익스플로잇할 때 낭낭히 활용될 거 같죠?

후.. 방금 당신은 UAF를 배웠습니다. <

 

3-4. 스택영역

마지막 두둥 (유저영역) 메모리의 가장 바닥부터 채워지는 스택이 있죠.
스택은 거꾸로 자라는거 아시져?
왜냐구요?
스택이 끝도없이 위아래도 모르고 자라다가 커널 건드리면…. 주옥되잖아요…
그래서 얘는 거꾸로 자라는 겁니다.
스택영역은 함수인자나 지역변수들이 올라옵니다.
보통 스택 주소보면 0xbfff 이런식이예요.

힙과 스택은 고정된 메모리에 올라오는 것이 아니기 때문에, 이 영역을 활용해 한번에 깔끔하게 쉘 따기란 넘나 어려운 것…

다음 포스팅엔 gdb 활용법으로 찾아오도록 할게여.  메모리 구조를 gdb를 통해 뜯어보는 시간도 가져보도록 하겠슴다.  그럼 뿅★

written by in09


[그림 1] Pictogram(crown) created by Paul Verhulst from Noun Project

[그림 3] Pictogram(book) created by Jakub Caja from Noun Project

우리집에 GDB 있는데… 메모리 보고갈래? (1)”의 28개의 생각

  1. 이후 포스팅이 기대가 되네요.
    강한 약의 기운이 느껴집니다

    좋아요

    1. 헐…사쿠야님..안녕하세여ㅎㅎㅎ
      감쟈합니닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 종종놀러와주세여>_<

      좋아요

  2. 해킹을 소재로 약을 빨수있다는 놀라운 사실에 감탄하고 갑니다

    좋아요

    1. 모리노리님 처음 뵙게씁니다ㅎㅎㅎ 앞으로도 많은 관심 부탁드려용ㅎㅎ

      좋아요

  3. 알랜너굴 2016-03-08 — 7:55 pm

    완전 능력 짱이심다. 계속 보게되는군요

    좋아요

    1. 알랜너굴님 감사합니다!!ㅎㅎ 다른 좋은 글들도 포스팅되고 있으니 기대하고 지켜봐주세요!!

      좋아요

  4. 알랜너굴 2016-03-08 — 7:56 pm

    쭈욱 계속 해주세요

    좋아요

  5. 잼있게 읽고 갑니다. 덕심에도 반했구요 ㅎㅎ

    좋아요

  6. 여기화장실이어디죠

    좋아요

  7. 익스에 활용될 가능성이 크다 에서 익스가 뭐죠??

    좋아요

    1. 안녕하세요 조심해님ㅎㅎ
      익스는 익스플로잇을 말합니당(앞으로는 정확한 용어를 사용하도록 하겠습니다 ㅎㅎ 감사합니다)
      보안 상의 취약점을 공격해 해당 소프트웨어나 하드웨어 등에 권한이 없는 공격자가 의도하는 동작을 할 수 있도록 해주는 거예요ㅎㅎ
      더 정확한 의미는 익스플로잇(exploit)으로 검색하시면 될듯 해요!

      좋아요

  8. 위의 계산에 의하면 4GB는 2^32 byte 사이즈의 메모리죠.
    2^32바이트 크기의 메모리는 0000……0000(32개) ~ 1111……1111(32개) 까지의 주소공간을 가질 수 있어요. 32bit로는 0 부터 2^32까지 표현할 수 있으니까요.

    이 부분이 설명이 약간 애매모호한 부분이 있는것 같네요.
    2^32 바이트 크기의 메모리는 2^32개의 메모리 블럭을 가질 수 있는데(한 바이트가 한개의 메모리 블럭을 의미함) 따라서 0부터 2^32-1 까지 2^32개의 주소값 (결과적으로는 0000……0000(32개) ~ 1111……1111(32개) 까지의 주소공간의 주소공간을 말하지만)을 가질수 있겠네요.
    하나의 bit가 0 1 만 나타 낼 수 있다는것과 8bits = 1byte 라는 사실을 알고 있는 사람이라면 중간에 설명을 보다가 왜 byte인데 저렇게 표현하게 되는지 혼란스러울것 같아 댓글 남겨봅니다.

    Liked by 1명

    1. 감사합니다 Hello님!!
      설명에 아쉬운 점이 있었네요ㅎㅎㅎ 이런 피드백 매우매우 환영합니다!!
      다음에 또 뵈어요~

      좋아요

  9. 어셈블리로 작업한지가 25년전이데… 요즘은 가상화나 세그먼트는 안하는모양이죠

    좋아요

  10. ㅋ 딱 글쓴거보고 누군지 알 것 같지만 ㅎㅎ 온라인 상에서는 밝히지 않는걸로
    ㄱㅇ아 글 잘봤다잉 ㅎㅎㅎ 화이팅~~ ^^

    좋아요

  11. 질문이 있습니다! 스택이 거꾸로 자란다고 하셨셨는데
    높은주소에서 낮은주소로 자라는것 아닌가요?
    만약 0x00000000이랑 0xffffffff두개가 있으면 0xffffffff이 제일 높은주소가 아닌가요? ㄷㄷ

    좋아요

    1. 네! 높은 주소에서 낮은 주소로 자라나는 것이 스택입니다ㅎㅎ
      0xFFFFFFFF가 높은 주소 이지요!
      하지만 유저영역에 스택이 존재하기 때문에 0xBFFFxxxx의 주소부터 스택이 할당되겠죵?

      좋아요

  12. 친절한(?) 어투에 나도모르게 벌써 다 읽었네요. 앞으로 기대되요!

    좋아요

    1. 더욱 더 친절하고 자세하게 떠먹여드리겠습니닼ㅋㅋㅋㅋㅋ기대해주세요>.<

      좋아요

  13. 재미있고 쉬운 설명 감사합니다~ 기대됩니다~ 계속 구독예상ㅎㅎ

    좋아요

  14. 재미있고 쉬운 설명 감사합니다. 앞으로 계속 구독할듯요~

    좋아요

  15. C 공부하면서 struggling 하고 있는데 (스택이 특히 ㅠㅠㅠ ) 쉽고 재밌게 풀어주셔서 잘 읽고 가요! 다른 글도 쭉 읽어보겠습니다 ㅎㅎ

    좋아요

    1. 네에~~ 많은 관심 부탁드려욧!

      좋아요

  16. 쉘딴다는게…관리자 권한을 획득한다…라는건가요..?(초보라 용어부터 막히네요ㅠ)
    대체로 이해가 가는데(와.. 감사합니다 엉엉)
    3-3에서 UAF???힙에 뭔가를 많이 뿌려두고 free해준 후 이 공간을 재사용하면 익스플로잇에 잘 사용될거라고 하셨는데 이게 이해가 잘 안가요ㅜㅜfree해주고 다시 그 공간 받아도 어차피 자기가 사용했던 공간 아닌가요…??잠깐 떠났다가 돌아오는 사이에 뭔가 다른게 생기는건가요?

    좋아요

    1. 쉘을 딴다는 것은 프로그램의 취약점을 이용해 쉘을 실행하는 것을 의미합니다 :) 특히 관리자(혹은 취약점이 있는 프로그램의 소유자)의 쉘을 실행시키는 것을 의미하기 때문에, 관리자의 권한을 얻는다고 표현하기도 합니다.
      UAF 에 대한 이야기는 차후 포스팅에서 다루도록 하겠습니다 :)

      좋아요

  17. 너무 재밌게 설명을 잘해주셨네요 감사합니다. ㅎㅎㅎ

    좋아요

  18. 요즘 컴퓨터들은 대부분 64bit라서 8GB램을 쓰는군여~! 순간 당황~! 그러면 16GB사용하는 컴퓨터는 128bit를 사용하는가여???

    좋아요

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다:
search previous next tag category expand menu location phone mail time cart zoom edit close