[auth 주소]%249%1$n을 하면 auth주소에 있는 값을 변경시킬 수 있는거 아닌가요?
제발 어케하는지 알려주세요 ㅠ
설명에 앞서 %n 지시자와 N$의 용법에 대해 조금 더 이해하시면 많은 도움이 될 것 같습니다.
작성해주신 형식은 크게 차이가 없지만 사용되는 값에 대해 약간 차이가 있습니다. 아마 %1$n
과 같이 사용하신 이유가 아마 앞선 예제들을 그렇게 학습하였기 때문일 것 입니다.
그러나 실제로 다른 예제를 접하거나 문제를 풀다보면 항상 고정되어 있는 값은 아님을 알 수 있습니다. 저도 여러 번 시행 착오를 겪으면서 이해할 수 있었는데 쉽게 이해하자면 N$
에서 N은 자신의 조작할 입력값이 몇 번째 출력에 나타나는지에 대한 'offset' 이라고 이해하시면 좋을 것 같습니다.
해당 offset을 구하기 위해 일반적으로 'AAAAAAAA' 와 같은 값을 입력한 뒤 %p
혹은 %llx
등을 덧붙여 몇 번째에 나타나는지를 확인합니다.
bash3.2$ ./fsb1
input : AAAAAAAA.%p.%p.%p.%p.%p.%p
AAAAAAAA.0x7fffffffdde0.0x7fffffffdde0.0x20.0x7ffff7af2151.0x7ffff7dced80.0x7ffff7dced80
Fail
물론 위 과정을 간소화 하기 위해서는 함수 호출 과정에 대한 공부를 하시면 대략적인 위치를 예상할 수 있게 됩니다. 아래 게시글은 제가 공부할 때 참조했던 사이트 중 하나입니다.
https://jiravvit.tistory.com/entry/64bit에서-FSB-Format-String-Bug-이해하기-1
입력 길이의 제한이 있기 때문에 위 링크에서 배운 내용을 토대로 아래와 같이 다시 시도하면 제대로 확인할 수 있었습니다.
bash3.2$ ./fsb1
input : AAAAAAAA.%6$p.%7$p.%8$p.%9$p
AAAAAAAA.0x7ffff7dced80.0x1.0x42424242555547cd.0x4141414141414141
Fail
%n 지시자는 앞의 입력값을 저장하는 지시자라는 것은 아마 알고 있으실 겁니다. 여기에 offset에 관한 내용을 접목하면 auth 주소가 나타나기 시작하는 곳을 N$ 형식을 통해 지정할 필요가 있습니다.
저의 경우 9번째부터 사용자의 입력값이 출력되었기 때문에 offset이 9가 되었습니다. 추가로 문제에서는 auth 주소가 6자리가 표기되어 있어 아마 249 byte를 추가할 필요가 있다고 생각하신 것 같은데 8 byte 정렬을 맞춰주기 위해 0x0000
2 byte를 추가해서 최종적으로 아래와 같이 사용하면 해결할 수 있었습니다.
[auth 주소 + 0x0000]%247c%9$n
위 내용을 응용하면 0x00을 받아들일 경우 입력을 종료하는 함수(gets()
등..) 에서 변조할 메모리의 주소를 가장 마지막에 배치한 뒤 진행하는 식의 풀이도 가능하더라고요! 당장이 아니더라도 전반적으로 알아두시면 도움이 될 것 같습니다!!
이렇게 적용 해서\xD0\xDD\xFF\xFF\xFF\x7F\x00\x00%247c%9$n 로 적용하는게 맞는지요.. 아무리해도 fail 이네요