둘둘리둘둘리둘둘리둘둘리둘둘리둘
[Hacker school FTZ] Level20 -> Clear ! 본문
#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함수가 종료된후 실행되는 소멸자)
--풀이--
'War game > 해커 스쿨 FTZ' 카테고리의 다른 글
[Hacker school FTZ] Level19 -> Level20 (0) | 2015.08.20 |
---|---|
[Hacker school FTZ] Level18 -> Level19 (0) | 2015.08.20 |
[Hacker school FTZ] Level17 -> Level18 (0) | 2015.08.20 |
[Hacker school FTZ] Level16 -> Level17 (0) | 2015.08.20 |
[Hacker school FTZ] Level15 -> Level16 (0) | 2015.08.20 |
Comments