2021-09-09 · 2

[시스템해킹] FSB(Format String Bug) 이란?

securitypwnable

이 글은 작성된 지 2년이 넘었어요. 내용이 오래됐을 수 있어요.

FSB(Format String Bug)


FSB(Format String Bug)란 버퍼 오버플로우 해킹 기법중 하나이며 사용자의 입력을 통해 프로그램의 흐름을 바꿀 수 있는 취약점이다.

FSB(Format String Bug)

  1. printf의 인자 개수는 포맷 문자 개수로 결정됩니다.
  2. buf의 값에 우리가 마음대로 입력이 가능하다면 우리가 원하는 포맷문자를 넣어서 조작이 가능해집니다.
  3. BOF가 발생하지 않아도 원하는 값을 얻을 수 있습니다.

printf("%d", 변수); 와 printf("%d")

오른쪽으로 상황에서는 FSB취약점이 발생하여 main 함수 스택의 내용을 모두 노출 시킬 수 있습니다.

%p 출력

  1. %p를 통해 다음 주소를 유출 시킬수 있으며 %[숫자]$p를 통해 숫자만큼 떨어져 있는 메모리를 출력 가능하다.

2번째에 AAAA에 들어간 모습이다

위와 같이 입력하게 되면 다음 스택의 메모리를 유출시킬수 있습니다. 위에선 두번째 %p에 우리가 입력한 AAAA가 들어간 모습을 확인할 수 있습니다. 이때 offset는 2입니다.

%n 입력

  1. 이번에는 유출시키는 것만이 아니라 스택의 값을 변조 시켜주는 것 입니다.
  2. %n은 지정된 변수에 %n 전까지 출력된 문자의 개수를 지정된 변수에 10진수 형식으로 써줍니다.
  3. %n : 4byte %hn : 2byte %hhn 1byte

printf의 포맷문자

<table style="border-collapse: collapse; width: 100%; height: 180px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">%s</td><td style="width: 50%; text-align: left; height: 20px;">문자열 '\0'를 만날때 까지 출력</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%c</td><td style="width: 50%; height: 20px;">문자 1개</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%d</td><td style="width: 50%; height: 20px;">+/- 부호 있는 정수형</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%x</td><td style="width: 50%; height: 20px;">정수를 16진수 소문자로</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%p</td><td style="width: 50%; height: 20px;">0x ~형태의 포인터값 출력 %lx와 같음</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%lx</td><td style="width: 50%; height: 20px;">8byte 16진수 출력</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%ld</td><td style="width: 50%; height: 20px;">long 정수 형</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%f</td><td style="width: 50%; height: 20px;">실수형</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%u</td><td style="width: 50%; height: 20px;">부호 없는 정수 </td></tr></tbody></table>

python에서

실제 fsb코드에서는 매우 복잡해 지는데 이를 파이썬 pwntools에서 쉽게 해결할 수 있습니다.

fmtstr_payload(offset, writes) 를 사용하게 되면 아주 간단하게 fsb를 할 수 있습니다.

fmtstr_payload(6, {e.got['printf']:e.symbols['win']})

위와 같이 적으면 offset이 6일때 printf가 win함수가 되게 만들 수 있습니다. 

참고

더보기

https://snwo.tistory.com/147

https://jiravvit.tistory.com/entry/64bit%EC%97%90%EC%84%9C-FSB-Format-String-Bug-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1


원문: tistory — 2021-09-09 발행, 이 블로그로 이전됨.

댓글

댓글을 삭제할까요?

관련 글

[시스템해킹] FSB(Format String Bug) 이란? · 나봄하랑