이제부터 BOF문제가 주를 이룰 것이다.
힌트로 나온 소스코드를 보니 buf2라는 문자열 변수에 go라는 문자열이 들어가면 쉘이 따지는 구조이다.
buf2는 10만큼 주어졌고, buf도 10만큼 주어졌다.
우선 실행해서 작동시켜보자
아무일도 안일어난다..
이제 여기서 필요한것은 GDB!! GDB는 리눅스에 있는 대표적인 디버거이다.
gdb /usr/bin/bof를 입력하자. 그러면 권한이 level9는 실행만가능하기 때문에 디버깅이 되지 않는다.
고로 프로그램을 /home/level9/tmp에 직접 bof라는 프로그램을 c로 프로그래밍하고 컴파일까지하고 디버깅을 해보자
디버거 실행후 disas main으로 메인함수의 어셈을보자
main+3 부분을 보면 0x28만큼 뺀다고 되어있는데
통상적으로 먼저 선언한 변수들의 크기이다. 참고로 16진수다..
또한 제일 나중에 선언한 변수가 제일 낮은 메모리주소에 들어간다.
즉 변환하면 40이다.. 어..? 생각보다 큰데??
메모리 구조를 낮은 주소에서 높은 주소방향으로 대략적으로 그리면
크기 : 변수
10 : buf[10]
10 : buf2[10]
4 : SFP
4 : RET
가 되는데 총 28만큼 썼으며 앞에서 말한 40에서 12만큼의 공간이 남는다.
여기서 추가적으로 더미라는 개념도 들어가는데
소스코드의 일부분에 fgets와 strncmp 부분을 보자
lea ~~하고 주소부분을 보면 저 주소가 각각 buf, buf2라는 것을 짐작할 수가 있다.
(C 소스코드도 보면서)
그렇다면 저 두 차가 더미를 포함한 메모리의 크기가 되겠다.
계산하면 16이고 다시 메모리 구조를 낮은->높은 순으로 다시 작성하면
크기 : 변수
10 : buf[10]
6 : 더미
10 : buf2[10]
6 : 더미
4 : SFP
4 : RET
로 딱 40이 될 것이다.
그러면 답나왔다.
buf에 더미포함 16개의 의미없는 값넣고 go를 입력하면
buf2에 자연스럽게 go가 들어갈것이다.
공격에 성공하였고, Level10권한으로 쉘이 떨어진 것이다
저기서 my-pass 입력하면 패스워드 득!
'Pwnable > FTZ' 카테고리의 다른 글
FTZ Level11 풀이 (0) | 2016.07.15 |
---|---|
FTZ Level10 풀이 (0) | 2016.07.15 |
FTZ Level8 풀이 (0) | 2016.07.15 |
FTZ Level7 풀이 (0) | 2016.07.15 |
FTZ Level6 풀이 (0) | 2016.07.15 |