Double Stage Format String Bug (DSFSB)
개념
일반적으로 Format String Bug(이하 FSB)는 스택의 값을 조작하여 원하는 결과가 나타나도록 공격하는 방법 이지만. buffer가 전역으로 선언되어있고 스택에 존재하는 값을 변조할 적절한 값이 없을 경우 사용한다.
설명
기본적인 FSB는 변조하고 싶은 주소(got)를 넣고 해당 값이 나오는 곳에 %n 지시자를 이용해서 실제 실행하고 싶은 주소를 넣어 실행시키도록 하는 것이죠.
하지만 buffer가 전역으로 선언되어있으면 변조하고 싶은 주소(got)를 조작할 수 없게 됩니다.
이번 설명은 pwnable.kr의 fsb 문제를 이용하여 설명하도록 하겠습니다.
fsb 바이너리를 gdb를 이용해서 확인해보면 fsb라는 함수가 존재합니다.
위 영역은 fsb() 내의 for문 부분 입니다. 총 4번을 입력 할 수 있도록 만들어져 있습니다.
printf가 실행되기 전에 스택을 한번 확인해 보도록 하겠습니다.
위와 같이 입력한 상태에서 스택을 확인해보니 적절히 바꿀 값이 나타나지 않았습니다. 기본적인 fsb라면 입력한 문자열 AAAA에 대한 주소가 스택 상에 나타날 것인데 나타나지 않은 것을 보아 값을 넣는 buffer가 전역으로 선언되어있다는 것을 알 수 있습니다.
그렇다면 스택 상태는 저렇게 되있는데 어떻게 공격을 할 수 있을까요?
스택을 확인해보면 그래도 조작할 수 있는 값이 존재는 합니다. 다만 이 값을 가지고 어떻게 조작을 할 수 있는지가 문제죠.
값을 조작은 해야하니까 got를 변조시켜야 하는데 fsb.c 코드를 확인해보면 아래와 같습니다.
for문을 반복하고 난 뒤에 printf()가 또 나타나게되는데 이미 printf()가 한번 실행이 됬으므로 다음 실행시에는 바로 got로 이동을 하게 됩니다.
그러면 아래와 같이 작업을 할 수 있습니다.
먼저 스택의 상태를 확인해보면 0xbffef530 주소가 나타난 것을 알 수 있습니다. 해당 주소는 바로 ret주소 다음을 가리키고 있습니다.
이 주소를 이용할 것인데 got를 덮어야 하므로 0xbffef530 주소에 put@got를 넣어줍니다.
%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%134520748x%n
해당 위치에 적절하게 들어간 것을 알 수 있습니다.
그러면 0xbffed630에 입력된 0x804a00c에 execve가 실행되도록 주소를 넣어줍니다.
%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%8x%134514203x%n
쉘이 실행이 된 것을 알 수 있습니다.
Thanks melpin
'High Level Technique > System Hacking' 카테고리의 다른 글
Bypass Canary (0) | 2016.06.23 |
---|---|
Use After Free (UAF) (0) | 2016.06.02 |
SigReturn Oriented Programming (SROP) (4) | 2016.05.07 |
Return Oriented Programming (ROP) - final (0) | 2016.05.04 |
Return Oriented Programming (ROP) - step 2 (1) | 2016.05.04 |