[그림 1] 문제


Demo 문제에서는 CTF 자체 서버에서 /home/demo라는 디렉토리에 shell이 있는데 그것을 크랙해줄 수 있냐고 말하고 있습니다.

그렇다면 shell로 들어가보도록 해야 겠습니다.

[그림 2] /home/demo에 들어 있는 파일들


demo 디렉토리에는 demo라는 실행파일, demo.c, flag.txt, Makefile이 쭈루룩 나열되어 있습니다.

다행히 others 권한 부분에 read권한이 demo.c에 있는 것으로 보아 cat 명령어로 볼 수 있을 것 같습니다.

demo.c를 살펴보도록 합시다.

[그림 3] demo.c 소스코드


main보다는 먼저 void 형태의 함수인 give_shell()이 눈에 띕니다.

give_shell() 함수는 딱 보니 /bin/sh을 주도록 하는 것 같습니다.

그리고 main에서는 env에서 '_'의 끝이 icesh이라면 give_shell이라는 함수를 실행한다고 합니다.

그렇다면 env를 통해 환경변수를 보도록 합시다.


[그림 4] env 명령어로 본 환경변수


환경변수 이름 중 _ 라고 되어 있는 부분을 살펴보면 /usr/bin/env입니다.

/usr/bin/env의 끝 부분이 env로 되어 있습니다. 그리고 strncmp이므로 6글자씩 비교(null문자 포함)이지만 basename이기 때문에 끝의 글자가 icesh이어야 제대로 비교가 될 수 있다는 것을 알 수 있습니다.

따라서 우리는 /usr/bin/env를 바꿀 방법을 찾아보도록 합시다.

환경변수 _는 우리가 사용한 명령어의 위치를 말해주는 것 같습니다.

즉, 프로그램을 실행시키면 env에 실행한 파일의 PWD가 들어가게 된다는 것입니다.

같은 방법으로 env명령어가 아닌 set 명령어로 실행해보고 이를 확인할 수 있었습니다.


[그림 5] set 명령어로 본 환경변수


set 명령어를 사용하니 _환경변수가 /usr/bin/env에서 set으로 바뀐 것을 확인할 수 있습니다.

그렇다면 만약 demo실행파일을 실행시켰을 때, 환경변수 _에는 /home/demo/demo가 들어갈 것입니다.

그럼 우리는 끝에 icesh을 붙이기 위해서는 심볼릭 링크로 접근하는 방법이 있습니다.


심볼릭 링크 만드는 방법은 다음과 같습니다.


ln -s [링킹할 파일 위치] [링크파일의 이름 및 위치]

ln -s /home/demo/demo ~/icesh


[그림 6]은 simbolic link에 대한 실험 내용입니다.

simbol.c의 소스는 다음과 같습니다.(사실 어떤 header 파일을 해야 할 지 몰라서.... 죄다 집어넣었습니다.)


//simbol.c 소스코드
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>
#include <stdio.h>

int main()
{
	printf("simpbolic ==> %s\n", getenv("_"));   
	return 0;
}

[그림 6] simbolic link 실험 모습


먼저 simbol.c 코딩하고 testest라는 심볼링 링크를 만들었습니다. 심볼링 링크는 [그림 6]과 같이 나타나있습니다.

getenv 함수를 통해 심볼링 링크로 실행했을 떄와 그냥 실행했을 때의 차이를 나타내보았습니다.

basename은 심볼링 링크가 뜨는 것을 확인할 수 있습니다.

그렇다면 이제 icesh이라는 심볼링 링크로 만들어 /home/demo/demo파일로 연결하도록 합시다.

[그림 7] icesh 심볼링 링크 생성


이제 icesh이라는 심볼링 링크를 실행하면 ~/icesh이 되며, 곧 basename이 icesh이 됩니다.


[그림 8] 문제 해결



+ Recent posts