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)
위 블로그 참고.
또한 %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의 배수 가 되도록 하고 인자의 순서를 정확히 명시 해야함.
'Pwnable > Tech' 카테고리의 다른 글
SHA - Master Canary (0) | 2022.02.11 |
---|---|
SHA - SECCOMP(Sandbox), Bypass SECCOMP (0) | 2022.02.10 |
PIE와 RELRO (0) | 2022.01.27 |
-STACK- Stack Canary (0) | 2022.01.06 |
-Heap- Tcache Poisoning (0) | 2022.01.06 |