
Level16
level16의 계정으로 접속하여 hint를 확인해보면 다음과 같습니다.

코드상으로 보았을 때, 메인에 있는 call 함수를 이용해 shell()함수를 불러 온다면, level17권한의 shell을 실행시킬 수 있을 것 같습니다. 메모리 구조를 알아보기 위해 먼저 tmp폴더에 코드를 복사해온 후 코드 한 줄을 추가하여 실행시켜 보았습니다.

이번에는 gdb를 이용하여 attackme를 분석해 보았습니다.

위 두 분석을 토대로 메모리 공간을 도식화 해보면 다음과 같습니다.

call 함수를 통해 shell() 함수를 실행시켜야 하므로, shell()함수의 주소가 필요합니다. gdb
를 이용해 shell()함수의 주소를 알아옵니다.

shell을 disassemble 하면 shell 함수의 시작 주소를 알 수 있습니다. 40byte만큼 임의의 문자열을 채워주고, shell()함수의 주소를 넣어주면, call함수가 shell()함수를 실행시킬 것입니다.

level17의 shell이 실행됨을 알 수 있습니다.
No comments:
Post a Comment