문제 힌트다.
fgets로 버퍼의 수를 제한하고 있다. 하지만 그래도 버퍼의 크기보다 큰 사이즈의 값을 저정할 수 있으므로 오버플로우가 가능하다.
먼저 스택의 구조를 상상해보면 아래와 같다.
buf[20바이트]
check[4바이트]
crap[4바이트]
버퍼에 오버플로우를 일으켜 check에 0xdeadbeef를 넣으면 system함수가 실행되면서 문제가 풀릴것이다.
GDB로 버퍼의 크기를 일단 확인해봐야겠다.
56바이트를 버퍼에 할당했다. 일단 fgets 함수는 45바이트 까지만 퍼버의 값을 채워준다.
0xdeadbeef랑 비교하는 구문이 있는데 이곳의 위치는 ebp-16이다 즉 check변수의 위치라는 것이다.
buf의 시작위치는 ebp-56이고 check의 위치는 ebp-16이다.
다시말해 buf에 40바이트 이상을 넣으면 오버플로우가 일어난다는 의미다.
간단하게 40바이트 뒤에 4바이트에 0xdeadbeef를 넣으면 system 함수를 실행할 수 있을 것이다.
쉘을 얻었다.
'Wargame > FTZ' 카테고리의 다른 글
[FTZ] level16@ftz (0) | 2017.11.25 |
---|---|
[FTZ] level15@ftz (0) | 2017.11.23 |
[FTZ] level13@ftz (0) | 2017.11.21 |
[FTZ] level12@ftz (0) | 2017.11.10 |
[FTZ] level11@ftz (0) | 2017.11.10 |