yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

FTZ level12 풀이 본문

wargame 풀이/FTZ

FTZ level12 풀이

yehey 2020. 9. 25. 01:13
id: level12
pw: it is like this

 

hint를 확인해보자

level11과 매우 비슷한 코드다!

하지만 level11에서는 strcpy 함수를 사용해서 str에 입력했다면,

level12에서는 gets를 이용해서 str에 값을 대입한다.

(gets 함수 역시 BOF에 취약한 함수이다. 길이 제한 없이 입력받기 때문!)

 

일단 attackme 파일을 디스어셈블 해주고 스택 구조를 파악해보자 

main+3에서 스택을 264바이트 확보했고,

main+9에서는 8바이트 더 확보했다.

main+49에서 eax에 ebp-264의 주소를 대입하고 이를 gets함수의 인자로 넣는걸로 보아

ebp-264가 str의 시작 주소임을 알 수 있다.

 

이 정보들을 가지고 스택 구조를 그려보았다! (사실 level11과 완전히 동일한 스택 구조를 갖는다.) 

따라서 우리는 268(str+dummy+sfp)바이트를 채워주고 return address에 쉘 코드 주소를 넣어주면 된다.

(이번에도 쉘 코드를 사용한다. setreuid가 있기 때문에 쉘이 level13의 권한으로 실행된다!) 

 

level11과 다르게 이번에는 환경변수에 쉘 코드를 넣어주고 쉘 코드가 있는 환경변수의 주소를 찾아 return address에 넣어주는 방법을 이용해보자!

 

(환경변수를 이용한 BOF- 2020/09/10 - [컴퓨터 시스템/시스템 해킹] - BOF - 환경변수 이용하기)

 

우선 환경변수에 쉘 코드를 넣어주자. 그리고 아래 코드를 이용해서 shell.c 파일을 만들고 이를 컴파일 해주어 실행파일로 만들어 준다. (shell은 환경변수 이름을 통해 해당 환경변수의 주소를 반환한다.)

 

shell.c 코드
환경변수 등록, shell을 실행해서 SHELL2 환경변수의 주소 알아냄

그럼 이제 payload를 작성할 수 있다! 

payload = (python -c 'print "A"*268+"\xa7\xfb\xff\xbf"';cat)| ./attackme


왜 strcpy에서 사용한 payload와 형식이 다를까?

gets 함수는 인자로 받는 것이 아닌 표준입력을 받기 때문에 이전처럼 `를 사용하지 않고 파이프라인'|'을 사용해 페이로드를 작성한다. 파이썬으로 값을 출력한 후 표준 입력을 표준 출력으로 바꿔주는 명령어인 cat을 사용해 값을 넘겨주고 앞의 결과를 파이프를 이용해 넘겨준다.

 

환경 변수 내의 쉘 코드가 실행되었고 level13 권한의 쉘이 열렸다.

 

level13의 pw: "have no clue"

'wargame 풀이 > FTZ' 카테고리의 다른 글

FTZ level14 풀이  (0) 2020.09.28
FTZ level13 풀이  (0) 2020.09.27
FTZ level11 풀이  (0) 2020.09.23
FTZ level10 풀이  (0) 2020.09.20
FTZ level9 풀이  (0) 2020.09.18
Comments