Be myself :: '분류 전체보기' 카테고리의 글 목록 (12 Page)

달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'분류 전체보기'에 해당되는 글 116건

  1. 2014.05.04 폰노이만 구조
  2. 2014.05.04 메모리 구조
  3. 2014.05.04 기본구조
  4. 2014.05.04 웹 기본 프로토콜
  5. 2014.05.04 기본 레지스터
  6. 2014.05.04 1.OS의 시작

 

개요

앞서 폰 노이만의 구조에 대해 살펴 보았고, 이제 그러한 구조(Stored program concept) 속에서 프로그램이 어떻게 동작하는지 알아보겠다.

 


테스트 환경 (해당 될시에만)

 

 운영 체제 (OS) : Windows 7

 


 

상세 분석

 

 

 

필자의 그림이 마음에 안들더라도 참고 봐 주었으면 한다.(그림판으로 처음 그린다..) 위의 그림은 컴퓨터 내부 구조를 간략하게 표현한 것이다. 프로그램이 실행 되는 과정에 따라 살펴보자. 

1. 첫번째, fetch

메인 메모리에서 명령어가 순차적으로 I/O bus(address Bus, Data Bus, control Bus로 구성 되어 있다.) 에서 Data Bus를 통해 cpu의 bus interface에 전달된다. 사실 이 과정이 일어나기 전에 가상메모리 기법(페이징 기법)을 통해 프로세스 별로 4G의 메모리를 할당 받고, HDD에 있는 데이터(명령어)들을 가상메모리에 위치 시키는 과정 (windows 에서는 PE구조등의 원리를 통해, linux 에서는 elf[Executable and Linkable Format]를 통해) 이 이루어 진다. 이러한 과정은 다음에 설명 하도록 하자. 

 

2. 둘째, Decode

bus interface에 전달된 명령어는 먼저 레지스터(eip레지스터)에 전달되고, 이 명령어는control unit을 통해 어떤 명령어 인지 해석하는 과정이 일어난다.

 

3, 셋째, Excution

컨트롤 유닛을 통해 해석된 명령어를 실행되는 과정이다. 이 과정은 명령의 종류에 따라 다르다. 산술 처리 명령(사칙연산 등)은 레지스터를 통해 연산하는 과정을 거치고, 명령 흐름 변경 명령(jmp명령등. 이러한 상황은 함수가 리턴 되거나 조건 분기 문(if,while,for문 등)을 통해 일어난다.) 은 pc레지스터에 다음에 실행될 명령어를 넣는 작업을 하고, 데이터를 주고받는 명령의 경우 레지스터와 데이터를 주고 받거나 I/O bus를 통해 데이터를 메인 메모리와 주고 받는다. 

 

4. 클럭

정리하자면, 전체적인 프로그램의 실행 단계는 위의 3단계를 거친다. 하지만 부가적으로 위의 그림에서도 보이듯이, 모니터나 그래픽카드, 마우스, 키보드 등.. 여러가지 장치들이 IO bus에 연결되어 있는 것이 보인다. 이것이 뜻하는 바는 cpu가 메인메모리에서 프로그램의 실행 명령을 읽어 각 모니터에 화면의 픽셀 정보를 뿌려주고나 마우스의 동작을 읽어 변수에 저장하여 프로그램의 흐름을 바꾸거나 하는 등의 과정이 일어나는 것을 의미한다. 하지만 이러한 과정이 오류없이 잘 일어나게 하기 위해선 각 장치간 속도를 맞춰주어야 하는데, 이 때, '클럭'이라는 기법을 도입하게 된다. 

예를 들어

연산장치 -----> BUFFER -----> 출력장치 

이러한 과정이 일어난다고 해보자. 

이때, 연산장치의 속도가 출력장치의 속도보다 더 빠르다고 가정해보자.

그렇게 되면, 출력장치는 버퍼의 데이터를 받아 가져가게 되는데 속도가 연산장치보다 느리기 때문에 buffer가 넘치게 되고 buffer에 들어 오는 데이터는 중첩되어 데이터 손실이 일어나 문제가 발생한다.

출력장치의 속도가 연산장치보다 빠르다고 할 경우 출력장치는 버퍼의 내용을 다시한번 가져가 같은 내용을 두번 출력하는 문제가 발생한다. 이 문제를 해결하기 위해 , CPU는 클럭 신호에 맞추어 연산을 한다.(이러한 원리는 조합 논리회로의 특성을 이용한 것인데 이에 대해선 논리회로 관련 책이나 사이트를 참고하자.)

 

참고 URL 및 도서

뇌를 자극하는 윈도우즈 시스템 프로그래밍 -윤성우

- windows 구조와 원리 -정덕영 

- 뇌를 자극하는 프로그래밍 원리 -한세경

 

Posted by flack3r
|

 

테스트 환경 (해당 될시에만)

 

 운영 체제 (OS) : Windows 7

 


 

상세 분석

 

프로그램을 실행 시킬때, 명령어나 여러가지 데이터들이 프로세스별로 메모리(일반적으로 RAM)에 올라가게 된다. 여기서 프로세스란 컴퓨터에서 실행되고 있는 프로그램으로 간단히 생각해도 좋다. 이 때, 32bit 시스템 기준으로 OS는 가상메모리 4G를 할당하게 된다. 그리고 각 데이터들은  편리성,보안성 등의 이유로 각 세그먼트로 나뉘어 메모리에 올라가게 된다. 이 세그먼트에는 프로그램의 명령어 코드가 있는 코드 세그먼트,초기화된 전역변수나 static변수들이 위치하는 데이터 세그먼트, 초기화 되지 않은 변수들이 위치하는 Bss 세그먼트, 동적 메모리 할당을 위한 힙 세그먼트, 지역변수 들을 위한 스택 세그먼트 등으로 나눌 수 있다. 전체적인 구조를 보고, 각 세그먼트들이 어떻게 동작하는지 살펴 보도록 하자.

 

1. 전체적인 구조 

 

 

 위의 그림에서 보이듯 메모리 영역은 일반적으로 커널영역 1~2기가, 유저영역 2~3기가 가 할당 된다. 여기서 퀴즈를 내겠다. 유저 영역은 각각 프로세스별로 할당 된다는 것은 직관적으로 알 수 있다. 커널영역도 각 프로세스별로 독립적으로 할당 되겠는가? 답은 커널영역은 프로세스가 공유하며 같이 사용한다. 지금부터 각 영역이 어떤영역인지 설명을 하겠다.

 

2. 코드영역(code segment)

 

여기는 instruct code가 위치하게 되며, 읽기만 가능하고 쓰기는 불가능하다.

 

3. 초기화된 데이터영역, 초기화 되지 않은 데이터 영역,stack 영역(data segment,bss segment,stack segment)

 

말 그대로 처음 초기화된 데이터가 저장되는 영역이다. 초기화된 전역변수나 static 변수는 data segment에 저장되고 초기화 되지 않은 전역변수나 static변수는 bss segment에 위치한다. 그렇다면 지역변수는 어디에 위치할까? 지역변수들은 stack 영역에 함수의 호출과 반환의 과정에 있어서 데이터가 저장된다. 이 부분은 그림을 통해 살펴보자.

 

 

위의 코드는 전역변수 global과 지역변수 local을 3으로 초기화 하고, notdeclare변수를 초기화 하지 않은 상태로 선언한 간단한 코드이다. 이 코드가 어떻게 어셈블리로 변한되어 지는지 살펴 보겠다.

 

 

 

위의 그림은 main함수 부분을 diassemble한 것이다.  빨간색 박스로 표시된 부분을 살펴 보면, [ebp-4] 부분에 3이 저장되어 지는것을 볼 수 있다. (local변수의 위치가 왜 [ebp-4]에 있는지는 아직 설명한 적이 없다. 이에 대해선 다음에 설명 하겠다.) 하지만, 전역변수나 초기화 되지 않은  notdeclare 변수는 값이 저장되는 명령어를 찾아 볼 수가 없다. 즉 global변수와 초기화 되지 않은 변수는 특별히 코드를 통해 초기화 되는게 아니라, 이미지(윈도우 에선 exe)가 메모리로 로드되는 순간 이미 data영역과 bss영역에 값이 초기화 되어져 있다는 것, 지역변수의 경우 특정 명령어를 통하여 stack에 로드 되는 것을 뜻한다.

 

4. Heap영역

이 영역은 malloc이나 new등과 같이 프로그래머가 프로그래밍 과정에서 동적으로 메모리를 할당하는 영역이다. 

 

5. Heap영역과, stack 영역

이 두 영역을 제외한 나머지 영역을은 프로그램이 실행되기 전에 이미 결정되어 메모리에 데이터가 고정되어져 있다. 하지만 Heap영역과 stack 영역은 프로그램이 실행됨에 따라 동적으로 바뀌는 영역이기에 메모리상에 어떻게 위치되어져야 하는것이 하나의 이슈가 된다. 두 개의 영역을 어떻게 위치시켜야 메모리를 효율적으로 사용할 수 있을까? 답은 두 개의 영역을 떨어뜨려서 서로 반대 방향으로 메모리를 할당하면 된다. 무슨말인지 그림을 통해 설명 하겠다. 

 

 

위의 그림에서 보듯이 데이터가 메모리에서 동적으로 할당 될때, 서로 겹치지 않게 하기 위해 메모리상에서 위치가 서로 떨어져 있고, 데이터가 할당 될 때도 서로 반대 방향으로(stack은 높은 주소-> 낮은 주소, heap은 낮은 주소->높은 주소) 주소값이 할당 된다. 

 

6. 공유 라이브리 영역

 

공유 라이브러리는 stack영역의 중간 쯤에 위치 하는데 이는 다음 그림을 통해 확인 할 수 있다.

 

 

ldd는 공유라이브러리 의존성 등을 확인할때 쓰는 툴이다. 이 툴을 이용해 아까 작성했던 예제를 살펴보면, libc.so.6이나 /lib/ld-linux.so.2 등의 라이브러리가 스택 영역에 위치해 있는 것을 확인 할 수 있다.

 

그림은 [원본유지로 설정]

 

 

참고 URL 및 도서

그림 참조: http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/PDF_Files/13.pdf


- OOO 도서

 

'컴퓨터구조&OS > OS' 카테고리의 다른 글

5. 보호  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
2. Protected 모드로의 전환  (0) 2014.05.05
1.OS의 시작  (0) 2014.05.04
Posted by flack3r
|

기본구조

Network 2014. 5. 4. 01:51

 

개요

네트워크에 대한 첫 번째 장이라 네트워크가 무엇인지 간략하게만 알고가자.



상세 분석

네트워크(network)는 net에서도 알 수 있듯이, 일종의 '망'이다. 거미줄 처럼 얽혀서 통신이 되는것을 비유적으로 표현한 것이다. 즉, 네트워크는 넓은 의미에서는 '통신'의 전 범위가 될 수 있다. 하지만 우리는 인터넷과 관련해 이야기를 전개해 나갈 것이므로 기본적인 인터넷 네트워크의 구조부터 살펴보자. 

 

 

4개의 호스트와 1개의 라우터로 이루어진 아주 간단한 네트워크 이다. 위에서 보여진 네트워크는 일반적인 집에서도 볼 수 있는 네트워크이다.(공유기1대 + 집 컴퓨터 4대) 이렇게 구성된 네트워크는 각종 프로토콜을 이용해 통신하게 되고, 라우터를 통해 인터넷망(구름모양)에 연결하여 인터넷에 연결되는 것이다. 인터넷과 컴퓨터는 이해가 되는데 라우터는 무엇인가?일단 이 장에선 라우터란 '인터넷을 이어주는 장비' 정도로만 이해하고 있자. 더 정확한 이야기는 이야기를 이어가면서 알아가자. 

 

 

'Network' 카테고리의 다른 글

pcap 파일 카빙  (0) 2015.03.19
Posted by flack3r
|

웹 기본 프로토콜

web 2014. 5. 4. 01:50

*네이버 블로그에서 쓴 글을 옮기다 보니 그림이 자꾸 깨지네요.. 뭐 일일이 그림 다시 올릴순 있는데 귀찮으니.. 궁금한 사람들은 http://blog.naver.com/rladudwls321/100209246473에서 보시길. 

 


개요

인터넷의 기반이되는 tcp의 3way-hands shaking 의 방식과 http의 프로토콜 작동원리를 파악하고, 관련 워게임을 풀어 보면서 기반을 다져보자. 


테스트 환경 (해당 될시에만)

 

 운영 체제 (OS) : Kali linux

 


 

상세 분석

HTTP(Hypertext Transfer Protocol) 프로토콜은 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트의  어플리케이션 기반의 프로토콜이다. Tcp/ip 위에서 동작한다.  따라서 http프로토콜을 제대로 알기 위해선 tcp 의 동작 원리를 알아야 한다. 지금부터 tcp동작 원리에 대해 파악해 보자.

 

 

 

 

위 그림은 tcp의 3way handshake과정을 보인다. 참고라 tcp통신과정은 4계층(세션 계층)위에서 일어나는 과정이다. 처음에 클라이언트 가 서버로 seq 값과 함께 SYN 패킷을 보낸다. 그럼 서버는 정상적으로 패킷을 잘 받았다며 SYN패킷과 ACK패킷을 클라이언트가 준 seq값+1(그림에서 1201), 자신이 설정한 seq값(그림에서 4800)과 함께 클라이언트에게 보낸다. 그 이후 클라이언트는 또 서버의 값을 잘 받았다며 seq값을 1 더한 후 ACK패킷과 함께 서버에 보낸다. 글로 표현하니 쫌 복잡하지만, 그림과 함께 이해한다면 그다지 어려운 개념은 아니다.

 

그렇다면 이러한 프로토콜 위에 HTTP프로토콜은 어떻게 동작하는가? 

간단하다. 클라이언트에서 서버로 request요청을 하고 서버는 클라이언트에 대한 반응으로 response 할 뿐이다. 

 

 

좀 더 자세히 설명하자면, 브라우저로 구글의 index페이지를 구글서버로 요청을 하고, 구글의 서버는 브라우저로 구글 페이지를 전송해 준다. 그리고 관련 이미지등이 페이지에 링크되어 있으면 브라우저는 구글서버에 이미지 파일을 요청하게 되고 구글은 파일이 있으면 전송해 준다. 

 

이 때, HTTP방식은 connectless 방식으로 동작하는데 이 방식은 서버에 연결하고, 요청한 응답을 받으면 연결은 끊는 방식이다. 이러한 특징을 stateless라 한다. 이 방식의 장점은 1서버를 여러 클라이언트가 이용할 가능성이 늘어나는 것이다. 서버도 하나의 제한된 자원이기 때문에, 서버에 요청이 많아지면 제한된 요청 외의 것은 응답을 받지 못한다. 단점은, 예를들어 로그인 문제를 들면 앞서 로그인을 했는데 응답을 끊고 연결하면 세션을 유지할 수 없는 문제가 생긴다. 따라서 이러한 단점을 쿠키 등을 이용해 해결하고 있다. 

 

HTTP프로토콜에서 클라이언트가 Request하는 방식은 여러가지가 있다. 요청 데이터는 헤더부분과 바디부분으로 구성된다.

  GET : 정보를 요청하기 위해 사용하는데 관련 인자들의 값이 URL에서 보여 보안상 취약하다.

  POST : GET방식과 달리 데이터의 바디부분에 인자값들이 전달되어 서버에 데이터를 요청하게 된다.

  PUT : 정보를 업데이트하기 위해서 사용한다. 

  DELETE : 정보를 삭제하기 위해서 사용한다. 

  HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다. 

  등이 있다.


이러한 개념들을 워게임을 통해 확인하자. http://www.suninatas.com/ 의 16번 문제이다.




suninatas의 멤버를 위해 패스워드를 찾아 달라는 문제다.

다운로드한 파일은 .pcap파일이다. 이것은 네트워크패킷을 잡은 파일이다. 아마 SuNiNaTaS 멤버가 로그인을 시도한 패킷을 잡은것이라 짐작된다. 따라서 문제의 해결책은, 패킷 분석툴로 패킷을 분석하여 GET또는 POST로 서버에 로그인을 요청하는 부분을 잡아내고 패스워드와 아이디를 획득한 다음 키값을 얻으면 될것 같다.  패킷 분석툴은 여러가지가 있겠지만 필자는 WireShark로 덤프해 보겠다. 

 

파일을 오픈한 화면이다. 로그인한 패킷을 확인해야 하므로 tcp위에 작동하는 프로토콜을 포면 된다. 따라서 analyze-displayfilter-tcp 를 선택한다. 

 

 

빨간색 테투리 안을 보면 위에서 보았던 tcp 3-wayhandshake과정이 그대로 나타나 있다. 이제 서버에 로그인을 요청하는 GET또는 POST부분을 찾아 보자.

 

 

사진에서 보이듯이, /member/mem_action.asp 에 POST요청을 하고, 그 데이터의 body 부분에 id와 pass워드 값이 써져 있다. 좀 더 살펴보면 여러번의 로그인 시도가 있음을 확인 할 수 있고 그때마다 로그인 요청을한 id와 pass값을 이용하여 key값을 획득하면 되는 문제다.  풀이 방법을 설명하였으니 나머지는 직접 풀어보기 바란다.



'web' 카테고리의 다른 글

blind injection tool  (0) 2014.12.03
Sqli 기본 패턴  (0) 2014.11.27
DNS서버 zone 설정  (0) 2014.11.25
test page 만들기  (0) 2014.07.20
Posted by flack3r
|

기본 레지스터

Reversing 2014. 5. 4. 01:48

 

개요

8086내부에서 사용하는 대표적인 레지스터들을 알아볼 것이다.

 

상세 분석

지금부터 대표적으로 사용되는 레지스터들을 알아 볼 텐데, 사실 여기에 정리한 내용은 대략적으로 익히고 디버그나 리버싱, 취약점분석 등 필요할때 마다 검색이나 서적을 통해 참조하다 보면 자연스럽게 익혀질 것이므로 억지로 외우려거나 할 필요는 없다고 생각한다. 32bit 시스템 기준이다. 

 

 

 

EAX- accumulator register라고 해서 산술,논리 연산의 중심이 되는 레지스터이다. 또 하나 중요한 역할을 하는데, 셸코드 작성시 시스템콜 번호를 넘기는 역할을 하기도 한다. 

EBX- 간접 번지 지정시 사용되는 레지스터이다. 베이스 레지스터로 주로 사용된다. 쉽게 말하자면 이 값을 참조해서 원하고자 하는 값을 참조하는 방식이다. 

ECX- counter register로 for문이나 while문 같은 루프문에서 반복수행하고자 하는 횟수를 지정할때 주로 사용된다. 

EDX - 곱셈이나 나눗셈 등의 보조 어큐뮬레이터로 사용되기도 한다. 

 

위의 4가지 레지스터에 대한 설명은 일반적인 쓰임이 그렇다는 것이지, 반드시 위의 용도로만 쓰이는 것은 아니다. 레지스터는 단지 값을 저장하는 메모리일 뿐이라는 사실을 기억하기 바란다. 

 

ESP(스택포인터)와 EBP(베이스 포인터)같은 경우는 스택프레임이 만들어 지는 과정을 다음에 살펴보면서 더 자세히 알아 보겠다. 간단히 설명하자면, EBP같은 경우, 지역변수의 참조를 위해 사용되고, ESP같은 경우 스택프레임의 제일 위의 주소값을 나타낸다. 

 

ESI, EDI - 연산이나 간접 번지 지정에 사용된다. 그밖에 주로 문자열 전송이나 비교 등을 하는 문자열관련 명령에서 SI는 source(대상)가 되는 문자열을, DI는 destination(목표)가 되는 문자열의 번지를 표시한다. 

 

이 외에는

EIP- 다음에 실행할 명령어 번지를 가리키는데, CS세그먼트 레지스터와 한 쌍이 되어 실행 번지가 만들어진다. 예를들어 0x0001[0x0003] 이라는 간접주소가 있으면 0x00010은 CS세그먼트에, 0x0003은 EIP에 저장되어 두 값을 더하여 실제 물리주소값을 나타 낸다. 

 

 

참고 URL 및 도서

-그림 seednote.tistory.com

 

'Reversing' 카테고리의 다른 글

인라인 패치  (0) 2014.05.11
Upack 분석중 정리  (0) 2014.05.10
UPX압축 디버깅  (0) 2014.05.09
IAT와 EAT  (0) 2014.05.08
PE구조  (0) 2014.05.08
Posted by flack3r
|

 

  1. 1. 개요

지금부터 전반적인 OS커널에 대한 이야기를 할 것이다. 이론중심이 될 것이고 관련 소스나 실습을 원하시는 분들은 따로 자료를 참조하시기 바란다. MBR부터 시작하자.

 

  1. 2. MBR이란?

 

MBR이란 무엇일까? 컴퓨터가 처음에 부팅을 시작하면 각종 하드웨어들에 대한 체크들을 한다. 잘 작동하는지부터 시작해 마더보드 상태 체크, 각 장치가 잘 연결되어 있는지 등 이것저것 확인한다. 제일 마지막으로 사용자가 부팅영역으로 사용할 영역이라 정해놓은 디스크의 512바이트의 프로그램을 램으로 읽어 들여 실행하게 된다.

 

뭔가 이상하지 않은가? 겨우 512바이트의 프로그램만 로딩해선 OS라 부를만한 기능(멀티 테스킹, 파일 시스템관리, 네트워크 등)을 수행할 수 없을 것 같다. 해법은 초기 512바이트의 프로그램에서 OS커널 프로그램을 로드시키는 방법이다. 그래서, MBR영역은 초기 첫 매듭을 매는 역할을 한다. 따라서 이를 부트스트랩이라 부르기도 한다. 왜 부트스트랩인가? 부츠를 신을 때 밑에서 쭉 지퍼를 올리는 것을 연상하기 바란다… 마음에 안드는가? 필자도 부트스트랩이란 용어가 직관적이지 않아 마음에 들지는 않지만 별수 없다. ㅠㅠ

 

지금까지의 내용을 정리 하자면, MBR영역이 OS가 메모리에 로드되는 첫 단추이다. 이 MBR영역의 511바이트와 512바이트엔 0x55 0xaa 라는 값이 입력되어야 한다. 왜냐하면 BIOS가 마지막 512바이트를 로드 할 때 이 부분을 보고 이 프로그램이 MBR인지 아닌지를 판단하기 때문이다. 이상의 과정을 그림으로 확인하겠다. 1번 과정은 디스크의 MBR영역으로, BIOS가 프로그램을 읽어 들인다. 그 다음 2번에서 MBR에서 읽은 영역을 실행시켜 다음 프로그램을 3, 4번에서 램으로 가져오는 과정이다.


'컴퓨터구조&OS > OS' 카테고리의 다른 글

5. 보호  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
2. Protected 모드로의 전환  (0) 2014.05.05
메모리 구조  (0) 2014.05.04
Posted by flack3r
|