728x90
FSB(Format String Bug)
FSB(Format String Bug)란 버퍼 오버플로우 해킹 기법중 하나이며 사용자의 입력을 통해 프로그램의 흐름을 바꿀 수 있는 취약점이다.
FSB(Format String Bug)
- printf의 인자 개수는 포맷 문자 개수로 결정됩니다.
- buf의 값에 우리가 마음대로 입력이 가능하다면 우리가 원하는 포맷문자를 넣어서 조작이 가능해집니다.
- BOF가 발생하지 않아도 원하는 값을 얻을 수 있습니다.
오른쪽으로 상황에서는 FSB취약점이 발생하여 main 함수 스택의 내용을 모두 노출 시킬 수 있습니다.
%p 출력
- %p를 통해 다음 주소를 유출 시킬수 있으며 %[숫자]$p를 통해 숫자만큼 떨어져 있는 메모리를 출력 가능하다.
위와 같이 입력하게 되면 다음 스택의 메모리를 유출시킬수 있습니다. 위에선 두번째 %p에 우리가 입력한 AAAA가 들어간 모습을 확인할 수 있습니다. 이때 offset는 2입니다.
%n 입력
- 이번에는 유출시키는 것만이 아니라 스택의 값을 변조 시켜주는 것 입니다.
- %n은 지정된 변수에 %n 전까지 출력된 문자의 개수를 지정된 변수에 10진수 형식으로 써줍니다.
- %n : 4byte %hn : 2byte %hhn 1byte
printf의 포맷문자
%s | 문자열 '\0'를 만날때 까지 출력 |
%c | 문자 1개 |
%d | +/- 부호 있는 정수형 |
%x | 정수를 16진수 소문자로 |
%p | 0x ~형태의 포인터값 출력 %lx와 같음 |
%lx | 8byte 16진수 출력 |
%ld | long 정수 형 |
%f | 실수형 |
%u | 부호 없는 정수 |
python에서
실제 fsb코드에서는 매우 복잡해 지는데 이를 파이썬 pwntools에서 쉽게 해결할 수 있습니다.
fmtstr_payload(offset, writes) 를 사용하게 되면 아주 간단하게 fsb를 할 수 있습니다.
fmtstr_payload(6, {e.got['printf']:e.symbols['win']})
위와 같이 적으면 offset이 6일때 printf가 win함수가 되게 만들 수 있습니다.
참고
728x90
'해킹 > 시스템해킹' 카테고리의 다른 글
[시스템해킹] HackCTF < Basic_FSB > (0) | 2021.09.09 |
---|---|
[시스템해킹] HackCTF < Basic_BOF #1 > (0) | 2021.09.09 |
[시스템해킹] GrabCON Pwn CTF? write up (0) | 2021.09.09 |
[시스템해킹] GrabCON can you? write up (0) | 2021.09.09 |
[시스템해킹] GrabCON easy_bin write up (0) | 2021.09.09 |