336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

메모리 구조의 이해 




메모리에서 고려해야 할 사항 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
Posted by af334