Hacking/System Hacking

FSB(Format String Bug) 취약점

chipkkang 2022. 2. 9. 16:38

Format String Bug(FSB)란?

FSB는 printf와 같은 포맷 스트링을 이용하는 함수에서 발생하는 취약점으로, 서식문자를 사용하지 않고 값을 출력할 때 발생한다. 

 

ELF

ELF: 적용되어 있는 보호기법을 보여주고, plt, got등 필요한 가젯들을 찾아준다.

e = ELF("./파일이름")
libc = e.libc # 바이너리가 링킹하고 있는 라이브러리 파일 로딩
libc.symbols['_malloc_hook'] # 라이브러리에서 symbol들 찾아서 offset 구할 때 사용
read_plt = e.plt['read']

 

plt는 바이너리에 존재하는 PLT 주소를 가져온다.

print hex(elf.plt['printf'])
0x400480
print hex(elf.plt['system'])
0x40046c

바이너리 내애 printf@plt와 system@plt가 존재한다면 해당하는 주소를 가져올 수 있다.

 

got는 바이너리에 존재하는 GOT 주소를 가져온다.

print hex(elf.got['print'])
0x601020
print hex(elf.got['system'])
0x601018

바이너리 내에 printf@got와 system@got가 존재한다면 해당하는 주소를 가져올 수 있다.

 

symbols는 바이너리에 존재하는 함수의 주소를 가져온다.

print hex(elf.symbols['giveshell'])
0x4005b6

바이너리 내에 giveshell 함수가 존재한다면 해당하는 주소를 가져올 수 있다.

 

search는 바이너리에 존재하는 문자열의 주소를 가져온다.

print hex(next(elf.search("Hello World!")))
0X40069c

예제는 printf 함수의 인자로 “Hello World!” 문자열이 존재하기 때문에 해당 문자열의 주소를 가져올 수 있다.

 

get_section_by_name은 바이너리에 존재하는 섹션의 주소를 가져온다.

print hex(elf.get_section_by_name('.bss').header.sh_addr)
0x601048
print hex(elf.get_section_by_name('.text').header.sh_addr)
0x4004c0

bss 섹션과 text 섹션의 주소를 가져올 수 있다.

 

read는 원하는 바이너리 주소의 데이터를 읽어온다.

print 'elf.read(0x400000, 4)'
'\\x7fELF'
print 'elfread(elf.symbols['main'], 4)'
'UH\\x89\\xe5'

read의 인자로 바이너리의 주소와 읽을 바이트 수를 전달하면 해당하는 주소에 존재하는 값을 읽어온다.

 

write는 원하는 바이너리 주소에 데이터를 쓴다.

print 'elf.read(0x400000, 4)'
'\\x7fELF'
elf.write(0x400000, "!!!")
print 'elf.read(0x400000, 4)'
'!!!F'
elf.write(0x400000, "\\x7fELF")
print 'elfread(0x400000, 4)'
'\\x7fELF'

0x400000 주소의 첫 4바이트는 “7fELF” 값을 가지고 있다. write를 사용해서 “!!!” 문자열을 삽입하면 해당하는 주소에 값이 쓰이게 된다. 즉, 이는 특정 영역의 코드를 수정하기 위해서 사용할 수 있다.

 

 

Reference


https://d41jung0d.tistory.com/87

 

Pwntool 기본적인 사용법

nc p = remote(“접속주소”,포트) local p = process(“./파일이름”) ssh s = ssh(“사용자이름”, “접속주소”, port=포트번호,password=”비밀번호”) p = s.run("/bin/sh") p.sendline("./파일이름") 저는..

d41jung0d.tistory.com