메모리 주소
보통 노트북은 4GB의 램을 쓰는데,
4GB를 Byte 단위로 변환하면 2^32Byte이다.
그리고 1Byte는 주소공간 한 개의 크기이다.
즉, 4GB는 2^32개의 주소를 가질 수 있다.
또 한편, 1 bit는 0 또는 1의 값만 가질 수 있기에 32bit는 2^32만큼의 숫자를 표현할 수 있다.
32 bit 라는 것은 2^32개의 주소를 가지고 있다라는 뜻이다.
따라서 32bit 운영체제는 수 표현을 최대 2^32까지 밖에 못 하기 때문에, 8GB나 16GB의 램을 가지고 있다고 하더라도 접근을 할 수가 없다.
0000…0000(32개) 부터 1111….1111(32개) 까지를 보기 편하게 16진수로 변환하면?
00000000 ~ FFFFFFFF이다!
유저 영역, 커널 영역
시스템 운영에 필요한 메모리, 그리고 운영체제가 커널 영역에 올라가 있다.
사용자가 운영체제가 올라가 있는 커널 영역에 마음대로 접근할 수 있다면, 시스템이 안정적으로 운용될 수 없을 것이다.
그렇기에 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널영역을 나누어 사용한다.
나누는 크기는 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수도 있다.
유저 영역의 메모리
코드 영역
c 파일을 컴파일하면 어셈블리 코드로 바뀌는데, 이런 low-level language가 코드 영역에 올라 간다.
데이터영역
전역변수가 이 영역에 로드되는데 항상 동일한 메모리에 위치하게 된다.
고정된 메모리 주소 그리고 그 주소에 원하는 값을 쓸 수 있기에 익스플로잇에 활용될 가능성이 높다.
여기까지가 고정된 주소에 올라오는 영역이다.
힙 영역
힙 영역은 동적으로 메모리를 할당하여 사용하는 공간이다.
대표적인 메모리 할당 함수로는 malloc가 있는데, malloc으로 필요한 공간을 할당하면 힙 영역을 쓰게 된다. 쓰다가 필요 없어지면 해제 해주면 된다.
힙 영역에 어떤 값을 엄청 많이 뿌려놓고 free 해준 후 다시 이 공간을 재사용하므로써 익스플로잇할 때 활용된다.
스택 영역
마지막은 (유저영역) 메모리의 가장 바닥부터 채워지는 스택이 있다.
스택은 거꾸로 자라는데 그 이유는 커널이 밑에 있기에 건드리지 않도록 하기 위해서이다.
스택영역은 함수인자나 지역변수들이 올라온다.
힙과 스택은 고정된 메모리에 올라오는 것이 아니기 때문에, 이 영역을 활용해 한번에 쉘을 획득하기란 어렵다.
참고
https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/
'Hacking > Pwnable' 카테고리의 다른 글
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (3) 정리 (0) | 2021.03.13 |
---|---|
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (2) 정리 (0) | 2021.03.12 |
[Pwnable] ASLR (0) | 2021.03.11 |
[Pwnable ] NOP Sled 실습 (0) | 2021.03.11 |
[Pwnable] RTL 실습 (0) | 2021.03.07 |