로그인을 해준다.
평소와 같이 파일과 디렉토리를 확인하여
hint파일을 확인한다.
힌트를 쭉 살펴보면 우선 C언어로 이루어진 코드라는 것을 알수 있다.
먼저 buf2를 선언해주고 다음 buf를 선언한 후에
"It can be overflow : "를 출력하여
입력을 받아서 buf에 저장한다.
다음 buf2와 "go"라는 문자를 비교하여 같으면
if조건 안의 명령들이 실행이 된다.
그럼 일단 /usr/bin으로 이동해보자.
다음 bof실행파일을 실행하자.
우선 1을 10개 입력하여 결과를 보자.
역시 실패인 것 같다.
그럼 1을 10개 입력한다음 go라는 문자를
입력해보자.
여기서 go라는 문자를 1뒤에 입력하는 이유는
오버플로우때문에 한번 써보았다.
오버플로우란. 이 문제를 가지고 설명을 하면
우선 보다시피 buf배열은 10개의 공간을 가지고 있다.
그럼 만약 12개가 입력이 된다면 buf배열을
다 채운 후에 남는 2개를 다음배열인
buf2에서 채우는 것이다.
즉. 입력된 것을 모두 저장하기 위해
자신이 할당된 크기 외에 자기 바로 다음의
영역까지 사용하여 저장하는 것이다.
그러나 이것도 실패이다.
그렇다면 무엇이 문제일까?
gdb명령어로 디버깅을 해서 자세히 보자.
gdb란. 그 프로그램 내부에서 무슨 일이 일어나고 있는지
보여주거나 프로그램이 잘못 실행되었을 때
무슨 일이 일어나고 있는지 보여주는 것이다.
gdb [프로그램명]으로 시작한다.
disas [함수명] : 특정 함수의 어셈블리 코드를 출력한다.
보다시피 위에서부터 아래순으로 동작이 되는 것 같다.
그러면 0xffffffd8(%ebp)가 buf인 것이고
0xffffffe8(%ebp)가 buf2인 것 같다.
그런데 hint에서는 분명 각각 10씩 할당해주었는데
디버깅을 해보니 buf와 buf사이는 16의 차이가 난다.
그러면 6의 차이가 아마 쓰레기 값일 것이다.
그렇다면 buf2는 아마도 16번째 이후,
즉. 17번째부터 채워질 것이다.
그럼 다시 돌아가서 시도해보자.
성공하였다.
그럼 이제 level10권한을 얻었으니
my-pass로 level10으로 가는
password를 한번 알아보자.
'코딩 문제 > 해커스쿨' 카테고리의 다른 글
FTZ : level11 (0) | 2019.06.29 |
---|---|
FTZ : level10 (0) | 2019.01.22 |
FTZ : level8 (0) | 2019.01.16 |
FTZ : level7 (0) | 2019.01.14 |
FTZ : level6 (0) | 2019.01.14 |