본문 바로가기
Hack/ftz

ftz 풀이 level20

by Choraengyi 2017. 1. 12.
728x90

 ftz level20 풀어보겠습니다.


힌트조회 입니다.



 BOF 문제 인줄 알았는데 fgets으로 받는 크기가 79로 배열크기 보다 작아서 바로 다른 방식으로 넘어갔습니다.


FormatString Attack 으로 해보겠습니다. 우선 메모리를 조회해 보겠습니다.



 심볼을 막아놓았습니다. 더욱 BOF의 가능성이 희미해졌습니다.



시험삼아 프로그램을 돌려 보았는데 문자는 그대로 출력하나, %x(서식문자)를 넣으니 알 수 없는 값이 출력되었습니다. 이를 포맷스트링 취약점이라고 합니다. 


힌트에 보면 printf(bleh); 로 되어 있는데 보통 형식과는 다름을 알 수 있습니다. 보통은 printf("%x", bleh); 이러한 방식으로 써서 bleh의 주소를 넘겨 해당 형식에 맞게 출력하게 되는데, 그냥 전자 처럼 써도 문자열 출력에는 이상이 없습니다. 하지만, bleh 안에 서식문자가 들어있으면 다음 원하는 내용을 출력하는게 아닌 다음 스택 부분의 메모리를 출력하게 됩니다. 


 대강 메모리 구조를 유추해 보았습니다.


printf()+dummy+bleh+dummy+sfp+ret


 이를 이용하여 메모리에 접근할 수 있습니다. 저희의 목표는 ret에 접근해 쉘코드를 넣는 것이기 때문에 내용을 바꿀 수 있는 기능이 필요합니다. 이 기능을 갖춘 것이 서식문자 %n 입니다.



 위의 코드를 보면 %n 앞에 여러 서식문자를 쓰고 12123345678 의 상수를 출력하게 하였습니다. 총 11문자인데, 우선 %n의 값은 이전에 출력된 문자의 크기를 해당 메모리주소로 가서 값을 넣어주는 역할을 하게됩니다. 여기서는 11을 &a로 가서 a의 값을 11로 넣어준다고 생각하시면 됩니다. 


이러한 %n을 사용하여 원하는 메모리의 주소를 삽입하거나 덮어 쓰는 것이 포맷스트링 버그 입니다. 


다시 한번 attackme 를 실행해 보겠습니다. 



 서식문자를 사용하면 스택 다음 부분의 메모리를 출력하게 되는데 AAAA를 넣고 %x 로 다음부분을 계속 출력해본 결과 dummy의 값이 나오는 것같습니다. 그러다가 4개째 출력할때 A의 값인 41 이 나오는 것을 볼 수 있습니다. %x의 값이 3개 이후에 출력됬으니 더미는 12Byte로 추정가능합니다.


printf()+dummy(12)+bleh+dummy+sfp+ret


 그 다음, 쉘코드를 집어 넣을 주소를 알아야 하는데 gdb로 파악이 힘들어서 .dtors 영역에 덮어 씌우기로 했습니다. 간단히 말하면 .dtors 는 main함수 종료후에 실행되는 것으로 main이 종료되고 실행됨을 이용하여 그부분에 쉘코드를 덮어 씌워 실행하는 방식으로 접근 하겠습니다.


.dtor 에 대한 설명은 아래를 참고하시기 바랍니다.


http://bbolmin.tistory.com/34


objdump -h attackme | grep .dtors


명령어로 주소를 조회 합니다.(-h 명령어는 헤더부분을 출력하는 옵션)



 2번째 부분의 08049594 부분에 +4를한 08049598이 쉘코드를 집어넣을 주소입니다. 첫 주소는 건드리면 안되어 +4를 해준다고 들었는데, 더 명확하게 공부하고 확실한 정보가 있으면 해당내용에 대해 따로 올리겠습니다.


우선 쉘코드를 만들어 줍니다. 많이 한거라서 따로 설명 더 안하겠습니다.



**쉘코드 주소 bffffed0로 되어 있는데 중간에 튕겨서 다시 만들어서 bffffee5 로 바뀌었습니다. 


문제는 bffffee5를 10진수로 환산하게 되면 3,221,225,189 가 되는데 int형의 크기를 벗어 낫기 때문에 읽을 수가 없습니다. 그래서 2바이트씩 갈라져서 사용하여 bfff = 49151, fee5 = 65253 으로 나뉘게 됩니다. 2바이트로 나누었기 때문에 08049598도 2바이트씩 잡아서 08049598 와 0804959a 로 나누어 각각 값을 넣어주면 됩니다.


 문자크기를 계산해 넣는거라서 곧이 곧대로 문자를 65253개를 넣어줘도 되지만 너무 많기 때문에 서식 문자의 특성을 이용하겠습니다. %65253c 같은 방식으로 넣어주면 65253개 만큼 공간이 생기기 때문에 저 방식으로 넣어줍니다.


여기서 AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08 이렇게 %n 앞에 써주는데, AAAA는 %65253c 의 pop을 위한 공간이고 그 뒤의 주소는 fee5가 들어가게 되고, 뒤의 AAAA는 %49151c 의 pop 그 뒤의 주소는 bfff 가 들어가는 공간이 되겠습니다. 


계산을 하게 되면 원래 65253인데 앞에 총 16문자가 들어갑니다. 그리고 나서 아까전에 12바이트 이후에 삽입한 값에 접근할 수 있었으므로 %x 를 3개 더 넣어 16+12 를 뺀 65219가 최종 크기가 되고, 뒤의 49151은 65253(65219+16+12)를 빼면 음수가 나오므로 1bfff = 114687 로 계산하여 114687-65253 = 49434 로 계산 하여 넣어줍니다.


최종 코드를 보면 fgets 함수이기 때문에 cat 과 | 를 연동하여 사용하면 됩니다.


"AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08"+"%x"*3+"%65219c%n"+"%49434c%n"



성공적으로 실행되었습니다. 부족한 점이 많았지만 어찌어찌 ftz를 전부 풀어보았습니다.


728x90
반응형

'Hack > ftz' 카테고리의 다른 글

ftz 풀이 level19  (0) 2017.01.11
ftz 풀이 level18  (0) 2017.01.08
ftz 풀이 level17  (0) 2017.01.06
ftz 풀이 level16  (0) 2017.01.06
ftz 풀이 level15  (0) 2017.01.04

댓글