리눅스는 유닉스 계열의 운영체제를 의미 한다.


리눅스의 특징


1.  대부분의 플랫폼에서 사용이 가능 하다.


2. 뛰어난 안정성과 보안성을 지닌다.

=> 커널 소스 코드 및 모든 관련 자료가 공개 되어 있기 때문!


3. 성능이 낮은 컴퓨터에서도 작동된다.


4. 멀티유저와 멀티테스킹이 가능하다.


5. 대부분의 리눅스는 무료이다.


6. 다양한 네트워크 서비스를 제공한다.

=> 다양한 프로토콜을 제공

=> 인터넷 기반 어플리케이션 제공

=> 다양한 웹서버를 제공한다.


리눅스 구조





리눅스의 구조는 (대략적으로) 이렇게 되어있다.  우리들은 쉘에 명령어를 입력함 으로서 우리가 원하는 명령어를 실행한다.

필요할경우 커널을 통해서 하드웨어 까지 제어할 수 있다.




쉘은 유저와 직접 소통하며 유저의 명령을 수행한다.

처음 ubuntu를 깔때는 bash쉘이 기본으로 되어있다.

zsh, ash, sh 등 많은 쉘이 있지만 필자는 oh my zsh을 쓴다!

윈도우의 cmd도 하나의 쉘이라고 볼 수 있다. 

/etc/shells 파일을 보면 사용할수 있는 쉘 목록이 있다.



/etc/passwd를 보면 사용자가 로그인시 사용하는 쉘이 있다. echo $SHELL로도 확인이 가능.



쉘을 바꾸고 싶으면 chsh를 이용하면 된다.


커널


커널은 운영체제에 가장 필요한 핵심이다.

커널은 처음 부팅될 때 메모리에 올라간다.

시스템의 여러 부분을 제어한다.

멀티태스크 환경을 제공한다. 멀티태스크는 여러개의 프로세스를 동시에 실행하는것을 의미한다.

시스템콜(syscall)을 이용해서 응용프로그램과 상호작용한다.

/proc/sys에 있는 특수 파일을 사용해 실시간으로 커널의 옵션을 설정하고 확인할 수 있다.

커널에 대한 자세한 공부는 6,7 월달에 자세히 공부해야 겠다...



'system > level1' 카테고리의 다른 글

컴파일 과정(LINUX GCC)  (0) 2017.04.10
linux 정적 컴파일 동적 컴파일  (0) 2017.04.09
리눅스 파일 권한 설정  (0) 2017.04.09
리눅스 기초(8086 메모리 구조)  (0) 2017.04.06
리눅스 기초(리눅스 디렉토리)  (0) 2017.04.04
블로그 이미지

powerprove

,

포인터 빼기?

Coding/C 2017. 3. 21. 16:31

인베디드 CTF를 하다가 우연히 알게되서 (C를 헛배워서) 포스팅을합니다


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void){
 
        int *= 0x10;
        int b = 2;
        int *result = p - b;
 
        printf("%p\n", result);
 
        return 0;
}
cs


요약할것도 없는 소스코드 지만 요약하면 *p 에 0x10을 넣고 b에 2를 넣어준다음 빼줍니다

결과는



결과는 0x8입니다.


어셈블리로 보면



이렇게 나타나있는 것을 확인 할 수 있었다.

ebp-0x14가 p이고

ebp-0x10이 b, ebp -0xc가 result이다.

계산과정을 보면 b에다가 shl 연산을 하는 것을 확인 할 수 있는데

shl 연산은 왼쪽으로 시프트 이동이다. 2번 왼쪽 시프트 연산을 하니 X4로 봐도 무방할 것이다.


때문에 0x10 - 4*0x2가 되어 0x8의 결과가 나온다.


렇게 C언어 포인터를 뺄때는 그 자료형의 숫자 만큼 빼준다는 것을 확인할수 있었다.


다른 예로 봐보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
 
int main(void){
 
        uint64_t *= 0x510;
        int b = 2;
        uint64_t *result = p - b;
 
        printf("%p\n", result);
 
        return 0;
}
cs


이거의 값은 0x500이다.



어셈으로보면 shl, 0x3 (x8)하고 빼주는 것을 확인할수 있었다.


끄읕

블로그 이미지

powerprove

,


저는 atom 을 이용해서 코딩을 하였습니다. vi 를 이용하셔두 상관 없습니다.(vi Hello.java)


1
2
3
4
5
6
7
public class Hello{ //파일이름과 같아야함.
  public static void main(String args[]){
    System.out.println("Hello java World");
    System.out.println("안녕하세요!");
  }
}
 
cs


텍스트 에디터(vi같은)을 이용해서 소스 코드를 입력합니다. 

컴파일 명령어는 javac 입니다.



컴파일이 된후 java Hello를 실행하면 끝~



블로그 이미지

powerprove

,