Format Strings - Arbitrary Read Example
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
다음과 같이 컴파일하세요:
오프셋은 11입니다. 여러 개의 A를 설정하고 0에서 50까지 루프를 통해 브루트 포싱한 결과, 오프셋 11에서 5개의 추가 문자(우리 경우에는 파이프 |
)와 함께 전체 주소를 제어할 수 있음을 발견했습니다.
**%11$p
**를 사용하여 주소가 모두 0x4141414141414141이 되도록 패딩을 추가했습니다.
포맷 문자열 페이로드는 주소 앞에 위치합니다. printf는 널 바이트에서 읽기를 멈추기 때문에, 주소를 보내고 나서 포맷 문자열을 보내면, 널 바이트가 먼저 발견되어 printf는 포맷 문자열에 도달하지 못합니다.
선택된 주소는 0x00400000입니다. 이 주소는 바이너리가 시작되는 위치입니다(PIE 없음).
다음과 같이 컴파일하세요:
**stack_password
**는 로컬 변수이기 때문에 스택에 저장됩니다. 따라서 printf를 악용하여 스택의 내용을 보여주는 것으로 충분합니다. 이는 스택에서 비밀번호를 누출하기 위해 처음 100 위치를 BF하는 익스플로잇입니다:
이미지에서 10번째
위치에서 스택에서 비밀번호를 유출할 수 있음을 볼 수 있습니다:
%s
대신 %p
를 사용하여 동일한 익스플로잇을 실행하면 %25$p
에서 스택에서 힙 주소를 유출할 수 있습니다. 또한, 유출된 주소(0xaaaab7030894
)를 해당 프로세스의 메모리에서 비밀번호의 위치와 비교하면 주소 차이를 얻을 수 있습니다:
이제 두 번째 포맷 문자열 취약점에서 액세스하기 위해 스택에서 1개의 주소를 제어하는 방법을 찾을 시간입니다:
그리고 사용된 패싱으로 try 14에서 주소를 제어할 수 있음을 확인할 수 있습니다:
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)