이번 문제는 그냥 거의 level16 이랑 똑같아보인다.
다른 점은 shell() 함수가 없다는 것.
앞선 문제에서 shell() 이 배시 쉘을 실행시키는 함수였기 때문에
여기서는 환경변수에 쉘코드를 올려두고 환경변수의 주소가 call() 의 위치에 오도록 오버플로우 하면 된다.
그럼 전에도 했듯이 attackme 를 복사해 ./tmp 아래에 두고
디버깅으로 오버플로우 시켜야할 크기를 확인해보자.
level16 이랑 너무 똑같아서 소름 끼칠 정도이다.
그래도 간단히 정리하자면,
buf 는 esp-56 위치에, call() 함수는 esp-16 위치에 존재한다.
즉, buf 에 입력으로 40 바이트를 채우고, call() 가 함수를 호출하는 자리에 환경변수 주소를 넣자.
넉넉히 nop 15바이트로 시작하는 환경변수 sc 를 만든다.
그리고 /level17/tmp 위치니까 getenv.c 도 새로 만들어준다.
이렇게 인자로 입력한 환경 변수의 주소값이 나오도록 짜서, 컴파일 한후 쉘코드를 넣은 환경 변수의 주소를 출력해보면
주소 출력 확인.
이제 페이로드를 작성해서 익스플로잇하면,
level18 password "why did you do it" 획득!
'WARGAME > FTZ [system]' 카테고리의 다른 글
ftz level 19 [level19] (0) | 2020.05.01 |
---|---|
ftz level 18 [level18] (0) | 2020.05.01 |
ftz level 16 [level16] (0) | 2020.05.01 |
ftz level 15 [level15] (0) | 2020.05.01 |
ftz level 14 [level14] (0) | 2020.04.30 |