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
을 호출하는 ret2lib 호출을 오버플로우합니다.
임의 읽기
형식 문자열에 의해 제공되는 임의 읽기로 캐너리를 누출할 수 있습니다. 다음 예제를 확인하세요: https://ir0nstone.gitbook.io/notes/types/stack/canaries 및 다음에서 임의 메모리 주소를 읽기 위해 형식 문자열을 남용하는 방법을 읽을 수 있습니다:
이 도전 과제는 매우 간단한 방법으로 형식 문자열을 남용하여 스택에서 캐너리를 읽습니다.
Last updated