티스토리 뷰

728x90
반응형

우선 접속하면 위와 같이 나옵니다. 그리고 엔터키를 누르면 바로 아래와 같이 나옵니다.

사실 저는 인포샵 bbs의 텔네 접속 메뉴가 뭔지 잘 모릅니다. 그리고 귀찮아서 따로 찾아보지도 않았습니다. 궁금하면 저 대신에 한번 찾아봐주세요...

 

일단 메뉴를 선택하라고 하니 한번 선택해봤는데, 아래와 같이 연결 중이라고 뜨고 해당 서비스에 접속은 안되는 것 같았습니다.

 

그래서 여기서 탈출하기 위해서 Ctrl+C 를 누르게 되면 프로그램이 꺼지면서 접속이 끊기게 됩니다. 그러걸로 보아서 아마 로그인 시에 자동으로 프로그램을 실행시키고, 프로그램이 종료되면 logout 되도록 ~/.bashrc 파일에 설정한 것 같습니다.

 

이미 풀어서 아는 것이지만 문제의 목표는 저 프로그램에서 탈출하는 것이었습니다.

그걸 처음 알게되는 순간은 바로 아래에서 였습니다.

메뉴 1, 2, 3 번 모두 선택해보았지만 별다를 바 없이 무한 로딩이길래 그냥 Ctrl+C를 눌러서 탈출해보려고 하였습니다. 하지만 위와 같이 "Can't use ctrl+c" 문장이 나오면서 탈출이 되지 않습니다.

 

그 말은 결국 프로그램을 탈출하게 되면 level6의 shell로 돌아오게 된다는 의미입니다. 위에서도 가정했다시피 ~/.bashrc 파일에는 분명 프로그램 이름이 먼저 있을 것이고 바로 아래 logout 명령이 실행되게끔 되어 있을 것입니다.

# ~/.bashrc
level6_progam
logout

이런 상황에서 Ctrl+C 를 하게 되면 .bashrc 에 정의된 흐름에서 탈출하게 되니깐 logout 이 실행되지 않고 level6 shell로 돌아올 것입니다.

 

(참고로 level6_program은 제가 만들어낸 이름입니다. 실제로 문제를 풀고나면 프로그램의 이름이 tm 이라는 것을 알 수 있습니다.)

 

정말 level6_program(가명)에서 프로그램이 input을 입력받던 중 Ctrl+C를 눌러서 interrupt가 걸리게 되면 그 다음 명령어를 실행하지 않고 shell로 복귀하게 되는 지 실험을 해보았습니다.

 

우선 ~/.bashrc 파일을 아래와 같이 작성해보았습니다.

# .bashrc

# User specific aliases and functions

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export PS1="[\u@\h \W]\$ "
./test_input
echo "hello"

참고로 test_input 프로그램은 단순히 정수형 숫자 하나를 입력받는 프로그램입니다.

소스코드는 아래와 같습니다.

#include <stdio.h>
#include <stdlib.h>

int main(){
        int n=0;
        scanf("%d", &n);
}

이제 위 ~/.bashrc 를 가진 level1이라는 사용자가 로그인을 했을 때 정말 위의 순서대로 프로그램이 실행되는 지 확인해보았습니다.

정말 패스워드를 입력하고서 커서가 깜빡이는 것을 볼 수 있습니다. 이제 여기서 아무 숫자를 입력하게 되면 hello라고 나올 것이고 shell로 복귀할 것입니다.

정상적으로 작동한 것을 보실 수 있습니다. 이제 아까 말한대로 test_input 프로그램 실행 도중에 Ctrl+C를 하게 되면 정말 echo "hello" 라는 명령어가 실행되지 않고 바로 shell로 이동되는 지 살펴보도록 하겠습니다.

예, 보시는 바와 같이 echo "hello" 가 나오지 않고 바로 shell로 도착했음을 알 수 있습니다.

 

이 원리를 이제 문제에 적용할 차례입니다.

우선 아까도 언급했지만, 제가 예상했을 때 level6의 ~/.bashrc 는 아래와 같이 작성되어 있을 것 같습니다.

# .bashrc

# User specific aliases and functions

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export PS1="[\u@\h \W]\$ "
./level6_program
logout

그리고 아마 level6_program(가명)에서 자체적으로 cat ./hint 명령을 수행하고 있을 것이고, 해당 명령을 수행한 뒤에는 다시 사용자의 입력을 받도록 합니다.

 

어쨋던 간에 level6_program(가명) 에서 telnet으로 연결하는 기능에서는 ctrl+c 를 사용할 수 없다고 하였기 때문에 결국 남은 곳은 cat ./hint 이후의 입력받을 때 ctrl+c를 입력해보는 방법 뿐이었습니다.

 

그리고 결과는 바로 아래 이미지를 보시면 알다시피 이 같은 방법으로 성공적으로 문제를 풀 수 있었습니다.

level7의 비밀번호는 "come together"였네요. 생각보다 쉬운 문제였던 것 같습니다.

그리고 이번에는 ~/.bashrc와 리눅스에서의 프로그램 interrupt 상황에 대해서 많이 공부가 된 것 같습니다.

 

- 끝 -

728x90
반응형
댓글