Pwnable/Tech

FSB 에 대해

Kon4 2022. 2. 7. 01:34

C언어에서 포맷스트링을 인자로 사용하는 함수들은 함수의 이름이 f(formatted)로 끝납니다. 즉 'f'로 끝나고 문자를 다루는 함수가 포맷 스트링을 처리 한다면, 이는 ex... scanf 등 으로 추측할 수 있습니다.

 

 

포맷 스트링 구조

: %[parameter][flags][width][.precision][length]type

 

specifier          description

 

d                    Signed Int

s                     String

x                     Unsigned hex

n                    Length of string

p                    void potiner

 

 

width (%[]s)

integer %5s

* %*s                 --> width of arg's length

 

** printf("%n", &num); ---> %n is input function format, So &arg is used. 

 

 

Parameter

Substance: The mark designates index of argument. *(basic parameter setting is index of order.

End Mark: $

**(Not Compare number of argument)

Ex....(printf("%2$d, %1$d", 2, 1); --> "1, 2"

 

64bit에서 FSB (Format String Bug) 이해하기 -(1) (tistory.com)

 

64bit에서 FSB (Format String Bug) 이해하기 -(1)

참고자료 : JSec님 블로그(blog.naver.com/yjw_sz/221889244689) 32bit FSB 시리즈 : 32bit에서 FSB (Format String Bug) 이해하기 -(1),(2),(3) 지난 10월... 32bit에서 FSB를 이해했었다. 이제 드디어..! 64bi..

jiravvit.tistory.com

위 블로그 참고.

 

또한 %n으로 입력 할 시 주소가 필요!(&arg) 즉 위치가 아닌 주소가 있어야함!

 

 

함수 호출 규약으로 rdi를 제외한 rsi rdx rcx r8 r9 -> stack 순으로 으로 레지스터 값과 스택 값을 읽을 수 있음 

즉 보통 x64 에선 6번째 부터 스택 출력.

 

익스 예시. PIE 적용시 __libc_csu_init(RSP+16) 값과 PIE 베이스 주소의 기준 주소(ELF 주소) 의 차이로 offset 찾고(code base). 이를 기반으로 변수 의 오프셋을 더하여 익스. (info var 변수명)

 

Tip.. 익스 할때 앞에 문자열이 들어가고 뒤에 바이트 형식의 주소(p64(addr)가 들어갈때 앞의 문자열을 "payload.encode()" 와 같이 encoding 하면 바이트 형식으로 형변환되어 에러 없이 문자열을 붙여 넣을 수 있음.

 

또한 변수 주소를 뒤에 넣고 이를 인자로 인식하게 하여 익스 할떄는 앞의 문자의 길이가 8의 배수 가 되도록 하고 인자의 순서를 정확히 명시 해야함.