2016. 10. 29. 16:43

## Format String Bug 팁들


1. 스택 내 멀리 있는 주소의 값을 printf("%x%x...%x")로 찍어내지 않고 한 번에 출력하는 방법

=> printf("%길이$08x") -> ex) printf("%1337$08x")

=> 위와 같이 fsb를 터뜨리면 스택에 1337번째의 값을 HEX값으로 출력해줌(info leak할때 사용)


2. 스택 내 멀리 있는 주소의 값에 printf("%x%x...%x%n")로 주소 값 변조를 하지 않고 한 번에 변조를 하는 방법

=> printf("%길이$n") -> ex) printf("%12$n")

=> 위와 같이 fsb를 터뜨리면 스택의 12번째의 값에 저장되어 있는 주소에 앞에 출력된 바이트 수만큼 덮어씌울 수 있음.


3. 64bit Format String Bug에서의 특별한 점

=> 메모리 릭을 할때는 %x대신 %lx를 하여 8바이트 릭을 할 수 있음. 당연히 %12$lx도 사용 가능

=> 32비트에서는 바로 스택 $esp + 4부터 릭이 가능하지만, 64bit에서는 바로 스택이 안나옴.

=> 64비트 환경에선 %rdi, %rsi, %rdx, %rcx, %r8, %r9 순서로 릭이 된 다음 스택이 릭 된다.

=> 이런 이유는 64비트 환경에서는 함수 호출 시 레지스터로 인자 값을 활용하기 때문

=> memory write 할 때, 32비트에서는 %12$n으로 해도 되지만, 64비트에서는 "%12ln" 이런 식으로

     하면 된다.(0xffff이상의 값을 덮어씌울 수 있다.)

Posted by holinder4S