scanf() 함수는 format string을 이용해 표준입력을 받을 수 있는 함수이다. format string에는 다양한 종류가 있는데 실수를 입력받는 방법은 %f, %lf를 이용해 입력받을 수 있다.
취약점
하지만 위의 방법을 이용해 실수를 입력받게되면 취약점이 발생하게된다. 바로 문자열 .을 입력하게 된다면 메모리에있는 데이터의 값이 달라지지않고 메모리에 원래있던 값이 그대로 남아있게된다. 만약 공격자가 buffer overflow 공격을 사용할 수 있고 바이너리에 canary가 걸려있다는 조건에서 바이너리가 실수를 입력받을때 위의 방법을 통해서 canary를 leak할 수 있거나 canary의 값을 변경하지 않고 ret를 조작할 수 있기 때문에 exploit이 가능하다.
주의할점
ROP와 같은 기법을 사용하게 된다면 주소를 입력해야된다. 다만 이경우 바이너리를 exploit할때 실수를 입력받게되므로 입력값을 실수로 보내주어야 우리가 원하는값을 넣을 수 있다. 실수로 값을 변경하는 방법은 아래와 같다.
def hex_to_double(val):
val = p64(val).hex()
val = struct.unpack('d', bytes.fromhex(val))[0]
return str(val)'hacking > pwnable' 카테고리의 다른 글
| tcache (0) | 2022.12.06 |
|---|---|
| ptmalloc2 allocator (0) | 2022.12.06 |
| SROP (0) | 2022.12.06 |
| libc.so.6 (0) | 2022.12.06 |
| Lazy Binding (0) | 2022.12.06 |