티스토리 뷰
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주소가 실행된다.
'Hacking > System Hacking' 카테고리의 다른 글
PLT&GOT 공격 (DEP, ASCII Armor 우회, PLT&GOT Overwrite 공격) (1) | 2017.03.08 |
---|---|
RTL 공격(DEP 우회, 공유 라이브러리를 이용하여 공격) (0) | 2017.03.08 |
Buffer Overflow 환경변수 공격 (0) | 2017.03.08 |
Buffer Overflow Shell Code 이용 공격 (0) | 2017.03.08 |
[System Hacking] ShellCode 제작 (0) | 2017.02.25 |