programing

이 메모리 주소 %fs:0x28(fs[0x28])에 랜덤 값이 있는 이유는 무엇입니까?

kingscode 2022. 7. 16. 15:39
반응형

이 메모리 주소 %fs:0x28(fs[0x28])에 랜덤 값이 있는 이유는 무엇입니까?

저는 C 코드를 하나 작성했고, 조립 시 프로그램이 어떻게 작동하는지 이해하기 위해 레지스터를 읽을 뿐만 아니라 분해도 했습니다.

int test(char *this){
    char sum_buf[6];
    strncpy(sum_buf,this,32);
    return 0;
}

제가 검사하고 있는 코드 중 하나가 테스트 함수입니다.출력을 분해하면 테스트 기능이...

   0x00000000004005c0 <+12>:        mov    %fs:0x28,%rax
=> 0x00000000004005c9 <+21>:        mov    %rax,-0x8(%rbp)
... stuff ..
   0x00000000004005f0 <+60>:        xor    %fs:0x28,%rdx
   0x00000000004005f9 <+69>:        je     0x400600 <test+76>
   0x00000000004005fb <+71>:        callq  0x4004a0 <__stack_chk_fail@plt>
   0x0000000000400600 <+76>:        leaveq 
   0x0000000000400601 <+77>:        retq 

내가 알고 싶은 것은mov %fs:0x28,%rax정말 그래?

둘 다FS그리고.GS레지스터는 특별한 운영 체제 데이터 구조에 액세스하기 위해 기본 주소로서 사용할 수 있습니다.즉, 이 값은 에 저장되어 있는 값에서 오프셋으로 로드된 값입니다.FS의 내용을 비트 조작하지 않고,FS등록하세요.

구체적으로 무슨 일이 일어나고 있는 거죠?FS:0x28는 특별한 sentinel stack-guard 값을 저장하고 있으며 코드는 스택가드 체크를 실행하고 있습니다.예를 들어, 코드를 더 자세히 보면,FS:0x28스택에 저장되어 스택의 내용이 호출되어XOR에서 원래 값을 사용하여 수행됩니다.FS:0x28두 값이 같을 경우 이는 0비트가 설정되어 있음을 의미합니다.XOR같은 값을 2개 입력하면 제로 값이 되고, 다음으로 다음으로 넘어갑니다.test루틴을 실행하지 않으면 스택이 어떤 이유로 파손되어 스택에 저장되어 있는 sentinel 값이 변경되었음을 나타내는 특별한 함수로 이동합니다.

GCC 를 사용하고 있는 경우는, 다음의 방법으로 무효로 할 수 있습니다.

-fno-stack-protector
glibc:
  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
# ifdef THREAD_SET_STACK_GUARD
  THREAD_SET_STACK_GUARD (stack_chk_guard); 

the _dl_random from kernel.

http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm,을 보면%fs:28실제로는 의 주소로부터28 바이트의 오프셋입니다.%fs로케이션에서 풀레지스터 사이즈를 로드하고 있는 것 같습니다.%fs + 28%rax로 변환합니다.

언급URL : https://stackoverflow.com/questions/10325713/why-does-this-memory-address-fs0x28-fs0x28-have-a-random-value

반응형