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 |