티스토리 뷰



Format String Bug 공격





1. Format String Bug 개요



Format String에는 특수 이스케이프 시퀸스가 존재한다.


인자

출력 유형

참조

%d

10진수

%u

부호 없는 10진수

%x

16진수

%s

문자열

포인터

%n

지금까지 출력한 바이트 수

포인터




 

[formatstring정상 사용]


 

[formatstring비정상 사용]




위와 같은 printf 함수의 인자 값을 줄 경우 format string bug를 이용하여 원하는 코드를 삽입하여 실행할 시킬 수 있다.

*Printf 함수의 동작원리

1.     포맷스트링을 한 문자씩 읽는다.

2.     포맷 인자가 아니면 출력한다.

3.     포맷인자면 ESP+4 값의 포인터로부터 NULL을만날때까지 출력한다. (문자열출력)

위 코드에서는 printf(buf) 이기 때문에 사용자 입력값으로 printf함수의 인자 값 전체를 조작할 수 있다. 예를 들어 %x%s%n 등과 문자와 함께 입력하여 printf를 원하는 방법으로 조작이 가능해진다.

 %n을 이용하여 출력바이트 수를 정수형태로 쓸 수 있다정수형태의 값으로 특정 메모리주소로

변조한 후 RET 위치로 Overwirte하여 원하는 코드를 실행할 수 있다





2. Format String Bug 구현 및 분석



 

[그림 - 비교 실행]



 

[그림 - GDB분석]

 

STACK 구조는 다음과 같다.


 


[그림 - 스택구조 확인]


 

[그림 - GDB분석]

%x ESP+4 위치에서 확인할 수 있다.

%x 여러 번 넣어 스택에 위치를 가늠할 수 있다


 

[그림 - %x로 스택 확인]


 

[그림 - /tmp/test  dtors 확인]


 

[그림 - /tmp/test dtors 확인]


Main  함수 종료 후 실행되는 dtors의 공간을 활용한다. 주소 값이 변하지 않으므로 공격에 수월하다.

위와 같이 bad 프로그램의 dtors의 주소를 구하여 shellcode 주소를 삽입 할 수 있다.


 

[그림 - /tmp/bad dtors 확인]


FFFFFFFF 00000000 의 사이 값의 주소는 0x8049530+4 = 0x08049534 이다.


 

[ 그림 - shellcode주소 확인]


미리 환경변수에 저장해둔 code1 0xBFFFFF11 주소를 정수로 변환하여 삽입하여야 한다.

BFFF FF11 을 정수로 변환하면 3,221,225,233 이다. 이 값을 한번에 넣을 수 없으므로

%hn을 이용하여 2byte씩 넣는다.


 

 

Shellcode 주소

DTOS 삽입 주소

16진수

BFFF(2byte)

FF11(2byte)

0x08049534(2byte)

0x08049536(2byte)

10진수

49151

65297

65297

49151






 

위 표대로 넣으면 %n 공격에 실패한다. %n은 지금까지 입력한 글자수만큼의 수를 출력하기 때문에 앞에 출력한 수를 빼줘서 나중 2byte 값을 넣어줘야 한다.

0x08049534(2byte) 에는 65297(FF11) 앞쪽 payload 40을 뺀  65257

0x08049536(2byte) 에는 114687(1BFFF) – 40 – 65257 = 49390

Payload : ./bad `python -c 'print "AAAA"+"\x34\x95\x04\x08"+"AAAA"+"\x36\x95\x04\x08"+"%8x%8x%8x"+"%65257c"+"%hn"+"%49390c"+"%hn";'`


 


 

[그림 - 공격 성공]


계산한 값으로 공격을 실행하면 main 함수가 종료됨에 따라 dtors에 복사한 shellcode주소가 실행된다







Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday