본문으로 바로가기

C언어_원,투 포인트 함수 이용 복습 , 리눅스

category 개발자/C 언어 2015. 4. 20. 17:41

(원 포인트)

#include <stdio.h>

int main(void)
{
  int iA;
  int iB;

  test(&iA,&iB);  //함수 호출(포인터 매개변수로 받아서 그 주소 메모리 값을 직접적으로 수정.

  return 0;
}

void test(int *p1, int *p2)
{
  *p1 = 100;
  *p2 = 200;
}
/*
iA 를 임의의 주소로 1000번지, iB를 임의의 주소로 2000번지 라 했을 시에 p1과 p2 또한 임의의 주소로 1004번지 , 2004번지로 생각한다면
p1이 가지고 있는 주소값은 1000번지 이며 p2가 가지고 있는 주소값은 2000번지 이다.
이것이 * 로 가르키는 곳의 메모리 값은 iA의 값이므로 그 값을 100으로 수정하고 200으로 수정 해 주고 있다.
*/






(투 포인트)

#include <stdio.h>

void test(int **pp1, int **pp2);

int main(void)
{
  int *p1;
  int *p2;

  test(&p1,&p2);  // 함수 호출(포인터 매개변수로 받아서 그 주소 메모리 값을 직접적으로 수정)

  printf("*p1 : %d\n",*p1);  // 3. 그리하여 출력된 p1이 참조하고 있는(가르키고 있는) 메모리 값은 A의 값으로써 100이 출력된다.
  printf("*p2 : %d\n",*p2);

  return 0;
}

void test(int **pp1, int **pp2)
{
  static int A = 100;  // 1.static 으로 선언된 변수는 그 함수가 종료가 되더라도 메모리 값이 살아있다.
  static int B = 100;  

  *pp1 = &A;    // 2. *pp1 == p1 이므로 p1의 주소값을 static으로 선언된 변수 A에 주소값으로 변경해준다.
  *pp2 = &B;
}
/*

*/





(투 포인트 예제 3)


#include <stdio.h>

void SwapIntPtr(int **dp1, int **dp2)
{
  int *temp = *dp1
  *dp1 = *dp2;
  *dp2 = temp;
}

int main(void)
{
  int num1 = 10, num2 = 20;
  int *ptr1, *ptr2;

  ptr1 = &num1, ptr2 = &num2;

  printf("*ptr1, *ptr2 : %d %d\n",*ptr1, *ptr2);

  SwapIntPtr(&ptr1, &ptr2);  //ptr1과 ptr2의 주소 값 전달!

  printf("*ptr1, *ptr2 : %d %d\n",*ptr1, *ptr2);

  return 0;
}




(투 포인트 예제 4)

#include <stdio.h>

int main(void)
{
  int num1 = 10, num2 = 20, num3 = 30;

  int *ptr1 = &num1;
  int *ptr2 = &num2;
  int *ptr3 = &num3;

  int *ptrArr[] = {ptr1, ptr2, ptr3}
  int **dptr = ptrArr;

  printf("%d %d %d\n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));
  printf("%d %d %d\n", *(dptr[0]), *(dptr[1]), *(dptr[2]));

  return 0;
}





하드웨어 쪽 얘기.

time/counter

질문 : 컴퓨터에 시간이 나오는데 이 시간을 누가 찍어주고 있는 걸까?

일반적인 아날로그 시계는 건전지를 넣으면 그때부터 가기 시작하는데 이때 표현되는 아날로그 시계값은 상대적인 것이며 우리가 직접 그 나라의 절대 시간대를 설정해 줘야만이 절대값을 지니게 된다.

16000000 = 16Mhz , 이것은 아트메가의 동작주파수 이다.

1초당 저 클럭 수 만큼 일을 많이 할 수 있다 라는 것인데, 실제로 전자시계 쪽을 보자면 16000 을 세아려 주는 애가 따로 존재하며 직접적으로 16Mhz를 세아리지는 않는 다는 것이다. 1/1000 . 효율적인 일 수행을 위해 존재한다.



(리눅스)

선수 교대

su -(로그인을 다시한 것처럼 된다.)계정


이제 우리 계정을 관리자 계정으로 바꿀 것이다.


라즈베리는 계정이 3개.

1. pi

2. hong

3. root


su - 치면 root 계정을로 바뀌며 우리 계정이 root 계정을 갖게 도니다.


계정을 추가하면 root /etc/passwd 에 맨끝 위에 우리 smart id가 추가 된다.


맨밑에 보면 xrdp 가 있는데 이게 다른 사람에게 털리면 모든 passwd 가 털린다 생각하면 된다.


그리고 다시 맨위에 root를 가보면 uid 와 gid 부분이 0 으로 되있는 것을 확인 할 수 있다.

이것을 참조하여 우리 smart id(나는 hong) 의 uid와 gid를 수정해주어 root 권한과 동일한 권한을 갖도록

수정하자.


그다음 칸은 ,,, 이라 되있는데 우리 신상정보가 적힌다 안적었기때문에 ,,, 이다.


그다음 칸은 우리 id의 절대 경로가 적혀 있다. 


그다음 칸은 사용하는 shell(dos 창, 리눅스 입장에서는 dos shell 이라 부른다. (껍데기))을 의미한다. 




그다음은 shadow 파일을 본다.


맨밑에 내려보면 xrdp 의 암호부분에 1을 암호화 시킨 것을 볼 수 있다. 

1 -> !


우리 계정의 맨 오른쪽을 땡기다 보면 콜론 다음에 salt값을 찾아 볼 수 있다.

우리 암호를 찾아내려면 암호,salt 값도 알아야 알 수 있따.

근데 이 salt 값은 shadow에 들어가 있다. 


즉 암호 알려는 순서는 salt 값 넣고 우리 암호를 넣어야 풀 수 있따.


다시 말하자면 해킹이 성공한 것은 shadow 파일이 털린 것이다.



다음 group 에가서 우리 아이디 줄을 지우고 저장후 나온다.