Write-up

[hackerschool ftz] level11 writeup (format string attack)

ch4rli3kop 2017. 10. 30. 17:50
반응형

간단히 format string attack 에 대한 기억도 되살릴겸 FTZ 문제를 풀어봤다. 포맷스트링 버그로 풀 수 있는 문제가 level11밖에 생각이 안나서 11로 진행하도록 하겠다.



문제는 다음과 같다. strcpy는 널문자를 만나기전까지 모두 카피하므로 버퍼오버플로우가 일어날 수 있지만, 포맷스트링 공격에 대한 공부를 진행하므로 printf에서 보이는 포맷스트링 버그에 대한 취약점으로 익스플로잇을 진행하도록 하겠다. (포맷스트링 공격에 대한 설명은 생략하겠다. 아니 어쩌면 문제를 풀며 진행할 수도)


먼저 내가 입력한 인자 값이 stack 상에서 어디쯤 위치하는지 보도록 하겠다. 어셈블리 코드를 보고 알 수도 있겠지만, 그냥 직접 값을 넣어보며 거리를 계산하도록 하겠다.



현재 AAAA를 입력했고, 브레이크 포인트는 printf 함수를 call 하기 바로 직전에 걸려있다. 이 상황에서 스택을 보면, 위와 같다. 현 esp 는 어떤 스택의 주소를 가리키고 있는데, 그 주소에는 입력한 AAAA 가 아스키 값으로 저장되어 있다. 


SFP (EBP of main)

 

 RET (to main)

 Pointer to user's input

 ~~~~

 <- Counter (기본, 아직 어떤 형식문자도 만나지 않았을 때)

 ~~~~

 <- Next Counter (형식문자를 만났을 때)

 AAAA

 

 ....

 ~~~~

 SFP

 RET















형식문자를 만날 때마다 Counter가 하나씩 밑으로 내려간다. %n 이라는 형식문자는 그 카운터가 가리키고 있는 위치의 값을 주소로 인식하여 현재까지 출력된 문자의 수를 그 주소에 입력하므로, 우리는 여기서 카운터가 세 번 내려가야함을 알 수 있다. 즉 세 개의 형식문자 출력 후, %n이 와야한다. 한 번 테스트를 해보자.



다음과 같은 명령어를 입력하였다. 내가 생각하고 있는 것이 제대로 된 것이라면, 임의로 정해준 주소인 0xbfffe6e0 에는 7(앞의 주소 값 4개 + 뒤의 %c 3개) 이라는 값이 들어가야한다.


#스택의 주소 값에 변동이 있는 것을 양해바랍니다. 기존의 브레이크포인트와 똑같이 printf 를 call 하기 바로 직전인 상태입니다. 조건은 같습니다. #



0xbfffe6e0 이 제대로 들어간 것이 보인다. 아직 printf 를 call 하기 전이므로 어떠한 값이 들어있어도 이상하지 않다. 다행히 0으로 깨끗한 상태이다.



printf 를 call 하였다. 0xbfffe6e0 주소를 확인해보았더니 다행히 예상했던 값이 들어갔다.

이제 포맷스트링 공격에 대한 기본 원리를 파악했으니 어떻게 쉘을 딸지 궁리해보자. 


리턴어드레스의 값을 쉘 코드가 있는 주소로 덮어씌워 공격을 해보도록 하겠다. 먼저 쉘 코드는 넷 상에서 돌아다니는 코드를 사용하고 이 쉘 코드를 환경변수에 등록시켜 사용토록 하자.



이렇게 등록된 환경변수의 주소를 알아내는 프로그램을 간단하게 짜보았다.



gcc -o 를 이용하여 컴파일을 시키고 실행해본다. (실행 시 디렉토리마다 결과 값이 다르다는 사실을 신경쓰도록 하자.)



이제 얼추 준비가 되었다. 이제 리턴어드레스를 0xbffffc0e 로 덮어쓰면 쉘을 딸 수 있을 것이다. 그렇게 하기위해 마지막으로 리턴어드레스의 주소를 구해보도록 하자. 



아까 브포가 걸린 지점이다. 여기서 ebp는 메인함수의 EBP 부분이므로 그로부터 4byte 떨어진 0xbfffee4c 가 바로 메인함수의 ret 이다. 사실 이것은 정확한 주소 값이 아니지만, 그것에 관해서는 나중에 다루겠다.


이제 다 왔다. 구한 ret 에 환경변수의 주소를 구하는 프로그램의 결과 값을 집어 넣어주기만 하면 된다. 지금까지 나온 페이로드 결과 값들대로라면 다음과 같이 페이로드를 짤 수 있다.


./attackme `python -c 'print "\x4c\xee\xff\xbf" + "\x4e\xee\xff\xbf" + "%64518c%4$hn" + "%50161c%5$hn"'`


뒤의 50161은 BFFF - EE4C - 8 < 0 이므로 1BFFF - EE4C - 8 한 결과 값이다.


.................





반응형