***스택 스매싱 감지됨*** 비활성화:종료

***스택 스매싱 감지됨*** 비활성화:종료

저는 Ubuntu 18.04와 다음과 같은 간단한 프로그램을 실행하고 있습니다.

#include <stdio.h>

int main(int ac, char *av[ac+1], char **env) {
    char arr[8];

    printf("0x%x\n", av);
    scanf("%s", arr);
    return 0;
}

다음 메시지와 함께 버퍼 오버플로 공격이 발생하면 종료됩니다.

*** stack smashing detected ***: <unknown> terminated

이전 버전의 Ubuntu(또는 Linux? 무엇이 변경되었는지 모르겠습니다)에서는 다음과 같이 인쇄됩니다.

*** stack smashing detected ***: ./a.out terminated

복원할 수 있나요? 무엇이 바뀌었나요?

답변1

나는 우분투를 실행하고 있지 않지만 최신 버전의 glibc에서는 이것이 가능하지 않다고 생각합니다. 이것 좀 봐범죄.

물론 빠진 것은 자신만의 스택 스매시 감지기를 작성하는 것입니다.

당신은 볼 수 있습니다원천이 메시지를 인쇄하는 기능:

void
__attribute__ ((noreturn))
__fortify_fail_abort (_Bool need_backtrace, const char *msg)
{
  /* The loop is added only to keep gcc happy.  Don't pass down
     __libc_argv[0] if we aren't doing backtrace since __libc_argv[0]
     may point to the corrupted stack.  */
  while (1)
    __libc_message (need_backtrace ? (do_abort | do_backtrace) : do_abort,
            "*** %s ***: %s terminated\n",
            msg,
            (need_backtrace && __libc_argv[0] != NULL
             ? __libc_argv[0] : "<unknown>"));
}

need_backtrace = False이 기능은 다음부터 시작됩니다.__stack_chk_fail, 이는 바이너리로 컴파일된 스택 보호기 코드에서 호출됩니다.

관련 정보