메모리 구조의 이해
메모리에서 고려해야 할 사항 2가지
1. 속도 문제
ex)
CPU -> 1 의 처리 속도
메모리 -> 10 의 처리 속도
하드디스크 -> 100 의 처리 속도
-> CPU와 메모리, 하드디스크간의 처리속도를 메워주는 역할 -> cache
2. 메모리 용량 문제
주로 4G byte
해결 -> 1. 페이징 기법 (pagefile.sys)
-> 필요한것, 보고싶은 것만 꺼내쓰는 것
-> 필수적으로 필용하지 않는 데이터들을 페이징 파일에 가상주소와 함께 맵핑시켜 놓고
차후에 필요시 참조하여 사용
-> 숨김파일, 보호된 파일 보이게 옵션 해제 -> C:\ 에서 pagefile.sys 확인
2. 가상메모리
-> 주어진 메모리만으로 부족하기에 하드디스크의 일정 용량을 메모리 용량인것 처럼 사용
-> 주어진 메모리 이상을 써야 할 때, 가상으로 구성
-> 가상 메모리의 stack을 가지고 공격 가능
-------------------
리눅스 (4gb)
커널 (1gb)
유저 (3gb)
윈도우 (4gb)
커널(2gb)
유저(2gb)
커널모드 / 유저모드
1. 안정성
2. 보안성
커널모드 : 시스템 OS 코드가 로드되는 부분 -> 건드릴수 없게 되어있는 부분
유저모드 : 유저가 실제로 사용하는 부분 -> stack, heap 영역 포함
-> stack, heap overflow 공격 가능
application 메모리 구조
모든 어플리게이션은 컴퓨터에 설치된 RAM의 양에 관계없이 4gb의 메모리 address 공간을 가지는
컴퓨터에서 실행중인 것 처럼 동작한다
프로그램을 동작시키면 메모리에 프로그램이 동작하기 위한 가상의 메모리 공간이 생성되며
이 메모리 공간은 다시 그 목적에 따라 상위, 하위 메모리로 나뉨
-----------------------------------
stack - 지역변수, 인수(인자), 리턴
-> 90%의 오버플로 공격 대상
heap - 프로그래머가 할당하는 공간
-> 10%의 오버플로 공격 대상
-----------------------------------
데이터
bss - 초기화되지 않은 전역변수, 문자열, 기타 상수가 저장
data - 전역변수, 정적변수(static) 등으로 선언된 변수 영역
-> 전역변수는 초기화 되고, 안 되고의 차이가 있음
-----------------------------------
코드 영역 / text 영역
text - 프로그램의 실행코드인 기계어 코드와 읽기 전용 데이터를 가진다.
(코드영역이라고도 함)
-----------------------------------
stack
삽입과 삭제가 한쪽 끝 최상단(top)에서만 이루어지는 유한 순서 리스트 (finite ordered list)
-> 1 MB
-> 공격하기 수월함
-> 많은 공간을 필요로 하지는 않음
-> 쉽게 생각해서 접시 쌓기
-> 높은 주소에서 낮은 주소로 진행됨
-> 후입선출 -> last in first out = first out last in -> LIFO
-> 먼저 들어가고 제일 뒤에 나온다
-> 리스트의 순서를 역순으로 만드는데 유용
top : 스택에서 가장 위에 있는 데이터를 가리킴
push : 스택에서 데이터를 넣는 것
pop : 스택에서 데이터를 빼는 것
overflow : 스택에 push할 공간이 없는 상태일때 push하여 다른 영역을 침법하게하는 것
Q. 순서가 A,B,C,D 로 정해진 입력 자료를 스택에 입력하였다가 출력하는 경우
출력 결과로서 가능하지 않은 것은 ?
1.BDCA
...
-> D,A,B,C
--------------
heap
동적 영역
동적할당의 필요성
1. 사용자와 환경에 따라 차이가 발생
2. 사용자들이 입력하는 데이터 크기를 예견할 수 없다 -> 공간 낭비 우려
-> stack은 정적으로 고정 되어 있음
-------------
어셈블리어의 이해
저급언어와 고급언어
기계어 : 컴퓨터가 직접 이해할수 있는 언어 -> 2진수
-> 처리속도가 빠름
어셈블리어 -> 기계어와 1:1로 대응 -> 기계어에 니모닉 기호를 적용해 사람이 알기 쉽도록 함
-> eax,ebx ....call...
-> 시스템에서는 ESP /EBP를 주요깊게 보아야 함
AT&T -> 리눅스 계열
Intel -> 윈도우 계열 -> 주로 공격 확인
-> 두가지의 차이 -> 연산 방향 -> ---> / <---
-> 부가적인 기호 $%
0x00040305 <main+0> : puxh ebp
주소 메인에서 떨어진 정도
-----------------
소스 분석
#include <stdio.h>
void main(){
int a=30;
printf("he is %d year",a);
}
----
위의 코드 어셈블리어로 분석
push ebp
mov ebp,esp
sub esp 0x8
----> 8 byte만큼의 공간 할당
and esp,0xfffffff0
mov eax,0x0
sub esp, eax
-----> 무시 가능한 부분, 스텍에 영향을 주지 않음 (시스템상 ....)
mov dword [ebp-4], 0x1e
----> 8 byte 할당된 영역을 4byte만 값을 입력 ??
dword -> 4byte -> 0x0000 001e
word -> 2 byte -> 0x001e
byte -> 1 byte -> 0x1e
sub esp, 0x08
-> 8 byte 공간 할당
push dword ptr [ebp-4]
-> ptr 재지정
push 0x8048400
-> printf() 의 문자열 부분, 인자 -> printf("he is %d year",a);
call 0x8048268
-> printf()함수 호출 부분
leave
ret
-> 리턴 address로 돌아감
'System ' 카테고리의 다른 글
basic start of BOF (0) | 2014.09.30 |
---|---|
The instruction for GDB (0) | 2014.09.29 |
war (0) | 2014.09.01 |
race condition (0) | 2014.08.29 |
finding backdoor (0) | 2014.08.28 |