1. 풀이
- level6은 이전의 level들과 달리 hint가 먼저 출력되며, 이 외의 내용은 확인되지 않음.
- 아무키를 입력하면 텔넷 접속 서비스가 나오며, bbs 선택 시 텔넷 연결 시도 메시지만 출력되며 다른 반응은 관찰되지 않음
- 연결 중지를 위해 ctrl + c (프로세스를 종료하는 인터럽트)를 입력하면, 종료됨.
- 텔넷 접속 서비스 화면에서 ctrl + c를 입력하면, "Can't use ctrl+c"라는 문구가 출력
- 초기 접속 화면에서 ctrl + c를 입력하면 level6의 홈 디렉터리에 접근
인포샵 bbs 텔넷
- 인포샵 bbs는 옛날 전화와 PC과 함께 통신하던 시절 이용되던 사설 BBS 서비스
- 사용자에게 주소를 입력 받아 ping 테스트 후 주소가 활성화 되어 있다면 연결해주는 서비스 제공
- 인포샵 bbs은 초기 접속 화면에서 Ctrl + C signal (프로그램 종료) 을 보내게 되면 바로 shell로 떨어지는 취약점을 가지고있음
- 홈디렉터리의 내용을 확인해보면 password 파일이 존재하며, 해당 파일에 접근하면 비밀번호를 확인할 수 있음.
- tn은 실행파일로, 실행 시 텔넷 접속 서비스를 제공하는 파일
2. GDB를 통한 의사 코드 복원
- fn 실행파일에 대한 분석
- system>getchar>system>printf 순으로 호출되며, signal 함수는 취약점을 이용하기 위한 함수로 판단됨.
- printf로 출력하는 구문을 봤을때, 텔넷 접속 서비스 화면이 출력되는 부분인 것을 알 수 있음.
- <main+190> ~ <main+197>은 signal 함수를 결정하는 부분
① 문법 : signal(시그널 번호, 시그널을 처리할 핸들)
② 해당 부분을 확인해 signal 함수를 완성하면 signal(2, sig_func)
③ 2번 신호는 SIGINT로, SIGINT가 입력되면 sig_func를 실행함 (SIGINT = ctrl+c)
- scanf()를 통해 사용자로부터 값을 입력 받아 비교한 후 결과에 따라 system 함수를 수행하고, 잘못된 값을 입력할 경우 프로그램 종료
#include <stdio.h>
int main()
{
// 변수 선언
char input;
int i,num;
system("cat hint"); // hint 내용 출력
input=getchar(); // 아무 입력 값 1개 받기
system("clear"); // 화면 초기화
// 구문 출력
printf("###########################\n");
printf("## ##\n");
printf("## 텔넷 접속 서비스 ##\n");
printf("## ##\n");
printf("## ##\n");
printf("## 1. 하이텔 2. 나우누리 ##\n");
printf("## 3. 천리안 ##\n");
printf("## ##\n");
printf("###########################\n");
// signal()
if(i==SIGIN)
{
signal(i, sig_func);
}
printf("\n 접속하고 싶은 bbs를 선택하세요 : "); // 구문 출력
scanf(%d",&num); // 하이텔, 나우누리, 천리안 중 선택
switch(num) // 입력한 num에 따라 텔넷 연결 시도
{
case 1 :
system("telnet 203.245.15.76");
case 2 :
system("telnet 203.238.129.97");
case 3 :
system("telnet 201.120.128.180);
default :
if(num != 1 && num != 2 && num != 3)
{
printf(" 잘못 입력하셨습니다. 접속을 종료합니다. \n");
}
}
}
'문제풀이 > FTZ' 카테고리의 다른 글
FTZ Level8 풀이 (0) | 2022.10.30 |
---|---|
FTZ Level7 풀이 (0) | 2022.10.28 |
FTZ Level5 풀이 (0) | 2022.10.27 |
FTZ Level4 풀이 (0) | 2022.10.27 |
FTZ Level3 풀이 (0) | 2022.10.25 |