Print Stack Canary
출력된 스택 확대
스택 오버플로우 취약한 프로그램이 puts 함수를 스택 오버플로우의 일부를 가리키도록 실행할 수 있는 상황을 상상해보세요. 공격자는 캐너리의 첫 번째 바이트가 널 바이트(\x00
)이고 나머지 캐너리는 랜덤 바이트임을 알고 있습니다. 그럼 공격자는 오버플로우를 생성하여 스택을 덮어씌워 캐너리의 첫 번째 바이트만 남도록 할 수 있습니다.
그런 다음, 공격자는 페이로드의 중간에서 puts 기능을 호출하여 캐너리를 모두 출력할 수 있습니다(첫 번째 널 바이트를 제외).
이 정보를 통해 공격자는 캐너리를 알고(동일한 프로그램 세션에서) 새로운 공격을 작성하고 전송할 수 있습니다.
물론, 이 전술은 공격자가 페이로드 내용을 출력하여 캐너리를 유출하고 그 후에 실제 버퍼 오버플로우를 보내기 위해 새로운 페이로드를 생성할 수 있어야 하기 때문에 매우 제한적입니다.
CTF 예시:
64비트, ASLR 활성화되어 있지만 PIE가 없는 경우, 오버플로우를 생성하여 캐너리의 0x00 바이트까지 채운 후 puts를 호출하여 유출합니다. 캐너리로부터 ROP 가젯을 생성하여 GOT에서 puts 주소를 유출하고
system('/bin/sh')
를 호출하는 ROP 가젯을 호출합니다.32비트, ARM, relro 없음, 캐너리, nx, pie 없음. 캐너리를 유출하기 위해 puts를 호출하는 오버플로우를 생성하고 ROP 체인을 사용하여
system
을 호출합니다.
임의 읽기
형식 문자열에 의해 제공되는 임의 읽기로 캐너리를 유출할 수 있습니다. 다음 예제를 확인하세요: https://ir0nstone.gitbook.io/notes/types/stack/canaries 및 다음에서 형식 문자열을 남용하여 임의 메모리 주소를 읽는 방법을 읽을 수 있습니다:
이 도전 과제는 매우 간단한 방법으로 형식 문자열을 남용하여 스택에서 캐너리를 읽습니다.
Last updated