티스토리 뷰
Format String Bug (32bit)
format string bug는
printf(string);
형식으로 사용했을 때 일어나는 버그이다. 이 취약점을 이용하면 memory write read 가 가능해진다.
읽기
%x 를 사용하면 메모리를 읽을 수가 있다.
현재 입력 값으로 printf("%4x %4x %4x") 를 주었다.
위는 printf 를 호출하기 전의 스택이다.
출력 값은 다음과 같다. 즉 간단히 $esp + 4 부터 차례대로 4바이트 씩 출력된다고 보면된다.
%p 를 사용하면 더 깔끔하게 출력 가능하다.
특정 위치에 있는 것을 출력하기 위해서는 %숫자$p 를 사용한다.
숫자 부분에 들어가는 숫자만큼 4*숫자 만큼 뒤의 메모리를 얻을 수 있다.
예를 들어 %2$p 를 사용한다면 8바이트 뒤의 메모리를 얻을 수 있다.
쓰기
이 때 write를 위해서 사용되는 것이 바로 %n인데 일반적으로 사용하는 출력에 사용되는 %s %d 와는 달리 %n은 %n전까지 출력된 문자열의 개수가 변수에 저장되는 기능을 가지고 있다. 저장된다는 것은 즉 write가 가능하다는 의미이고 출력되는 양을 조절해서 쓰여지는 값을 조작할 수 있다.
char string[20]="%10$p"
printf(string);
%p 사이에 10$ 형식으로 쓰면 4*$앞의 숫자 만큼 뒤를 출력해준다.
Format String Bug (64bit)
64비트의 포멧 스트링은 32비트와 다릅니다.
크게 두 가지가 다른데 첫 번째로는 %x 대신 %lx를 사용하는 것입니다. 물론 %x도 사용가능합니다. 4바이트냐 8바이트냐의 차이
먼저 %x 는 기본적으로 넣을 경우 4바이트를 출력해줍니다. 이 것은 64비트에서도 마찬가지 입니다.
이 때 64비트에 해당하는 주소 8바이트를 전부 읽기위해서는 %lx를 사용합니다.
그리고 두 번째로 %lx 를 쓴다고해서 바로 스택을 읽어오지 않는 다는 점입니다.
그 이유는 64 bit 운영체제에서는 스택 대신 레지스트리에 인자 값을 넣고 함수를 호출한 후 다시 스택에 넣는 방식을 사용하기 때문입니다.
이 때문에 %rdi, %rsi, %rdx, %rcx, %r8, %r9 다음부터 본래의 읽고 싶어하는 스택이 등장한다고 보면됩니다.
그래서 %7$lx 이후부터 사용하시면 됩니다.
'시스템 보안 > 취약점' 카테고리의 다른 글
powershell empire 설치법(ubuntu) (0) | 2017.02.10 |
---|---|
유형별 정리 (0) | 2017.02.05 |
2. code injection attacks (0) | 2016.10.11 |
1. c 와 c++ 에서의 취약점 발생 유형 (0) | 2016.10.11 |
Fuzzing 퍼징 도구 종류 (0) | 2016.10.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- vmware 오류
- VMware
- BP
- module
- 변환
- backdoor
- 루트킷
- 백도어
- gdb명령어
- 모듈
- rootkit
- 레거시 드라이버
- 디바이스
- 리눅스 모듈
- gdb 명령어
- LKM
- vmware cannot connect to the virtual machine
- IRP
- gdb intel
- GDB
- gdb intel 변환
- breakpoint
- PNP 드라이버
- 드라이버
- DriverEntry
- Intel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함