본문 바로가기

시스템/등드등

Format String Bug

Format String Bug


포맷 스트링을 이용한 공격 기법으로 printf()함수의 취약점을 이용


ex)

fgets(buf, sizeof(buf), stdin);

printf(buf);


문자열일 때는 정상적으로 문자열로 인식하지만 

서식문자를 넣었을 경우 문자열로 인식하지 않고 서식문자로 인식한다.

서식문자를 만나면 메모리의 다음 4byte 위치를 참조해 그 서식문자의 기능대로 출력한다.

ex. %d를 입력 -> 메모리 다음 위치에 있는 값을 10진수로 출력



format string       

    




예를 들면,

    


여기서 "AAAA %p %p %p %p %x %x %x" 를 입력했을 때


printf 호출하기 직전 스택의 상태

    


중요한 것만 정리해보면

   


즉, 출력할 때 각 포맷 스트링이 참조하는 것은

    


출력은 당연히 아래처럼 된다.  

    


중요한 건 %n : %n에 현재까지 출력한 바이트 수가 입력된다.


만약 위의 출력대로 %n을 적용해보면

   

%n가 있는 위치 0x41414141(AAAA)에 현재까지 출력한 바이트 수가 입력된다.

즉, AAAA(4) + 공백(1) + 0x40(4) + 공백(1) + 0xf7ed45c0(10) + 공백(1) + 0x565bc5e4(10) + 공백(1) + 0(1) + 공백(1) + 0(1) + 공백(1) = 47byte

0x41414141에 47이 들어간다.


여기서 주의할 점은 %n은 int* 의 역할 

0x0804a01c 같은 주소를 %n을 사용해서 변화하고 싶으면 %hn이용 ( %hhn :1bit )  

-> little endian 으로 저장되어있음 (\x1c\xa0\x04\x08)

ex) 0x0804a01c -> 0x80485ab (%7$x부터 교체가능)


0x0804a01c -> (0x080485ab & 0xffff) -> 0x85ab + %7$hn 이용해서 0x0804a01c의 하위 2byte(0xa01c) 교체 

0x0804a01c +2 -> 0x804a01c의 상위 2byte(0x0804) 교체(little endian) -> 0x10804 + %8$hn = (0x10000 + (0x804a01c >> 16)) + %8$hn


   








'시스템 > 등드등' 카테고리의 다른 글

Wannacry 1차 정리본  (0) 2019.01.26
pwntools 간단 정리  (0) 2019.01.11
ELF 파일 구조  (3) 2018.11.20
간단한 정리  (0) 2018.11.19
ARM Assembly 간단 정리  (0) 2018.11.05