우리 집에 GDB 있는데 메모리 보고 갈래? (1)
위 사진이 바로 우리 집에 GDB 있는데 메모리 보고 갈래? (1)에서 다룰 내용의 사진이다. 1에서는 주소, 메모리 영역에 대해서 다룬다.
-Address-
32bit 노트북을 보면 램이 4gb 밖에 없다. 그 이유는 위 사진처럼 4gb 램은 이런 저런 복잡한 수식을 거쳐서 2^32Byte의 주소를 가질 수 있는데, 32bit의 경우 1bit는 0, 1을 가질 수 있으므로 2^32, 즉 최대 2^32 Byte의 주소를 가질 수 있기 때문에 2^32 Byte의 주소를 넘어가게 되는 4gb 초과로는 인식하지 못하는 것이다.
리버싱을 공부해보면 주소가 00000000 ~ FFFFFFFF까지 존재하다는 점을 알 수 있는데, 이는 이진수 주소 0000...(32개) ~ 1111....(32개)를 보기 편하게 16진수로 변환해서 표현해준 것이다.
-유저 영역, 커널 영역-
위 사진을 보면 유저 영역과 커널 영역이 나눠져 있음을 알 수 있다. 위처럼 유저, 커널 영역이 나눠져 있는 이유는 시스템 운영에 필요한 메모리와 운영체제가 올라와 있는 kernel에 사용자가 함부로 접근한다면 시스템이 안정적으로 운용될 수 없기 때문이다.
따라서 영역을 나눔으로써 커널 영역에 실수라도 접근하지 못하도록 하는 것이다.
영역을 나누는 크기는 운영체제 마다 다르고, 설정에 따라 영역의 크기를 조절할 수 있다고 한다.
-유저 영역-
위는 유저 영역에서 다시 나눠져 있는 영역들이다. 코드, 데이터, 힙, 스택 영역으로 나눠진다.
-코드 영역
코드 영역에는 c 코드를 컴파일 했을 때 생성되는 어셈블리 코드 같은 저급 언어가 코드 영역에 올라간다.
-데이터 영역
데이터 영역에는 전역 변수가 로드된다. 이 전역 변수는 항상 동일한 메모리에 위치한다고 한다.
입력 값이 전역 변수라 가정했을 때, 고정된 메모리 주소, 그리고 이 주소에 bof 등으로 원하는 값을 쓸 수 있다면 exploit에 활용될 수 있을 것 같다.(ASLR)
-힙 영역
힙 영역은 c언어에서 배웠던 malloc, free 등으로 동적으로 메모리를 할당 받아 사용하는 공간이다. c언어 코딩도장을 write up 할 때 malloc으로 메모리를 할당 받으면, 일반 변수처럼 스택에 존재하는게 아닌 힙에 존재하게 된다고 했는데, 그 내용이 바로 이 내용이다.(free를 안해주게 되면 메모리가 꽉차서 비정상적인 작동을 한다 했는데, 아마 스택 영역을 침범하거나 커널 영역에 침범하게 되서 그런 것 같다.)
힙 영역에 어떤 값을 많이 뿌려두고 free 해준 후 다시 이 공간을 재사용하면 exploit에 활용된다고 하는데, 아직 힙 관련 공격 기법은 공부하지 않은 터라 잘 이해가 되지 않는다..
-스택 영역
스택은 유저 영역 메모리의 가장 아래부터 채워진다. 흔히 거꾸로 자란다고 말한다.
처음 안 사실인데 스택이 거꾸로 자라는 이유가 스택이 끝도 없이 자라다가 커널 영역을 건드리게 되면 큰 일나기 때문이다.
리버싱을 해봤다면 알 수 있는 사실인데, 스택에는 주로 함수 인자, 지역 변수들이 올라온다.
힙과 스택은 고정된 메모리에 올라오는 것이 아니기 때문에 이 영역을 활용해 한 번에 쉘을 따내기엔(권한 상승) 어렵다고 한다.
원본 링크 : 우리 집에 GDB 있는데.... 메모리 보고 갈래?(1)
'Old (2021.01 ~ 2021.12) > Pwnable' 카테고리의 다른 글
Return Address Overwrite (0) | 2021.07.11 |
---|---|
Buffer Overflow (0) | 2021.07.04 |
[Linux-x86] shellcode 제작 (0) | 2021.06.26 |
우리 집에 GDB 있는데 메모리 보고 갈래? (3) (0) | 2021.03.13 |
우리 집에 GDB 있는데 메모리 보고 갈래? (2) (0) | 2021.03.13 |