본문 바로가기
System Hacking/해커스쿨 F.T.Z Hacking Zone

해커스쿨 F.T.Z level 11 FSB(Format String Bug)

by En_Geon 2020. 3. 3.

level 11을 이미 BOF로 해결했다.

 

level 20에서 포맷 스트링 버그를 다루기 때문에 level 20을 해결하고 포맷 스트링 버그 복습 차원으로 level 11에는 링크로 남겨두었던 포맷 스트링 버그도 발생하기에 BOF가 아닌 포맷 스트링 버그를 사용해서 해결해 보기 위해 level 11에서 포스팅 하지 않고 level 20을 해결 하고 포스팅한다.

 

FSB를 level 20에서 이해한 만큼 설명했으므로 바로 문제로 넘어간다.

 

 

 

level 11 로그인 후 hint를 본다.

 

level 11 hint

 

level 20과 같이 level 11에서도 printf 함수에서 포맷 스트링을 사용하지 않았기 때문에 여기서 FSB가 일어나게 된다.

 

포맷 스트링을 입력해본다.

 

포맷 스트링 입력

 

포맷 스트링을 입력하게 되면 메모리의 다음 4바이트 위치를 참조하여 포맷 스트링의 기능대로 출력한다.

 

level 20과 같이 여기서도 네 번째에서 "A"의 16진수가 나왔다. str[256] 배열이 읽힌 것이다.

포맷 스트링을 몇 번 써야 읽히는지 알았다면 이제 쉘코드 주소와 .dtors의 주소를 알아야 한다.

 

쉘코드를 주소는 많이 알아봤으니 이제는 쉽게 할 수 있을 것이다.

 

쉘코드 주소

 

objdump로 .dtors의 주소를 알아본다.

 

.dtors 주소

 

.dtors의 주소는 0804960c인데 RET에 쉘코드를 넣으려면 4byte 위에 있는 주소인 08049610에 넣어야 한다.

RET에 넣어야 한다는 것을 까먹고 .dtors에 넣는 실수를 하기 마련인데 그렇게 하면 segment fault가 일어난다.

 

.dtros 주소에 쉘코드 주소를 넣을 때는 "%c %n" 포맷 스트링을 사용하게 된다. 이때 사용하는 포맷 스트링은 10진수로 받기 때문에 쉘코드 주소를 10진수로 바꿔서 넣어야 한다.

쉘코드 주소인 bffff4c4를 10진수로 바꾸게 되면 3,221,222,596‬이 된다. int형을 벗어난 숫자고 이처럼 큰 숫자는 32bit PC에서는 입력할 수 없다. 따라서 하위 주소, 상위 주소를 나눠서 사용한다.

 

bffff4c4 4byte를 2byte씩 나눠서 사용한다. 리틀 엔디안으로 들어가기 때문에 뒤에서부터 넣어준다.

 

더보기

 

.dtors 주소보다 4byte 높은 주소인 08049610에 "f4c4(62660)" 2byte를 넣고 앞 주소에 2byte를 넣었으니 앞 주소보다 2byte가 높은 주소인 0804‬9612에 "bfff(49151‬)" 나머지 2byte를 넣어준다.

 

level 20에서 했듯이 여기까지 온 코드는 완벽하지 않다는 것을 알 것이다.

 

공격 코드에 나오는 포맷 스트링의 크기(byte)를 지정해주어야 한다. "%x"를 "%8x"로 8byte로 통일해준다. 그 이유는 "%x"를 사용하면 크기만큼 출력하므로 메모리에 어떤 값이 들어있는지 모르기 때문에 크기를 직접 설정해 알아보기 쉽게 하기 위해서다.

 

알아보기 쉽게 하는 이유는 %n은 %n이 나오기 이전까지의 입력 용량을 저장하므로 62660에 맞추기 위해서다.

앞 용량과 함께 62660을 맞춰야 하므로 앞 용량을 빼줘야 한다. 

 

AAAA (4byte) + \x10\x96\x04\x08 (4byte) + AAAA (4byte) + \x12\x96\x04\x08 (4byte) + %8x (8byte) + %8x (8byte) + %8x (8byte)

 

즉, "4 + 4 + 4 + 4 + 8 + 8 + 8" 40을 빼고 62620을 넣어줘야 한다.

%n이 뒤에 또 나오기 때문에 이때도 앞 용량을 빼줘야 한다. 뒤에 크기는 49151이고 62660을 빼고 넣어야 한다. 그러나 음수가 나오기 때문에 "bfff - f4c4"가 아니라 "1bfff - f4c4"로 보수를 이용해 뺄셈해야 한다.

그래서 다음에 올 숫자는 52027가 된다.

 

위 설명을 통해 얻은 코드는 다음과 같다.

 

"AAAA\x10\x96\x04\x08AAAA\x12\x96\x04\x08%8x%8x%8x%62620c%n%52027c%n"

 

코드를 알았으니 공격한다.

 

공격 실행

 

공격하면 긴 공백이 나온다. 

 

실행 후 공백

'System Hacking > 해커스쿨 F.T.Z Hacking Zone' 카테고리의 다른 글

해커스쿨 F.T.Z Level 20  (0) 2020.03.02
해커스쿨 F.T.Z Level 19  (0) 2020.02.29
해커스쿨 F.T.Z Level 18  (0) 2020.02.29
해커스쿨 F.T.Z Level 17  (0) 2020.02.27
해커스쿨 F.T.Z Level 16  (0) 2020.02.27

댓글