본문 바로가기

Layer7

FSB1

Format String Bug

: printf 계열의 함수를 사용할 때 인자로 포맷 스트링과 포맷 스트링에 대한 인자를 사용하지 않고 변수를 인자로 바로 저장했을 때 발생하는 취약점

 

printf(buf); 와 같은 형태로 사용

 

buf = "A" : 문자열을 넣었을 때는 문자열로 인식해 문자열 그대로 출력

buf = "%p" : 서식문자를 넣었을 때는 서식문자로 인식해 메모리를 참조하여 메모리 값 출력


코드를 살펴보면 scanf를 통해 입력을 받고 printf로 정해진 형식 없이 출력

→ ret 주소를 leak

 

그 뒤에 read 함수로 다시 입력을 받음

→ bof를 터트려 system 함수 호출


ret에 있는 주소를 leak하기 위해 ret까지의 거리를 구해야 함.

레지스터 5개(rsi, rdx, rcx, r8, r9) + sfp 전까지 거리(0x10/8) + sfp (1) + ret(1) =  9

 

 

scanf 함수로 %9$p를 입력 받고 printf 함수로 ret의 주소를 출력함.

 

#FSB

① %9$p

 

② ret의 주소를 leak 변수에 저장

③ libc_base 구하기 (ret : __libc_start_main+240)

④ 함수 주소 구하기 ( libc_base + system_offset = system함수 주소)

⑤ "/bin/sh" 주소 구하기

 

# read (64bit RTL)

⑥ 16바이트 크기 format 변수 + sfp 8바이트 = 24바이트 를 문자로 채움

⑦ pop rdi; ret; 가젯

⑧ "bin/sh" 주소 (system 함수 인자)

⑨ system 함수 호출

 

'Layer7' 카테고리의 다른 글

Dreamhack : basic_rop_x64  (0) 2021.08.03
rop32  (0) 2021.08.03
Dreamhack :basic_rop_x86  (0) 2021.08.01
HackCTF : RTL64_1  (0) 2021.07.18
HackCTF : RTL32_1  (0) 2021.07.17