본문 바로가기

3. Pwnable (포너블)/2) 개념 정리

[2021.03.27] 4주차 : C언어 기본 다지기(3), Bandit Level 3~5

팀명 : 포~야호~ (그만큼 잘하고 싶으시다는 거지~)

 

 

활동 일자 : 2021.03.27 13시 40분 ~ 15시

 

 

4주차 활동 계획 : 유튜브 영상을 통한 C언어 기본 다지기(3), Bandit Level 3~5 문제 풀이

 

 

팀원 : 이서은, 이연지, 이혜지, 정효주

 

 

 

<bandit level 3~5>

 

bandit Level 3 -> Level 4

 

 

목표: inhere 디렉터리의 숨겨진 파일에 저장되어있는 암호 구하기

 

 

 

ls 명령어를 통해 파일목록을 알아낸다

 

 

 

cd 명령어를 통해 [inhere]로 경로 이동

 

 

 

ls -a를 통해 숨겨진 파일을 포함하여 디렉터리를 출력한다.

[.hidden]의 존재를 파악할 수 있다.

 

 

cat 령어를 통해 [.hidden]을 읽는다.

bandit4 pw : pIwrPrtPN36QITSp3EQaw936yaFoFgAB

 

 

 

 

 

bandit Level 4 -> Level 5

 

 

 

목표 : inhere directory에 있는 only human-readable file을 찾아 비밀번호 알아내기

 

 

 

 

ls -al 명령어로 어떤 파일과 디렉터리가 있는지 확인해봤는데, 문제에서 inhere 디렉터리에 only human-readable 파일이 있다고 했으니까 일단 cd inhere로 inhere 디렉터리에 이동해보자.

 

 

 

 

 

그다음 다시 ls -al 명령어를 사용해 목록을 확인해보았다. -file라는 이름으로 시작하는 파일이 10개가 있다. 

 

 

 

비밀번호를 알아내는 방법은 여러 가지가 있는데, 첫 번째는 그냥 -file00부터 -file09까지 하나하나씩 cat 명령어를 사용해 내용을 읽어오는 것이다. 잘 보면 모두 글자가 깨져서 나오는데, -file07은 사람이 읽을 수 있는 언어인 영어로 내용이 출력되는 것을 확인할 수 있다. 하지만 만약 파일이 10개가 아니라 100개, 1000개라면 일일이 cat 명령어를 사용할 수 없으니 더 편리한 방법을 사용해보았다.

 

 

 

file ./*

 

 

file은 현 디렉터리에서 데이터 형식을 알려주는 명령어다. 여기서 우리는 -file00부터 09까지 모든 파일에 대한 데이터 형식을 알고 싶기 때문에 file ./*라고 쳐주면 된다. (*가 모든 경로를 나타낸다) 그러면 -file07이 유일하게 ASCII text로 작성되었다는 것을 알 수 있다. 즉, 사람이 읽을 수 있는 언어로 작성하였다는 것이다.

 

 

 

 

file ./* | grep 'text'

 

또는 file, 그리고 grep을 사용해 알아내는 방법도 있는데, grep 사용법에 대해 아직 익숙하지 않아 이 방법은 검색을 통해 알아냈다.

 

 

 

 

 

bandit level 5 -> level 6

 

 

 

 

목표: 다음 속성을 가진 inhere 디렉터리의 하위 파일에 저장되어있는 암호 구하기

(사람이 읽을 수 있으며 1033바이트의 크기, 실행할 수 없음)

 

 

 

일단 ls 명령어로 디렉터리가 어떤 것들이 있는지 확인했다. 20개의 maybehere라는 이름으로 시작하는 디렉터리가 있다. 이 단계는 Level 4->5보다 좀 더 복잡하게 구성되어 있다. 힌트에서 파일의 사이즈가 1033 bytes라고 했으니 이 사이즈를 가지고 있는 파일을 명령어로 불러오면 된다.

 

find . -size 1033c

 

 

유일하게 maybehere07 디렉터리에 있는 .file2 파일이 1033bytes의 사이즈를 가지고 있다는 것을 알 수 있다.

 

 

cat 명령어로 .file2의 내용을 확인하면 패스워드를 알아낼 수 있다.

 

 

 

 

< C언어 >

   자주 쓰이는 스트링 함수

  • strlen
  • strcpy
  • strcmp
  • strcat
  • strchr

 

 

int strlen(const char *str);

strlen - Array의 길이를 리턴해줌

 

char* strcpy(char* dest, const char* src);

strcpy - 스트링을 복사

 

int strcmp(const char *leftStr, const char *rightStr)

strcmp - 두 개의 스트링을 비교

 

char *strcat(char *s1, const char *s2);

strcat - append처럼 s1이 끝나는 지점에 s2를 뒤에 연결시킴

 

char *strchr(const char *str, int c)

strchr - 특정 문자열을 찾았을 때 그 주소를(그 자리부터) 리턴해줌 ->문자열이 출력됨

 

 

 

 

마지막 영상인 '스트림 함수 실습'을 시간 관계상 하지 못했기 때문에 각자 실습을 진행해 오기로 하였다.

 

 

 

 

 

 

 

다음 주에는... 

- Bandit 6->8

- 달고나 문서 공부하기