주소, 형식 지정자 순서

이전에 figure 4에서는 임의 주소에 쓸 때 (쓸 주소 + %N$n)로 했는데 이후에 figure 6,7 은 이렇게 해도 안되는 이유가 혹시 scanf 널바이트 문제 때문인가요?
6, 7에서는 (%Ns or $Nn + 주소) 형식처럼 주소를 뒤로 하더라구요.
그리고 널바이트 문제가 맞다면 6, 7에서 쓰거나 읽을 주소 중간에 00이 없어서 저렇게 가능했을것 같은데 만약 쓰거나 읽을 주소 중간에 Null 이 있으면 어떻게 하나요? ex) 0x55cf91210054

#시스템_해킹 #기초 #포맷_스트링_버그
작성자 정보
답변 1
avatar
김진우
대표 업적 없음

이해하신 내용이 맞습니다. Null 바이트를 처리하기 위해 %N$n + 주소와 같은 방식으로 포맷 스트링을 작성합니다. 쓰거나 읽을 주소에 Null 바이트가 있다면 하위 값만큼만 덮어씌워주면 됩니다.

0x00007fffffff1212: 0x0000000012121212

메모리에 다음과 같은 값이 들어가 있을때 해당 메모리를 포맷 스트링 버그를 통해 다음과 같이 255만큼 조작한다면 [0x00007fffffff1212]%247d%N$n 메모리에 들어가게되는 값은 0x00000000000000ff가 됩니다. 이런식으로 조작한 값보다 상위 바이트는 전부 Null 바이트가 됩니다. 만약 메모리의 하위 바이트에 Null 바이트를 넣고 싶다면 일단 상위 바이트에 대한 메모리 조작을 한 이후 %Nhn(2바이트조작),hn(2바이트 조작), %Nhhn(1바이트 조작) 이와 같이 %N$n(4바이트 조작)보다 더 적은 범위의 메모리 조작이 가능한 포맷스트링을 이용하거나 메모리 주소를 잘 조정해서 하위 바이트를 Null로 채워주시면 됩니다.

2022.01.06. 21:41
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기