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 |