저는 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
, 이는 바이너리로 컴파일된 스택 보호기 코드에서 호출됩니다.