level8에서 얻은 ID, PW로 접속한다.
힌트를 읽었더니 이러한 코드가 나왔다.
buffer overflow를 이용하여 풀어야하는 문제인 것 같다.
buf2, buf 순서대로 변수가 선언되었으므로 스택에 아래처럼 저장된 것을 알 수 있다.
buf2 |
buf |
buf의 메모리가 주어진 값보다 더 들어가게 될 경우 buf2의 메모리를 건드릴 수 있다.
메모리 할당은 8의 배수로 할당되기 때문에 아래 그림처럼 메모리가 할당된다.
┌------------------- buf2 -------------------┐┌------------------- buf -------------------┐
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
X부분은 사용하지 않는 구간이다.
주어진 코드를 해석하면 buf2의 첫 두자리가 go인 경우 level10의 권한으로 쉘이 실행된다.
따라서 데이터를 아래와 같이 입력한다.
┌------------------- buf2 -------------------┐┌--------------------- buf -----------------┐
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
o |
g |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
즉, 앞 16자리는 아무 문자나 적어주고 그다음 두자리에 go를 적어주면 된다.
이렇게 입력한다. 그리고 my-pass를 입력해주면 패스워드를 얻을 수 있다.