본문 바로가기
워게임/FTZ

FTZ - level15

by meanjung 2021. 7. 24.

hint

14번과 비슷한데 다른 점은 check가 포인터 변수라는 것.

if (*check == 0xdeadbeef) ☞ check에 담긴 주소가 가리키는 곳에 0xdeadbeef가 담겨있어야 한다.

 

gdb에서 x/50x main 으로 0xdeadbeef의 주소를 알 수 있다.

그렇다면 check에 방금 구한 0xdeadbeef의 주소를 넣어서 익스플로잇하면 된다.


코드 영역은 주소가 항상 고정인가?

☞ PIE 보호기법이 적용되어있다면 코드 영역의 주소도 바뀐다. 하지만 ftz 문제는 그럴 리 없다..

 


다른 풀이

 

jump to filename with symbolic link

 

심볼릭 링크란?

바로가기같은 느낌.

ln -s [원본파일] [새로만들파일이름]

 

심볼링 링크를 어떻게 활용할 것인가?

cat /proc/<pid>/maps로 stack의 주소를 확인할 수 있다.

<1>

gdb로 attackme를 까서 확인해보면 맨 끝에 null이 5byte 있는 것을 알 수 있다.(1byte == 0xXX)

32비트 아키텍처에서는 맨 뒤에 null이 4개 있다. 

그렇다면, 스택에 null * 5byte + ./attackme + 환경변수... + 이런식으로 스택이 쌓인다는 것을 알 수 있다.

 

그러므로, 

이렇게 해서 ../attackme를 가리키는 파일이름이 0xdeadbeef인 심볼릭 링크를 만들 수 있다.

<1>에서 null 개수 파악했고, 파일이름 길이가 4byte인 것을 알아냈으니까

check 포인터가 0xc0000000 - 5(null byte) - 4(0xdeadbeef) = 0xbffffff7로 덮어써지면 익스플로잇 성공

 

 

정리하면,
심볼릭 링크를 이용해 attackme와 같은 inode를 가지는 파일을 만들면서 이름을 우리가 필요한 대로 설정한다.
그리고 스택의 가장 상단쪽에 파일 이름이 항상 쌓인다는 것을 우린 알고있으므로 이를 이용해 익스플로잇한다.

 

'워게임 > FTZ' 카테고리의 다른 글

FTZ - level17  (0) 2021.07.26
FTZ - level16  (0) 2021.07.26
FTZ - level14  (0) 2021.07.23
FTZ - level12  (0) 2021.07.22
FTZ - level11  (0) 2021.07.21

댓글