이 메모리 주소 %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
'programing' 카테고리의 다른 글
C 매크로 정의는 다른 매크로를 참조할 수 있습니까? (0) | 2022.07.16 |
---|---|
Vue: utils vue 구성 테스트 - 루트.$route (0) | 2022.07.16 |
서버에서는 Vue.js 공백 페이지이지만 localhost에서는 정상입니다. (0) | 2022.07.16 |
Spring Boot 응용 프로그램용 포트 설정 방법 (0) | 2022.07.15 |
"정의되지 않은 행동"은 정말로 *무엇이든* 발생을 허용합니까? (0) | 2022.07.15 |