Pwnable/FTZ&LOB

(해커스쿨) FTZ LEVEL 1 - 10

Claude97 2023. 9. 11. 14:49

시스템 해킹의 입문하기 좋은 해커스쿨(F.T.Z)

level 1~10 까지는 리눅스 운영체제에 대한 사용법 느낌이라서 간단하게 정리해보려고 한다.

 

[VM 이미지 설치와 putty로 원격 설정을 마친 후...]

 

level 1

 

level 2

 

level 3

 

level 4

 

 

level 5

 

level 6

텔넬 접속 화면에서는 Ctrl + C (실행 중단) 입력을 막아놨지만,

힌트를 띄워줄때는 동작하지 않아 실행 중단으로 나와서 passwd 파일을 확인했다.

 

level 7

ftz 개인 서버 구현시 오류로 일부러 정답 파일을 만들어야 되는게 있어서 그냥 넘어간다.

break the world

 

level 8

level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.

해당 부분을 따로 윈도우에서 password.txt 로 저장하여

john the ripper 라는 복호화 툴을 사용하니 복호화된 결과를 볼 수 있다.

 

level 9

코드 해석이 필요한 문제이다.

/usr/bin/bof 파일이 level10 으로 setuid 가 걸려있어서

코드 안의 조건문을 만족시켜 쉘을 실행시키면 문제를 해결할 수 있다.

 

fgets 를 통해 40 Byte 까지의 입력을 buf에 저장하지만

선언된 buf 의 크기는 10 Byte 까지 오버플로가 발생한다.

조건문 strncmp(buf2, "go", 2) == 0 을 보면

buf2에 들어간 문자를 크기 2까지 "go" 문자와 일치하나 비교한다.

 

 

힌트 코드를 복사해서 컴파일 해주고 gdb 로 열어보았다.

buf 는 [ebp-40] 에 위치하고, buf2는 [ebp-24] 에 위치한것을 확인할 수 있다.

그럼 buf에 16 만큼을 채우고 go를 붙이면 buf2에 "go" 문자열을 오버플로 시켜 넣을 수 있을 것이다.

 

level 10

공유 메모리를 이용하여 만든 대화방을 도청하라...

공유 메모리의 개념은

타 프로세스에서 한 프로세스가 잡고 있는 메모리 영역을 공유하기 위해, 프로세스 간의 데이터 통신을 위해 사용된다.

(프로세스 간의 데이터 통신이라고 적긴 했지만 주고 받는 개념 보다는 공동 작업?? 그런 느낌이다.)

 

공유 메모리 사용을 확인하기 위해서

ipcs 명령어를 쳐보면

key 값이 1d6a(16) = 7530 인 공유 메모리가 할당 된 것을 확인할 수 있다.

 

공유 메모리에 접근하기 위해서는

shmget(), shmat(), shmctl(), shmdt() 등의 함수들이 있지만

이 문제에서는

공유 메모리의 접근을 위한 shmget()

접근한 메모리의 사용을 위한 shmat() 두개를 사용할 것이다.

 

shmget()

 

함수 예제

#include <sys/ipc.h>

#include <sys/shm.h>

 

int shmget(key_t key, size_t size, int shmflg);

 

key_t key : 공유 메모리에 접근 및 할당하기 위한 고유한 key 값. 커널에서 관리.

size_t size : 새로 할당 할 공유 메모리의 최소 크기(Byte)이며 이미 할당된 메모리에 접근할 때는 0으로 입력받는다.

int shmflg : 함수 동작 관련 플래그(IPC_CREAT, IPC_EXCL)

 

shmat()

 

함수 예제

#include <sys/types.h>

#include <sys/shm.h>

 

void *shmat(int shmid, const void *shmaddr, int shmflg);

 

int shmid : shmget() 함수를 통해 얻은 고유 id

const void *shmaddr : 공유 메모리가 붙을 주소 명시.

int shmflg : 공유메모리에 대한 접근 권한을 설정

   - SHM_RDONLY : 공유 메모리에 읽기 전용으로 붙인다. 해당 플래그가 없으면 읽기/쓰기 모드로 붙는다.

 

 

 

 

이제 본격적인 Buffer overflow 문제들을 다루는 level 11로 들어가자.