-
리눅스 메모리 구성dream hack/system hacking 2022. 9. 25. 02:26
메모리의 악의적 조작
메모리는 cpu와 밀접한 관련이 있다. 따라서 메모리를 악의적으로 조작을 하면 cpu의 비정상적인 작동을 유발할 수 있다
우리는 위와 같은 상황을 메모리가 오염됐다고 표현한다. 이를 유발하는 취약점을 메모리 오염(Memory corruption)이라고 표현하며 많은 공격기법이 메모리 오염에 기인한다.
화살표와 스택세그먼트의 값이 하얀색 글씨라 지워졌다. 저장해서 .png로 보면 해결됨 메모리 구조
메모리 구조는 위와같은 형태로 이루어져있으며 세그먼트는 프로세스의 메모리를 5개로 나눈 것이며 읽기, 쓰기, 실행 중 각 용도에 맞는 권한이 부여되며 cpu는 부여된 권한의 행위만 실행 할 수 있다.
코드 세그먼트
실행가능한 기계코드가 위치하는 영역으로 텍스트 세그먼트라고도 불린다. 프로그램이 동작하기위해 읽기와 실행 권한이 부여되며 아래의 정수 31337을 반환하는 main함수가 컴파일 되면 554889e5b8697a00005dc3 이라는 기계코드로 변환되는데 이 기계코드가 코드 세그먼트에 위치하게 됩니다.
데이터 세그먼트
컴파일 시점에 값이 정해진 전역변수 및 전역상수를 의미한다. cpu가 이 세그먼트의 데이터를 읽을 수 있어야 함으로 읽기 권한만 부여된다. 데이터 세그먼트는 쓰기가 가능한 세그먼트와 불가능한 세그먼트로 나뉘는데 쓰기가 가능한 세그먼트는 젼역변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다. 이 세그먼트를 data세그먼트라고 한다
쓰기가 불가능한 세그먼트는 실행하면서 값이 바뀌면 안되는 전역상수가 여기에 해당하고 이 세그먼트를 rodata세그먼트라고 한다. 예를 들어 javascripts의 const는 rodata세그먼트 var은 data세그먼트에 해당한다고 볼 수 있다.
BSS 세그먼트
컴파일 시점에 값이 정해지지 않은 전역변수가 BSS세그먼트에 해당하고 자세히 말하면 선언만 하고 초기화를 하지 않은 전역변수가 해당한다. 이 세그먼트의 메모리 영역은 프로그램이 시작될 때 모두 0으로 값이 초기화된다. 이 세그먼트는 읽기 권한 및 쓰기 권한이 부여된다.
스택 세그먼트
스택세그먼트는 프로세스의 스택이 위치하는 영역입니다. 함수의 인자나 지역 변수와 같은 임시 변수들이 여기에 저장됩니다. 스택 세그먼트는 스택 프레임이란 단위를 사용하는데 스택프레임은 함수가 호출될 떄 생성되고 반환할 때 해제됩니다. 따라서 어떤 프로세스가 실행될 때 이 프로세스가 사용하게 될 스택 프레임의 양을 계산하는 것이 불가능하여 프로세스를 시작할 떄 작은 크기의 스택 세그먼트를 할당해 주고 부족할 때마다 확장해줍니다. 스택에 대해서 '아래로 자란다'라는 표현을 하는데 이는 스택이 확장될 떄 기존 주소보다 낮은 주소로 확장되기 때문이다. 읽기와 쓰기 권한이 부여된다
화살표와 스택세그먼트의 값이 하얀색 글씨라 지워졌다. 저장해서 .png로 보면 해결됨 .16진수로 이루어진 주소값 0x0000000이 제일 위에 0x0000001~0xFFFFFFF까지의 주소가 아래로 자라는 형태다.
힙 세그먼트
힙세그먼트는 힙 데이터가 위치하는 세그먼트다. 스택과 마찬가지로 실행중에 동적으로 할당될 수 있으며 리눅스에서는 스택 새그먼트와 반대방향으로 자란다. C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치한다. ##C언어에서는 메모리 주소를 지정해서 값을 저장할 수 있음. 이때 사용하는 세그먼트가 힙 세그먼트임. 일반적으로 읽기와 쓰기 권한이 부여됨 또한 스택 세그먼트와의 충돌을 방지하고자 아래에서 위로 주소가 설정되고 0xFFFFF~0x00000으로 주소가 할당이 된다.
'dream hack > system hacking' 카테고리의 다른 글
x86-64 아키텍처: 레지스터 (0) 2022.09.25 pwngdb-2 (0) 2022.08.16 pwngdb-1 (0) 2022.08.16 Tool: gdb-1 (0) 2022.08.15 GCC이용해서 컴파일 하기 (0) 2022.08.15