Level9 로그인하고 힌트를 확인해 봅니다.



/usr/bin/bof의 코드를 주고 이를 이용해서 level10의 권한을 얻으라고 하네요.

파일 이름도 그렇고 코드 내용을 봤을 때 buffer overflow를 이용하여 문제를 풀으라고 하는것 같네요.

 

Buffer Overflow란 메모리의 크기보다 더 큰 데이터가 들어와서 다른 메모리에까지 영향을 주는 것을 말합니다.

해킹 공격의 기본이 되는 기법이기도 하죠. Buffer Overflow에 대한 추가 내용은https://ko.wikipedia.org/wiki/퍼_버플로를 참고하시기 바랍니다.

 

프로그램을 실행하면 메모리에 우선 할당이 되는데, 다음과 같은 형식으로 할당이 됩니다.

여기서 함수에서 선언한 지역변수는 stack영역에 들어가게 됩니다. 스택은 위에서부터 아래로 자라므로.

buf2[10]가 들어가고 그 아래에 buf[10]가 할당 되게 됩니다.

즉 프로그램에서 입력을 받아 값을 buf에 넣으므로 만약 buf[10]보다 큰 데이터가 들어오면  buf2[10]에도 영향을 주는 것입니다.

 

여기서 알아야 하는것은 메모리에 값이 들어갈때 어떻게 들어가는 지도 알아야 합니다.

지금 buf2[10]buf[10]은 메모리의 스택영역에 다음과 같이 들어가 있습니다.



메모리에 공간을 할당할때 Full Word Boundary에 맞춰 8의 배수로 할당 되므로, Buf[10]Buf2[10]사이에는 빗금친 6칸의 사용하지 않는 공간이 존재합니다.

 

입력이 buf[10]에 되니깐 만약 01234라는 5자리의 데이터를 집어넣으면 다음과 같이 들어갑니다.



즉 할당된 메모리의 오른쪽부터 값이 들어갑니다. 왜냐하면 메모리의 번지가 낮은쪽 부터 채우기 때문입니다. 그림상에서 왼쪽이 높은 주소이고 오른쪽이 낮은 주소입니다.

 

입력값이 hackerschool ftz level9이라면 10자리가 넘고 Buffer Overflow가 발생해 다음과 같이 들어갑니다.



코드를 보면 strncmp(buf2, “go”, 2) ==0 buf2의 앞 두 글자가 “go”면 권한이 상승이 되고 쉘이 열리게 되어 있네요. 즉 메모리에 go가 다음과 같이 들어가도록 해야 합니다.



이렇게 값이 들어가려면 16자리의 글자 뒤에 go를 붙여 주면 될것 같습니다.

0123456789123456go라고 입력해 보겠습니다.


원했던 Good Skill!이 출력되고 level10권한으로 쉘이 실행됨을 볼 수 있습니다.

이제 my-pass로 비밀번호를 확인하면 level10의 비밀번호를 획득 하실 수 있습니다.

Level10의 비밀번호는 interesting to hack!입니다.

 

사실상 이문제는 go8번 이상 출력하기만 하면 풀리는 문제입니다만, 원리를 확실히 짚고 넘어가시는 것이 좋습니다. 메모리에 프로그램이 할당 되는 것과, 변수가 스택에 어떻게 할당 되는지, full word boundary가 무엇인지 등 중요한 개념이 많이 나오니 꼭 숙지하고 넘어가셨으면 합니다.

+ Recent posts