🏆 2024

맛집 분야 크리에이터

🏆 2023

IT 분야 크리에이터

👩‍❤️‍👨 구독자 수

183

✒️ 게시글 수

0
https://tistory1.daumcdn.net/tistory/4631271/skin/images/blank.png 네이버블로그

🩷 방문자 추이

오늘

어제

전체

🏆 인기글 순위

티스토리 뷰

728x90
반응형

우선 힌트를 보면 위 C언어 코드로 작성되어진 /usr/bin/bof 프로그램을 실행시켜 level10의 권한을 획득하라고 되어 있습니다.

 

일단 힌트에 나온 /usr/bin/bof 파일에 대해서 알아보았습니다.

보시다시피 그룹권한 중 실행권한이 level9 사용자에 설정되어 있습니다.

그렇기 때문에 level9 사용자로선 /usr/bin/bof 프로그램을 실행해볼 수밖에 없습니다.

그리고 아래를 보시다시피 실행만 해서는 얻을 수 있는 것은 아무것도 없습니다.

 

그러다가 다시 생각해보니 힌트에서는 /usr/bin/bof 프로그램의 소스코드를 사전에 제공해주고 있었습니다.

그래서 힌트에 나온 소스코드를 직접 파일로 작성해서 /usr/bin/bof 와 동일한 프로그램을 만들어보면,

분석할 수 있지 않을까 생각하였습니다.

 

위와 같이 작성하고서 gcc 로 컴파일을 해보았습니다.

(level9 권한으로 파일을 쓸 수 있는 공간은 한정적이기에 tmp 디렉토리에 작성하고,

컴파일하여 실행프로그램을 만들었습니다.)

현재 Linux 환경에는 gdb 가 설치되어 있지만, 저는 Windows 유저로써 Windows 디버거가 편하여,

IDA를 사용해서 분석해보았습니다.

 

Linux에서 Windows 로 파일을 가져오기 위해서 scp 명령어를 사용하였습니다.

(정확히는 Windows의 WSL 인 Ubuntu 로 가져왔습니다. VMware 의 공유폴더 설정을 따로 하기 번거로워서 말이죠.)

 

domdomi@Domdom:~$ scp -c aes128-cbc level9@192.168.64.130:/home/level9/tmp/bof ./

그렇게 가져온 bof 파일을 IDA 디버거로 열었습니다.

bof 프로그램이 32bit 환경에서 작성된 것이기 때문에 IDA 도 실행파일을 열기에 최적화된 환경으로 셋팅 후 파일을 분석하였습니다.

 

s1 변수가 C언어 코드 상에서는 buf2 변수에 해당합니다.

s 변수가 C언어 코드 상에서는 buf 변수에 해당합니다.

 

상단에 보시면 s1 는 -18h 위치에 있고, s 변수는 -28h 위치에 있다고 합니다.

공간의 위치 상의 계산을 해보면 s 변수가 가지는 크기를 알 수 있습니다.

16진수로 10 즉, 10진수로는 16바이트만큼의 공간이 s 변수에 할당되어져있다고 생각할 수 있습니다.

16바이트 바로 그 이후에는 그럼 당연히 s1 변수의 공간이 있다고 확신할 수 있겠습니다.

(-18h 다음에 -28h 주소가 연속적으로 오는 것은 당연한 것이니깐요)

 

... -17h -18h -19h -20h ... -27h -28h -29h ...

 

그럼 이제 s 변수를 16바이트 공간에 값을 가득채우고, 그 이후에 값을 더 쓰게 된다면 buffer overflow 가 일어나서 s1 변수의 공간을 침범하게 될 것입니다.

(buffer overflow 가 일어나는 이유는 strncpy 함수에서 s 변수의 크기만큼 input 을 받아올 것이 아니라 이를 초과한 40바이트만큼 가져오게 하였기 때문에 발생합니다.)

 

저는 그래서 buffer 를 아래와 같이 만들어 보았습니다.

a
(s변수시작)
a a a a a a a a a
a a a a a a
(s변수끝)
g
(s1변수시작)
o    
                   
                  (s1변수끝)

s 변수와 s1 변수가 할당받은 총 40바이트 크기의 공간에서 s 변수의 공간은 16바이트로써

16바이트를 모두 a 문자로 채웠습니다. 그리고 거기에 더해서 g와 o 문자를 더 추가해서 입력했을 때,

위와 같이 s1 변수의 공간까지 침범하게 됩니다.

 

위와 같은 이론을 실제로 문제에 적용해보면 아래와 같이 level10의 권한을 잘 획득해온 것을 알 수 있습니다.

정확히 16개의 a 문자를 작성하고 바로 이어서 go 문자를 입력했습니다.

그랬더니 Good Skill! 이라고 나오면서 level10의 shell로 접속된 것을 알 수 있습니다.

 

그리고 my-pass 라는 명령을 실행하면 아래와 같이 패스워드가 나오는 걸 알 수 있습니다.

 

 

- 끝 -

728x90
반응형
댓글