둘둘리둘둘리둘둘리둘둘리둘둘리둘

[Hacker school FTZ] Level20 -> Clear ! 본문

War game/해커 스쿨 FTZ

[Hacker school FTZ] Level20 -> Clear !

dool2ly 2015. 8. 21. 20:57

#include <stdio.h>

main(int argc,char **argv)

{ char bleh[80];

  setreuid(3101,3101);

  fgets(bleh,79,stdin);

  printf(bleh);

}


80byte의 bleh의 공간에 stdin으로 79byte를 입력받아 출력한다.

오버플로우 취약점은 찾을 수 없으니 포맷스트링 버그를 사용해 문제를 풀어야 한다.


-포맷스트링 버그란?

printf(bleh);처럼 인자 하나만 들어가면서 그 인자를 조작할 수 있을때, 그 인자에 %d,%s등이 들어가면 printf동작시 인자를 포맷 갯수만큼 인식하고 ebp+8(첫번째 인자 자리)에서 부터 4씩 높은주소의 [그림 1]과 같이 값을 출력한다.

[그림 1]


여기서 %n을 만나면 다음 인자값이 들어갈 자리가 가진 주소에 여태까지 출력했던 문자의 갯수를 저장한다. (%n은 printf로 출력했던 문자의 숫자를 저장한다 .

 예> printf("123%n",&a);에서 a는 3 )

이를 잘 이용하면 원하는 주소에 원하는 값을 넣을 수 있다.


RET주소나 SFP를 덮어쓸 수 없으니 main함수가 종료되고 실행되는 .dtor+4에 쉘 코드의 주소를 넣으면 main함수고 종료되고 쉘 코드를 실행할 것이다.

(dtor는 destructor의 약자로 main함수가 종료된후 실행되는 소멸자)




--풀이--



Comments