zj3t

email: euntaejang@gmail.com

Latest Posts

hacker school ftz level18

By 오후 8:40 ,

FTZ 18,19,20 번을 예전에 풀었는데 포스팅을 안한거 같아 해봅니다.


#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void shellout(void);

int main()
{
  char string[100];
  int check;
  int x = 0;
  int count = 0;
  fd_set fds;   //fd 변수 선언

  printf("Enter your command: ");
  fflush(stdout);

  while(1)
    {
      if(count >= 100)
        printf("what are you trying to do?\n");
      if(check == 0xdeadbeef)
        shellout();
      else
       
          FD_ZERO(&fds);  //fd 변수의 모든 내용을 지운다.                                
          FD_SET(STDIN_FILENO,&fds); //fd를 setting함

          if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1)
            {
              if(FD_ISSET(fileno(stdin),&fds))
                {
                  read(fileno(stdin),&x,1); x를 1byte 입력받음
                  switch(x)
                    {
                      case '\r':
                      case '\n':
                        printf("\a");
                        break;
                      case 0x08:
                        count--;
                        printf("\b \b");
                        break;
                      default:
                        string[count] = x;
                        count++;
                        break;
                    }
                }
            }
        }
    }
}

void shellout(void)
{
  setreuid(3099,3099);
  execl("/bin/sh","sh",NULL);
}  

다시 풀다보니 기억이 잘안나서 시간을 좀썻는데 일단 fd_set, FD 관련 함수들은 나중에 생각을 해도 괜찮습니다. (몰라도 문제는 풀 수 있습니다.)

중요한 부분은
  char string[100];
  int check;
  int x = 0;
  int count = 0;
  fd_set fds;

if(check == 0xdeadbeef)
        shellout();

void shellout(void)
{
  setreuid(3099,3099);
  execl("/bin/sh","sh",NULL);
}  

입니다.

변수를 보면

  char string[100] |                높
---------------------
  int check         |
---------------------
  int x = 0         |
---------------------
  int count        |
---------------------
  fd_set fds       |                  낮
--------------------


count로 증가시켜서 check를 덮어씌우자니 100보다 큰지 체크를 해서 안되고
x를 입력하자니 1바이트만 입력을 받아서 안되고,
따라서 string 배열을 이용해야할텐데 값을 쓰면 높은 데로 증가해서 check를 덮어 씌울수가 없는데
여기서 필요한게 string 변수는 배열이면서 이름 자체가 포인터 입니다.
따라서 check변수를 덮어씌울 수가 있게됩니다.(이는 C언어 수업이 아니므로 생략 C언어는 다들 다룰줄 알아야합니다.)

하지만 간단히 보이겠습니다ㅎㅎ

int a=10;
int *p=&b;
int b=20;
int c=25;

printf("%d\n",*(p-1));
printf("%d\n",*p);
printf("%d\n",*(p+1));
printf("%d\n",*(p+2));

a출력됨 10
p출력됨 20
b출력됨 20
c출력됨 25

여기서 int p[] 라도 마찬가지!!!

따라서
string은 100byte check는 4byte 이므로 4byte를 덮어씌우기 위해서는 count를 -4만큼 감소시켜 그 위치에 값을 써주면 check를 덮을 수가 있습니다.



You Might Also Like

0 개의 댓글