Format String bug
포멧 스트링 버그는 printf 함수 등에서 사용되는 포멧 스트링(%d, %s...)을 잘못된 형태로 사용할 경우 발생하는 버그이다. 포멧 스트링은 데이터를 어떤 형식에 따라 입력받거나 출력하기 위하여 사용하는데 형식을 잘못사용하면 메모리의 데이터가 유출되고 변조될 수 있다.
포멧 스트링 버그는 메모리 릭, 메모리 변조 모두 가능하기 때문에 취약점이 발생하면 exploitable할 가능성이 높다.

printf함수는 아래의 두가지 방법으로 사용할 수 있다.

printf(BUFFER)
printf("FORMAT_STRING", BUFFER)

포멧 스트링 버그는 포멧스트링을 사용하지 않고 바로 BUFFER를 출력하는 첫번째 printf 함수 사용법에서 발생한다. 만약 BUFFER 안에 %x, %d등 포멧 스트링이 들어가면 printf함수는 그것들을 포멧스트링으로 보고 두번째 printf 함수 사용법과 같이 동작하여 스택 메모리를 유출시킨다.

<정상적인 printf함수 스택>


<포맷스트링 취약한 printf함수의 스택>


fsb.c





여기서 아래의 LEAK을 출력을 하려면
LEAK의 주소를 확인하여 AAAA대신 LEAK의 주소를 넣고 해당 맵핑되어있는 41414141부분에 %s를 사용하여 해당주소의 데이터를 출력한다




formatstring메모리변조

%n : 현재까지 읽은 byte의 수를 출력해준다


0xffffd124주소에 현재까지 입력받은 바이트수를 hex값으로 넣는다


%n바이트 수를 조절하려면 띄어쓰기 등등 편법을 써야한다 
%x형태의 포맷스트링을 %20x처럼 띄어쓰기를 늘려서 입력되는 값을 변화를 시킨다

...


%n자체가 2btye씩 출력이되기때문에 4btye메모리 변조를하려면 2byte다음주소인 0xffffd126에 BBBB를 조작하여 원하는 메모리주소값으로 바꾼다.

 

iffsb

예제소스



gdb로 디버깅을 하여 info variables명령어를 사용하여 전역변수정보를 확인한다
tartget변수의 주소값을 알아낼수있다 (0x0804a048)


python -c 'print "AAAA\x48\xa0\x04\x08 %54x %n"' | ./iffsb
포맷스트링버그를 사용하여 target주소값을 %n을 사용하여 64로 조작한다.
그후 소스코드의 cat flag명령을 실행하게 된다

+ Recent posts