作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我正在尝试在 x86_64 中测试 clang-8 的“影子调用堆栈”功能。但是当我运行“shadowed”程序时,即使它是一个“Hello_World”程序,它也会不断抛出段错误。
我的编译命令是“clang-8 -fsanitize=shadow-call-stack normal.c”。
“normal.c”只是一个简单的 hello_world c 程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}
0x0000000000401130 <+0>: mov (%rsp),%r10
0x0000000000401134 <+4>: xor %r11,%r11
0x0000000000401137 <+7>: addq $0x8,%gs:(%r11)
0x000000000040113c <+12>: mov %gs:(%r11),%r11
0x0000000000401140 <+16>: mov %r10,%gs:(%r11)
0x0000000000401144 <+20>: push %rbp
0x0000000000401145 <+21>: mov %rsp,%rbp
0x0000000000401148 <+24>: sub $0x20,%rsp
0x000000000040114c <+28>: movl $0x0,-0x4(%rbp)
0x0000000000401153 <+35>: mov %edi,-0x8(%rbp)
0x0000000000401156 <+38>: mov %rsi,-0x10(%rbp)
0x000000000040115a <+42>: movabs $0x402004,%rdi
0x0000000000401164 <+52>: mov $0x0,%al
0x0000000000401166 <+54>: callq 0x401030 <printf@plt>
0x000000000040116b <+59>: xor %ecx,%ecx
0x000000000040116d <+61>: mov %eax,-0x14(%rbp)
0x0000000000401170 <+64>: mov %ecx,%eax
0x0000000000401172 <+66>: add $0x20,%rsp
0x0000000000401176 <+70>: pop %rbp
0x0000000000401177 <+71>: xor %r11,%r11
0x000000000040117a <+74>: mov %gs:(%r11),%r10
0x000000000040117e <+78>: mov %gs:(%r10),%r10
0x0000000000401182 <+82>: subq $0x8,%gs:(%r11)
0x0000000000401187 <+87>: cmp %r10,(%rsp)
0x000000000040118b <+91>: jne 0x401192 <main+98>
0x0000000000401191 <+97>: retq
0x0000000000401192 <+98>: ud2
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401137 in main ()
最佳答案
问题是,运行时环境必须初始化 gs
register 指向一个可以存储影子调用堆栈的位置。这不是很明确地说,但可以从 the Clang documentation 推导出来:
ShadowCallStack currently only supports x86_64 and aarch64. A runtime is not currently provided in compiler-rt so one must be provided by the compiled application.
gs
register 指向无处,因此写入访问失败并出现段错误。 Android libc 提供了这样的运行时。
gs
准备运行时环境注册正确初始化。
arch_prctl()
(未由libc 包裹),可用于设置
gs
登记:
arch_prctl(ARCH_SET_GS, baseaddr);
main()
之前)调用它。一个好处是在
_start()
中初始化它函数,通常位于单元
crt1.o
或类似。
关于c - 如何在 x86_64 中使用 clang-8 的 "shadow call stack"特性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59281598/
我是一名优秀的程序员,十分优秀!