2015 32C3 readme writeup
by St1tch우선 실행파일을 살펴보면 stack canary와 nx보호기법이 적용되어 있는 실행파일이다.
스트링을 보면 TheServerHasTheFlagHere이라고 적혀있다.
아마 서버측에는 저 부분에 플래그가 있다고 방향을 제시해주는것 같다.
보라색 네모부분을 보면 입력을하고 엔터를 치면 32바이트 크기 - 입력한크기 만큼 초기화가 된다.
즉 입력한 문자열이 32바이트보다 작으면 0x600D20에 저장이된다.
따라서 ServerFlagHere어쩌고 적혀있는 문자열을 정상적으로 출력을 할 수가없다.
실행파일에 A를 많이 넣어서 보내면 세그먼트폴트가 발생하고 argv[0]이 출력되는듯 보인다.
이 argv[0]을 이용해서 flag를 출력할 방법을 찾아보았다.
디버깅을 하며 32C3이라는 문자열을 찾아보니 0x600d20말고 0x400d20에도 Flag문자열이 있는것을 찾을 수 있었다.
메모리맵을 보면 0x400d20에 있는 문자열은 write권한이 없기 때문에 이를 출력을 하면 될 것같다.
argv[0]의 주소를 알기위해 거리를 계산해보니 0x218만큼 나왔다.
간단하게 "A" * 0x218 + 0x400d20로 페이로드를 작성해서 보내니 세그먼트폴트 관련된 에러문자열이 넘어오지가 않았다.
확인해 보기 위해 socat을 이용해서 임시로 열어 페이로드를 보내보았다.
에러관련된 문자열이 넘어가지않고 서버에 남아 있다.
마찬가지로 클라이언트 쪽에서는 에러관련 문자열이 넘어오지 않았다.
마지막 stack smashing확인하는 부분까지 가면 왜 에러가 발생했는지 나타나있다.
getenv에서 LIBC_FATAL_STEDRR_을 찾을 수가 없다는 그런 내용이다.
구글링을 해보면 환경변수에 LIBC_FATAL_STDERR_=1 을 추가해주면 해결된다고 되있다.
이 문자열을 전달해주기 위해 두번째로 입력한 문자열이 저장되는 0x600D20주소를 이용했다.
거리를 재면 0x228이 나온다.
최종 페이로드이다. 간단하다.
그냥 환경변수와 argv[0]에 문자열주소를 오버플로우 시켜주면 되는 문제였다.
블로그의 정보
튜기's blogg(st1tch)
St1tch