The password for the next level is stored in a file called readme located in the home directory. Use this password to log into bandit1 using SSH. Whenever you find a password for a level, use SSH (on port 2220) to log into that level and continue the game.
Commands you may need to solve this level ls , cd , cat , file , du , find
문제 해석
Level 0 -> Level 1로 가기 위한 비밀번호는 readme라는 홈 디렉토리안에 있다. SSH 통신을 활용하여 비밀번호를 찾아보자.
home 디렉토리 안에 readme 파일이 있으니, home 디렉토리로 이동해보자.
우선, pwd를 이용하여 내가 어느 위치에 있는지 확인해보자.
pwd : 현재 자신의 위치를 나타냄
bandit0@bandit:~$ pwd
/home/bandit0
/home/bandit0 를 통해, 현재 위치가 home 디렉토리라는 것을 확인했다.
ls 명령어를 이용하여, 현재 디렉토리에 어떤 파일, 폴더가 있는 출력해보자
ls : 현재 디렉토리에 있는 파일, 폴더 출력 ls -l : [파일 형태] [권한] [하드 링크 수] [소유자] [그룹] [파일 크기] [시간] [파일 이름]
bandit0@bandit:~$ ls -l
total 4
-rw-r----- 1 bandit1 bandit0 437 Jul 17 15:57 readme
-rw-r-----에서 가장 첫 번째 문자가 d이면 directory, -이면 일반 파일
이로써, 현재 home 디렉토리에 readme 파일이 있는 것을 확인할 수 있다.
cat 명령어를 사용하여 readme 파일내용을 출력하자
cat : 해당 파일의 내용을 출력, 또는 입력할 수 있음
bandit0@bandit:~$ cat readme
Congratulations on your first steps into the bandit game!!
Please make sure you have read the rules at https://overthewire.org/rules/
If you are following a course, workshop, walthrough or other educational activity,
please inform the instructor about the rules as well and encourage them to
contribute to the OverTheWire community so we can keep these games free!
The password you are looking for is: ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If
이로서, Level 0에서 Level 1로 가는 ZjLjTmM6FvvyRnrb2rfNWOZOTa6ip5If 비밀번호를 획득했다.
참고로, bandit 비밀번호는 따로 메모장에 저장해두는 게 좋다!
Level0 -> Level1
Level1 -> Level2
당연한 이야기지만, 각 레벨마다 비밀번호가 다르기 때문..!
정리
1. pwd를 사용하여 현재 위치 확인
2. ls -l로 현재 위치의 디렉토리나 파일 확인
3. cat으로 readme 파일의 내용 출력
잡지식 Time
Putty 텍스트 복사 -> windows 텍스트 붙여넣기
- Putty에서 드래그 후 Ctrl + c, 윈도우에서 Ctrl + v
Windows 텍스트 복사 -> Putty 텍스트 붙여넣기
- 윈도우에서 Ctrl + c 후 Putty에서 Shift + Inesrt
Putty에서 clear 명령어 혹은 ctrl + l (i 아니고 L 이다) 하면 화면 깨끗해짐
정보보안기사를 공부하다가 알게된 Snort.. 오픈소스 IDS로, 네트워크 보안을 실습하는데 큰 도움이 될 것 같아서 사용해보려고 한다. 더불어, xx기업 보안관제 기술면접을 볼 때도, "snort 사용하신 적 있어요?"라고 물을 정도였으니, 간단하게라도 해보면 좋을 것 같다.
여러분이 일상에서 사용하고 있는 인터넷 사이트, 모바일 사이트, 사내 업무 시스템의 대부분이 이 3계층 구조를 채택하고 있다. 사용자 입력을 받고, 그 요청을 각각의 서버가 수용하여 사용자 화면에 띄우게 하는 것이 메인이다. 각 서버의 특징을 알아보고, 3계층 인프라 구조의 장단점을 분석해보자.
웹 서버(Web server)
1. 사용자 입력을 받는다(HTTP 요청)
2. 웹 브라우저에 화면을 표시
3. DB와 관련된 데이터 처리 외에, 프론트단에서 처리할 수 있는 요청을 처리
AP Server
1. 커널 영역을 사용하는 시스템 콜 인터페이스 처리
2. 정적인 요청 해결 (PHP, Java 등)
3. 비즈니스 로직 관리 - 요청되는 정보를 일정 규칙을 통해 관리
DB server
1. 데이터 입출력 담당
2. 효율적 데이터 관리를 통해 응답속도 개선
3. 데이터베이스 접근 관리
3계층 아키텍처의 장단점
장점
1. 서버 부하 집중 개선 - 간단한 요청은 굳이 DB서버까지 접근하지 않아도 웹 서버에서 처리할 수 있다.
입력값(str)의 길이가 10^4이니까, 시간복잡도는 O(n), O(nlogn)정도로 생각했다. 즉, for문 하나에, if문 정도.??
알고리즘이 익숙하지 않은 나에게, 이정도가 최선의 접근이다.
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for(String s : strs) {
// 키를 정렬 후 String 형태로 다시 변환
char[] chars = s.toCharArray();
Arrays.sort(chars);
String key = String.valueOf(chars);
// 만약 key가 없으면 map key 추가, 있으면 value에 add
if(!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
map.get(key).add(s);
}
return new ArrayList<>(map.values());
}
}
개발자가 웹 페이지를 만드는 걸 생각해보자. 서로 다른 이름을 가진 사용자 수가 3명일 때, 웹 페이지는 총 3개일...수도 있다. 하지만 만약 9999명이 된다면? 사실 100명만 되도, 개발자는 복사 붙이기(일명 복붙)을 100번 해야 하는 셈이다. 이를 해결하고자 MVC 패턴이라는 것을 만들었고, 홈페이지를 보여주는 뷰(View)와, 사용자의 요청을 서버에서 처리하는 컨트롤러(Controller), 데이터를 관리하는 모델(Model) 방식을 만들기 시작했다.
1. 뷰 템플릿 생성하기
이제, MVC 패턴을 인텔리제이 환경에서 실행해 보자. 우선, 머스태치를 활용하여 뷰 템플릿을 만든다. 여기서 머스테치란, 다양한 언어를 화면에 제공하는 템플릿 엔진이라고 생각하면 된다.
src -> resources -> templates -> 우클릭 new -> file 클릭 -> first.mustache 생성
여기서 확장자에 .mustache를 적었음에도 수염과 같은 아이콘 모양이 나오지 않아도 걱정하지 말자.
인텔리제이의 왼쪽 상단에 file -> settings -> plugin -> mustache를 클릭하여 설치해주면 된다.
자, 빈 화면이 나오지 않았는가?
여기서 doc를 누르고 tab 버튼을 누르면, 다음과 같은 html 코드가 자동으로 생성된다.
head의 <title>태그는 웹 페이지의 제목을 나타낸다. 참고로, 왼쪽에 보이는 네이버의 아이콘은 파비콘이라고 하며, 이것도 설정할 수 있으나 여기서는 생략하겠다! <title> 태그 사이에 내가 원하는 웹 페이지의 제목을 적어보자.
그리고, <body> 태그 안에 <h1> 태그를 달고, 원하는 말을 넣어보자. 필자는 이렇게 했다. 그리고 {{username}}은 변수를 받아오는 형식이다. 이를 통해, 앞서 말했던 '각 사용자 마다 페이지를 만드는 것'을 하지 않고, 원하는 변수만 바꾸어 하나의 페이지에 여러 형식을 보일 수 있다.
뷰 페이지를 설정했으니, 그 화면을 볼 수 있도록 요청을 처리해주는 컨트롤러를 만들어보자.
com.example.practice 우클릭 -> package -> com.example.practice.controller 입력 -> FirstController.class 생성
package com.example.practice.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller //이 객체가 컨트롤러임을 알게 해주는 어노테이션
public class FirstController {
@GetMapping("/hi") //URL 요청 접수
public String helloWorld(Model model) {
model.addAttribute("username1", "김철수");
model.addAttribute("username2", "김영희");
return "first"; //first 머스테치 반환
}
}
여기서 @를 사용한 "어노테이션"을 볼 수 있다.
어노테이션이란, 소스 코드에 추가적으로 사용하는 메타 데이터의 일종이다. 코드를 서버에서 어떻게 처리해주어야 하는지 명시해주는 목적으로 사용된다.
@Controller는, 이 객체가 컨트롤러임을 명시한 어노테이션
@GetMapping("/hi")는, Client로 부터 URL을 요청 받았을 때, 아래 메소드가 실행되도록 하는 조회 어노테이션이다.
helloWorld 메서드의 매개변수는 Model로, MVC 패턴의 M을 담당하는 모델이다. 만약 빨간 줄이 뜬다면 alt + enter를 사용하여 import 해주면 된다.
코드를 다 작성하고, 서버를 실행하면 다음과 같은 로그를 볼 수 있는데, Tomcat started on port 8081을 보면 8081 포트에서 서버가 실행된 것을 확인할 수 있다. 그러나 대부분의 사람들은 8080 포트에서 서버가 동작할 것이다. 스프링 부트는 톰캣이라는 것에 담겨서 실행되므로 다음과 같은 로그가 뜬다.
localhost:8081/hi 에 접속하여 내가 원하는 뷰 페이지가 나오는지 확인해보자.
만약 한글이 깨져서 나온다면, src -> main -> resources -> application.properties 파일에서 다음과 같은 코드를 넣어주자.