level19로 로그인한 후 hint를 확인해보면 소스코드가 나온다. 전 단계에서 많은 양의 코드를 보여줬기에 19 level은 더 많거나 복잡할 줄 알았지만 예상보다 간단했다. 소스코드도 작고 대놓고 gets 함수가 보여서 bof가 일어남을 알 수 있다. 공격은 gets를 통해 overflow를 일으켜 ret를 쉘 코드가 들어간 환경변수의 주소로 변조하면 될 것 같다.
이번 단계는 setuid가 없기 때문에 setuid가 포함된 쉘 코드를 써야겠다.
main의 함수 프롤로그 부분과 gets 함수 부분에 bp를 걸고 실행한다면 ret와 buf의 스택 주소를 알 수 있다.
ret : 0xbffff45c
buf : 0xbffff430
따라서 ret와 buf 사이의 거리는 44byte인 것을 알 수 있다. ret까지의 거리를 구했으니 이제 ret를 overwrite할 환경변수의 주소를 구해야한다.
환경변수에 쉘 코드를 삽입해주고 지난 단계들과 마찬가지로 비슷한 코드를 작성하고 빌드해서, 해당 환경변수의 주소를 구했다.
아래는 문제 풀이에 사용한 setuid가 포함된 32bit 쉘 코드다.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80
44byte의 더미 값을 준뒤 쉘 코드가 들어간 환경변수의 주소로 ret를 변조하니 쉘을 얻었다.
'Wargame > FTZ' 카테고리의 다른 글
[FTZ] level 18 (0) | 2021.06.06 |
---|---|
[FTZ] level 17 (0) | 2021.06.06 |
[FTZ] level 16 (0) | 2021.06.06 |
[FTZ] level 15 (0) | 2021.06.06 |
[FTZ] level 14 (0) | 2021.06.04 |