티스토리 뷰


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
링크
«   2024/05   »
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 29 30 31
글 보관함