2009년 11월 25일 수요일

CPU 레지스터

우선 CPU(Central Processing Unit)는 메모리로부터 명령어를 가져와서(fetch) 어떤 명령어인지 해석하고(decode) 실행하는(execute) 동작을 한다. CPU에 대해서는 리버싱 작업에서 많이 사용되는 레지스터에 대해서만 알아보도록 하겠다.

 

레지스터는 CPU 내부에 존재하는 작은 고속의 메모리라고 할 수 있다. 레지스터의 종류로는 범용 레지스터, 세그먼트 레지스터, 상태 플래그 레지스터, 명령 포인터 레지스터 등이 있다.

 

범용 레지스터

- EAX(Extended Accumulator Register)

곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로도 사용된다.

 

- EBX(Extended Base Register)

ESI나 EDI와 결합하여 인덱스에 사용된다.

 

- ECX(Extended Counter Register)

반복 명령어 사용시 반복 카운터로 사용된다. ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업을 수행하게 된다.

 

- ESI(Extended Source Index)

데이터 복사나 조작시 Source Data의 주소가 저장된다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.

 

- EDI(Extended Destination Index)

복사 작업시 Destnation 의 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.

 

- ESP(Extended Stack Pointer)

하나의 스택 프레임의 끝 지점 주소가 저장된다. PUSH, POP 명령어에 따라서 ESP의 값이 4Byte씩 변한다.

 

- EBP(Extended Base Pointer)

하나의 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않는다. 현재의 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리키게 된다.

 

 

 

명령 포인터

 

- EIP(Extended Instruction Pointer)

다음에 실행해야 할 명령어가 존재하는 메모리 주소가 저장된다. 현재 명령어를 실행 완료한 후에 EIP 레지스터에 저장되어 있는 주소에 위치한 명령어를 실행하게 된다. 실행 전 EIP 레지스터에는 다음 실행해야 할 명령어가 존재하는  주소의 값이 저장된다.

 

 

 

세그먼트 레지스터

- CS(Code Segment)

실행 가능한 명령어가 존재하는 세그먼트의 오프셋이 저장된다.

 

- DS(Data Segment)

프로그램에서 사용되는 데이터가 존재하는 세그먼트의 오프셋이 저장된다.

 

- SS(Stack Segment)

스택이 존재하는 세그먼트의 오프셋이 저장된다.

 

 

 

플래그 레지스터

- CF(Carray Flag)

부호 없는 연산 결과가 용량보다 클 때 세트(1)된다.

 

- ZF(Zero Flag)

연산 결과가 0일 때 세트(1)된다. 연산 결과가 0이 아닐 때 해제(1)된다.

 

- OF(Overflow Flag)

부호 있는 연산 결과가 용량보다 클 때 세트(1)된다.

 

- SF(Sign Flag)

연산 결과가 음수가 되었을 때 세트(1)된다. 연산 결과가 양수가 되었을 때 해제(0)된다.

 

- DF(Direction Flag)

문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트된다.

 

 

부동 소수점 데이터 레지스터

- ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7)

범용 레지스터는 레지스터 이름 첫 글자가 'E' 인 것을 알 수 있다. '확장되었다(Extended)' 라는 의미로 32bit 컴퓨터 환경이 되면서 16bit 레지스터인 AX, BX, CX, DX 등의 레지스터를 32bit로 확장한 것이라고 보면 된다. EAX, EBX, ECX, EDX 레지스터는 32bit, 16bit, 8bit로 사용할 수 있다. EAX 레지스터를 예로 들면 32bit는 EAX, 16bit는 AX, 8bit는 AH, AL로 사용할 수 있다.

 

상위 8비트는 High라서 'H'가 붙고 하위 8비트는 Low라서 'L'이 붙는다고 생각하면 외우기 쉽다.

 

ESI, EDI, EBP, ESP 레지스터는 32bit, 16bit로 사용이 가능하다.

 

출처 : CPU 레지스터

호출 규약(__cdecl, __stdcall)

호출 규약 (Calling Convention)

  1. 함수를 호출하는 방식에 대한 일종의 약속
  2. 인수는 어떻게 전달하며 리턴값은 어떻게 반환하고 인수 전달을 위해 사용한 메모리는 누가 정리할 것인지를 규정함.
  3. 호출하는 쪽과 호출되는 쪽의 약속이 맞아야 한다.
  4. 컴파일러 내부에서 일어난다.


 호출 규약인수 전달스택 정리이름 규칙
 __cdecl 오른쪽 먼저  호출원  _ 함수명
 __stdcall 오른쪽 먼저  함수  _함수명@인수크기
 __fastcall  ECX, EDX에 우선 전달,  나머지는 오른쪽 먼저  함수 @함수명@인수크기
 thiscall  오른쪽 먼저, this 포인터는 ecx 레지스터로 전달된다.  함수  C++ 이름 규칙 따름
 naked  오른쪽 먼저  함수  없음


(1) __cdecl
  1. C 컴파일러 혹은 C++ 컴파일러에서 전역 함수나 전역 static 함수, static 멤버 변수 호출에 기본적으로 사용하는 규약.
  2. 가변 인수를 지원
  3. 리턴값은 eax를 통해서 되돌려 받음.(다른 규약도 동일함)
(2) __stdcall
  1. 윈도우즈 API 함수들의 기본 호출 규약.(비주얼 베이직도 사용)
  2. __cdecl과 인수를 전달하는 방법은 동일하되 인수 전달에 사용된 스택을 정리하는 주체가 호출원이 아니라 함수라는 점이 다르다.
  3. 함수 이름 앞에 __stdcall 키워드를 사용하면 이 함수는 __stdcall 호출 규약을 사용한다.
  4. 가변 인수를 지원하지 않는다.
(3) __fastcall
  1. 인수 전달을 위해 스택을 쓰지 않고 레지스터를 우선적으로 사용하므로 인수 전달 속도가 빠르다
  2. 비주얼 C++은 fastcall을 형식적으로 지원할 뿐 fastcall의 장점을 취하진 않는다.(컴파일러 구현상 ecx, edx 레지스터가 꼭 필요하기 때문임)
  3. 이식성에 불리하다.(ecx, edx 레지스터를 사용하지 않는 CPU에서는 지원 안함)
  4. 볼랜드의 델파이가 __fastcall을 사용함.
(4) thiscall
  1. 클래스의 멤버 함수에 대해서만 적용됨.
  2. ecx로 객체의 포인터(this)가 전달되는 특징이 잇다.
  3. 나머지 규칙은 __stdcall과 동일함.
  4. 예외적으로 가변 인수를 사용하는 멤버 함수는 __cdecl로 작성되면 이때 this는 스택의 제일 마지막에(그러므로 첫번째 인수로) 전달된다.
  5. 이 호출 규약은 컴파일러가 멤버함수에 대해서만 적용하는 것이므로 일반 함수에는 이 호출 규약을 적용할 수 없다.(thiscall 키워드가 아님.)
(5) __naked
  1. 컴파일러가 접두, 접미를 작성하지 않는 호출 규약.
  2. 일반적인 목적으로는 사용되지 않음.
  3. C/C++이 아닌 언어에서 호출하는 함수를 작성할 때 필요함.
  4. 속도가 지극히 중요한 디바이스 드라이버를 작성할 때도 사용함.
  5. __naked 호출 규약을 사용하려면 함수의 정의부에 __declspec(naked)를 적어주면 된다.
(6) 기타(__pascal, __fortran, __syscall)

* __cdecl과 __stdcall의 차이점
  • 누가 스택을 정리하느냐
  • stdcall의 경우 호출된 함수(Callee)가 스택을 정리하기 때문에 호출하는 함수(Caller)와 Callee 모두 파라미터의 크기를 알고 있어야 정상적인 처리가 가능하다.
  • cdecl의 경우 Caller가 스택을 정리하기 때문에 Callee는 파라마티의 크기를 정확히 몰라도 된다.

2009년 11월 21일 토요일

xinetd(eXtended inetd)

xinetd 수퍼 데몬
  • 리눅스 시스템이 부팅될 때 적재되는 서비르 데몬들을 관장하는 수퍼데몬을 xinetd 데몬이라고 한다.
  • xinetd 데몬은 기존의 수퍼데몬인 inetd의 비효율적인 리소스 관리와 보안성 문제를 극복하기 위해서 나온 대체 수퍼 데몬으로 TCP wrapper의 기능을 흡수하고 있어 보안이 강화된 데몬이라고 볼 수 있다.
 

xinetd 데몬의 특징
  • TCP, UDP, RPC 서비스 접근 제어 조절 기능(Access Control)
- 차별적인 접속을 위한 접근 제어 기능 제공
- libwrap 옵션 지원으로 TCP wrapper와 같은 tcpd 제어 기능 제공
- 액세스 타임(Access Time)에 기반한 접근 제한
- 접속 회수 제한
  • 서비스 거부(Denial of Service) 공격 방지
- 접속 한계 회수에 도달 시 서비스 실행을 중지하여 Dos 공격 방지
- 동일한 클라이언트의 동시 접속 제한
- 로그 파일 크기 제한
  • 철저한 로깅(logging) 기능
- 각각의 서비스에 대한 syslog 로깅 레벨 설정
- 클라이언트의 서비스 이용 시간 기록
- 서비스 접속 실패 시 자세한 로그 기록
  • 원격 호스트로 서비스 리다이렉션
  • IPv6 지원


xinetd 설치
  • xinetd 패키지 확인 : rpm -q xinetd
  • xinetd 패키지 설치 : yum install xinetd


원본 주소 : 수퍼데몬 xined

RunLevel

RunLevel (시스템이 가동되는 방법)
 
  • 0 : 시스템 종료 모드
  • 1 : 단일 사용자(루트) 모드(시스템 복구시에 사용)
  • 2 : NFS를 지원하지 않는 다중 사용자 모드(사용 안함)
  • 3 : 텍스트 다중 사용자 모드
  • 4 : 사용 안함
  • 5 : 그래픽 다중 사용자 환경(Default)
  • 6 : Reboot 모드

* 컴퓨터가 부팅될 때의 런레벨은 /etc/inittab 파일에 정의되어 있다.

네트워크 용어(라우터, 허브, 스위치)

라우터 (Router, 경로기)
 - 패킷의 위치를 추출하여 그 위치에 대한 최상의 경로를 지정하며 이 경로를 따라 데이터 패킷을 다음 장치로 전향시키는 장치.
 - 대한민국의 네트워크 환경에서는 여러 회선을 공유한다는 뜻에서 공유기라는 낱말이 라우터와 더불어 흔히 쓰인다.
 - 레이어 3 스위치라는 용어는 라우터 대신 쓰이기도 하지만, 스위치는 기술적 정의가 없는 마케팅 용어일 뿐이다.
 - 시장에 팔리고 있는 라우터는 이더넷 랜 인터페이스에 최적화되어 있으며 다른 물리적인 인터페이스 종류를 가지고 있지 않다.
 - 라우터의 종류
  • 코어 라우터 : 인터넷 서비스 제공자(ISP)의 랜이나 여러 개의 ISP 네트워크를 서로 연결.
  • 센터 라우터 : WAN 회선을 거쳐 회사의 본점과 지점을 서로 연결함.
  • 엣지 라우터 : 지점, 영업점의 네트워크를 WAN 회선에 연결하여 회사의 본점의 라우터에 접근함.
  • 원격 라우터 : 랜과 WAN을 중계함. WAN 라우터라고도 부름.
  • 브로드밴드 라우터 : 가정이나 작은 규모의 기업에서 브로드밴드급의 인터넷에 접속할 때 쓰임.

이더넷 허브 (Ethernet Hub, 망집선기)
 - 이더넷 네트워크에서 여러 대의 컴퓨터, 네트워크 장비를 연결하는 장치.
 - 한 대의 허브를 중심으로 여러 대의 컴퓨터와 네트워크 장비가 마치 별 모양으로 서로 연결되며, 같은 허브에 연결된 컴퓨터와 네트워크 장비는 모두 상호 간에 통신할 수 있게 된다.
 - 허브에 라우터나 Layer3 스위치 등의 장비가 연결되어 있으면 이를 통해 더 높은 계층의 네트워크(WAN, MAN)와도 연결이 가능해진다.
 - 허브와 컴퓨터 장비 사이의 연결에는 보통 UTP 케이블과 RJ45가 사용된다.
 - 허브로 연결된 네트워크에서는 한 컴퓨터에서 주고받는 데이터가 같은 허브에 연결된 다른 모든 컴퓨터에 전달된다. 따라서 연결된 컴퓨터의 개수가 많아질 수록 네트워크에서 충돌(collision)이 많아지고 속도가 느려진다. 이 문제를 해결하기 위해 최근에는 데이터를 필요로 하는 컴퓨터에만 전송하는 이더넷 스위치 장비를 많이 사용한다.
 - 대부분의 허브는 충돌 감지를 위해 반이중 통신방식(Half Duplex)만을 지원하는 데 반해, 대부분의 이더넷 스위치는 전이중 방식(Full Duplex)을 지원한다.
 - 최근에는 이더넷 스위치의 가격하락으로 인해 이더넷 허브는 점차 사라져 가고 있다.


네트워크 스위치 (Network Switch)
 - 네트워크 단위들을 연결하는 통신 장비로서 허브보다 전송 속도가 개선된 것.
 - 간단히 스위치라고 부르는 경우가 많으며, 스위칭 허브(Switching Hub), 포트 스위칭 허브라고도 한다.
 - 스위치의 사용목적은 허브와 유사하지만, 스위치는 훨씬 향상된 네트워크 속도를 제공함.
 - 이는 각 컴퓨터에서 주고 받는 데이터가 허브처럼 다른 모든 컴퓨터에 전송되는 것이 아니라, 데이터를 필요로 하는 컴퓨터에만 전송되기 때문임. 따라서 허브처럼 병목 현상이 쉽게 생기지 않음.
 - 대부분의 스위치는 전이중 통신방식(Full Duplex)을 지원하기 때문에, 송신과 수신이 동신에 일어나는 경우 훨씬 향상된 속도를 제공함.
 - 스위치는 이 기능을 수행하기 위해 각 컴퓨터의 고유한 MAC 주소를 기억하고 있어야 하며, 이 주소를 통해 어떤 데이터가 어디로 전송되야 하는지 판단해야 함.
 - 하지만 스위치를 이용하는 경우도 대량의 동보발송이나 스위치의 처리용량을 초과하는 데이터 흐름에 대해서는 취약할 수 밖에 없으므로 커다란 네트워크의 경우는 VLAN 스위치나 라우터 등을 이용해 네트워크 자체를 분리해야 함.

* 더미 허브와 스위칭 허브
 - 허브의 속도가 100Mbps이고 컴퓨터가 5대 연결되어 동시에 통신한다면 한 컴퓨터는 20Mbps 밖에 이용하지 못한다.
 - 스위치 허브는 위와 똑같은 환경에서 각각의 컴퓨터가 100Mbps의 속도로 정보를 주고 받을 수 있다. 지금 판매되는 IP 공유기에 포함된 허브는 모두가 스위칭 허브이다.



2009년 11월 18일 수요일

Linux 계열 - ubuntu, opensuse, fedora

우분투 (ubuntu)

 - 데비안 기반으로 사용자 편의성에 많은 초첨을 맞춘 리눅스 베포판.
 - kubuntu(KDE 기반), Edubuntu(교육용 베포판)


오픈수세 (open suse)

 - 노벨사가 지원하는 리눅스 베포판


페도라 (fedora)

 - 레드햇 기반
 - Fedora : 무료로 제공, 개발용 pool, 개발 및 테스트를 염두에 두고 만듬.
 - RHEL : Red Hat Enterprise Linux, 유료, 상업적 서비스를 목적


CentOS (The Community ENTerprise Opserating System)

 - 레드햇 엔터프라이즈 리눅스의 소스코드를 그대로 가져와 빌드해 내놓으며 이 과정에서 이루
  어지는 변형은 레드햇의 상표가 잘리고 그 자리에 CentOS의 상표가 붙는(상표권 분쟁을 피하기
  위해) 정도뿐임.
 - 판수 또한 레드햇 엔터프라이즈 리눅스의 판수를 그대로 가져옴.
 - 사용하는 꾸러미 형식은 RPM
 - 최신판은 5.4(2009년 10월 20일 출시)
 - Yum을 통해서 업데이트함. up2date도 지원.
 - 레드햇의 기술 지원은 받지 않음.


PGP, GPG

PGP (Pretty Good Privacy)

PGP(

 - 인터넷의 전자우편을 암호화하거나 복호화시켜 제 3자가 알 수 없도록 하는 보안

  프로그램


 - 1991년 필 짐머맨(Phil Zimmermann)이 개발


 - 전자우편 보안의 사실상의 표준이 됨


 - 전자우편의 내용을 암호 알고리즘을 이용해서 암호화시키므로 암호를 푸는 키(key)

  를 가지고 있어야 전자우편의 내용을 확인할 수 있다.




GPG (Gnu Privacy Guard)

 - GNU 단체가 오픈 소스 프로젝트로 PGP의 모든 기능을 구현해서 만든 것

 - 무료로 배포되고 있음.

 - Gpg4win : 윈도우에서 E-mail 암호화 매커니즘인 GnuPG/PGP를 사용할 수 있게

  해주는 프로그램을 묶어 놓은 베포 패키지




관련 페이지 : GnuPG Homepage, Gnu 설치 및 사용하기

텍스트큐브닷컴 블로그 개설을 축하합니다.

텍스트큐브닷컴 서비스에 가입하신 것을 환영합니다.
회원님은 현재 텍스트큐브닷컴 오픈 베타 서비스 사용자입니다.

이 포스트는 텍스트큐브닷컴 서비스에서 블로그를 만든 이후 처음 보여지는 안내 포스트입니다. 내용을 다 읽으신 이후에는 삭제하셔도 됩니다.
텍스트큐브의 멋진 기능들을 살짝 소개해 드립니다.


보다 쉽고 편리하게 글을 작성할 수 있습니다.


1. 글쓰기 메뉴가 깔끔하게 정리 되었습니다.
2. 멀티미디어 첨부위자드를 도입했습니다.
3. 글쓰기 도중에 자료를 검색하여 본문에 삽입할 수 있게 되었습니다.*
(* 외부자료 검색하여 붙여넣기는 추후지원)


블로그끼리 서로 연결됩니다.

관심있는 텍스트큐브닷컴 블로그를 "관심블로그"로 등록하세요.
내가 어떤 블로그에 관심 있는지를 나타낼 수 있으며, 관심 블로그의 새 글을 알리미로 구독 할 수 있습니다.


개인화된 정보가 추천됩니다.

1. 회원님의 글을 바탕으로, 회원님을 잘 나타낼 수 있는 태그(ExperTag)가 추천 됩니다.
2. 글쓰기의 재료를 위한 포스트가 추천됩니다.


블로그에 첫 글을 남겨 보세요.

어느페이지에 있더라도 블로그 오른쪽 상단의 "글쓰기" 버튼을 클릭하면 바로 글쓰기가 가능합니다.
지금 바로 글을 하나 써보시는 건 어떨까요?



텍스트큐브닷컴은 현재 비공개 베타서비스중입니다.
사용중 발견하신 버그나 개선점은 관리자 페이지 상단에 위치한 의견제안 링크를 통해서 언제든지 가능합니다.

텍스트큐브를 통해 멋진 블로그를 만들어 보세요.