[어설픈] 해커스쿨 FTZ Level 10 문제풀이

2019. 1. 21. 20:57System Hacking/FTZ

안녕하세요!

오늘은 FTZ level 10을 풀어보도록

하겠습니다!


힌트를 확인해보니, 아래와 같이 적혀있네요!

요약해보면, 공유메모리를 사용하여 대화한 내용을

읽어서 level11의 권한을 얻어라!

key_t의 값은 7530이다!

흠...

공유메모리를 이용하라 했는데,

저도 공유메모리가 뭔지 잘 몰라서

인터넷에서 검색해봤습니다!


근데 일단 앞의 문제들 처럼

setuid가 걸린 파일을 찾아보려했습니다!


저희가 원하는 건 level11의 권한을 

프로그램이 실행될때 얻고 싶은 것이기 때문에

find 명령어 뒤에 파일 소유주: level 11 / setuid 걸려있니(-perm 4000)를 

입력하고 불필요한 에러메세지는 표시하지 않게 처리하고

출력을 했는데 아무것도 나오지가 않았습니다!



그래서 공유메모리를 인터넷에서 

검색해서 얻어온 결과!


※공유 메모리란?

원래 프로세스는 자기만의 밥그릇마냥

자기만의 메모리를 할당 받습니다!

그래서 각각의 프로세스들은 서로 독립적인

메모리를 갖고 있는거죠!


근데 여러 개의 프로세스가

공통된 메모리를 사용해야 하는 경우가 있습니다!

그럴때는 IPC의 방식을 통해

공유메모리가 만들어 집니다!


공유메모리의 경우 일반 메모리와 달리

데이터를 매번 복사해와야 하는 오버헤드가 생기지 않아

빠르고 효율적입니다!


<공유메모리 설정할 때 쓰이는 함수>

shmget( )함수 - (키 값,  공유메모리 크기, 공유메모리 접근권한 or생성방식)

shmat( )함수 - ( shmget( )함수의 반환 값 = 식별자 값, 일반적으로 0으로 설정, 읽기/쓰기 mode 설정 )

shmdt( )함수- (shmat( )함수 반환 값) [공유메모리 연결 끊는 역할]


찾아보니 리눅스 쉘에서 ipcs라고 입력을 하면

공유메모리와 semaphore, Message queues등의 

system V ipc설비에 대한 내용들을 보여준다고 하네요!


그래서 입력해보니

저희가 궁금한 shared memory 부분에 

key값이 0x00001d6a가 보입니다!

16진수인 이것을 10진수로 바꿔보면 7530이 나옵니다!

저희가 처음에 힌트에서 나왔던 그 키값이네요!


shmid와 perms 그리고 bytes 는 나중에 써야하니 메모하도록 해요!

0과 666 그리고 1028!



그래서 저는 자리를 옮겨서 tmp 폴더로 갔습니다!

그래서 c언어 파일을 생성하고 아래와 같이 입력하였습니다!


제가 앞서 말씀드린, 3가지 함수 기억나시나요?

그것들을 사용해서 코드를 작성해 볼 꺼에요!


그런데 3가지 함수를 쓰려면

저희가 헤더파일을 추가적으로 3가지를 입력해줘야 해요!

sys/ipc.h, sys/shm.h, sys/types.h 요렇게요!


main함수 기본적으로 선언하구요!

지역변수로 buf[50], shmid, *sharedmem을 선언하였습니다!

buf[50]은 공유메모리에서 읽어온 값을 저장하려고

선언한 것인데요!


원래라면 buf[1028]로 설정하고 풀어야 하는데,

이미 다 풀어본 결과 잘 나와서 ㅎㅎ

 과연 버퍼 크기를 얼마나 줄여도 가능한지

궁금해서 일단 1028 -> 50으로 줄여봤습니다!


그리고 shmid는 shmget함수에서 

반환되는 고유의 식별자 값을 shmid의 변수에 담는게

편의상 나을거 같아서 변수 선언 하였구요!


*sharedmem 포인터 변수도

shmat 함수에서 반환되는 값을 담으려고

편의상 선언하였습니다!


그리고 shmget함수 안에 

7530 키 값, 100 만큼의 공유메모리 크기, 그리고 0666 perm 값을 넣었습니다!

그리고 이 값을 shmid에 담고


sharedmem 변수에는 

shmat( shmid 값, 0(일반적인 경우), 0 (read&Write))의 값을 담았습니다!


이렇게 까지 코드를 작성하면 문제에서 말한

공유메모리에 접근을 할 수 있게 되는데!

저희는 이 메모리에 접근해서 대화내용을 

파악해야하기 때문에!


memcpy함수로 그 내용을 buf에 

복사해보도록 하겠습니다!

복사를 한 이후에, 

출력을 printf로 해주고!


shmdt( )함수로

공유메모리를 끊어주면 되는겁니다! 


그래서 위에 처럼 코드 작성을 완료하고!

해당 파일을 실행시켜주면!


바로 아래와 같이

level11의 패스워드가 나오게 됩니다!

고생하셨습니다!