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

FTZ level14 풀이 본문

wargame 풀이/FTZ

FTZ level14 풀이

yehey 2020. 9. 28. 00:58
id: level14
pw: what that nigga want?

level14에 로그인 하고 hint를 열어보았다.

 

이번에는 main 함수 안에 쉘을 띄워주는 코드가 있기 때문에 굳이 쉘 코드를 사용할 필요가 없어보인다.

int형 변수 crap과 check, 그리고 char 배열 buf가 보인다.

fgets로 45바이트를 입력받고 있는데, buf의 크기는 20이다 -> overflow해서 다른 영역에 접근 가능

 

그런데 쉘을 띄워주는 부분이 조건문 안에 있다.

check와 0xdeadbeef가 같으면 level15권한으로 쉘이 띄워지는 듯 하다.

 

check의 위치 파악을 위해 attackme를 tmp에 복사하고 gdb를 실행해보자

main함수를 디스어셈블 했더니 위와 같은 결과를 알 수 있었다.

check의 상대적인 위치와 buf의 상대적인 위치를 알아냈다.

(crap의 상대적인 위치는 알아내지 못했지만 적어도 check위에 존재한다. 사실 문제 풀 때 신경쓰지 않아도 되는 듯)

 

알아낸 정보를 가지고 스택 구조를 그려보았다.

우리는 지금까지 버퍼를 overflow 시켜서 return address 값을 조작하곤 했는데, 이번에는 buf에 45바이트 입력만 받기 때문에 return address에는 접근이 불가능하다.

하지만! check에 0xdeadbeef를 넣어주면 알아서 bash 쉘이 level15권한으로 실행된다!

(앞의 문제들보다 더 쉬웠당)

 

buf에서 check까지는 총 40바이트, check는 4바이트로 44바이트의 입력이 필요한데

fgets에서 최대 45바이트 만큼 입력할 수 있기 때문에 check 값을 조작하는게 가능하다는 것을 알 수 있다.

 

이제 payload를 작성해보자.

buf+dummy=20+20=40 바이트는 의미없는 값으로 채워주고, check에는 0xdeadbeef를 little endian으로 넣어주자.

 

payload: (python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat)|./attackme

-fgets함수를 사용하기 때문에 파이프 라인을 이용해 payload를 작성한다.

level15 권한의 bash 쉘이 실행되었다. 

이제 level15의 비밀번호도 알아내보자.

level15의 pw: "guess what"

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

FTZ level16 풀이  (0) 2020.09.30
FTZ level15 풀이  (0) 2020.09.29
FTZ level13 풀이  (0) 2020.09.27
FTZ level12 풀이  (0) 2020.09.25
FTZ level11 풀이  (0) 2020.09.23
Comments