gpt4 book ai didi

C 缓冲区溢出 - 为什么触发段错误的字节数是恒定的? (Mac OS 10.8 64 位, clang )

转载 作者:行者123 更新时间:2023-12-04 05:09:36 26 4
gpt4 key购买 nike

我在 C 中尝试缓冲区溢出,并发现了一个有趣的怪癖:

对于任何给定的数组大小,似乎有一定数量的溢出字节可以在 SIGABRT 崩溃之前写入内存。例如,在下面的代码中,10 字节数组可以在 27 崩溃之前溢出到 26 字节。类似地,20 char 的数组s 可以溢出到 40 char s 之前它在 41 日中止。

谁能解释这是为什么?另外,SIGABRT 是否与“段错误”相同(或由其引起)?

Mac OS 10.8 - Xcode 4.6、clang 和 lldb。谢谢!

#include <stdio.h>

int main(int argc, const char * argv[])
{
char aString[ 10 ];
char aLetter = 'a';

printf("The size of one array slot sizeof( aString[0] ) is %zu\n", sizeof(aString[0]));
printf("The size of one letter sizeof( aLetter ) is %zu\n", sizeof(aLetter));

// Overflow the aString array of chars
// lldb claims aString is initialized with values \0 or NULL at all locations

// Substitute i<27 and this code will crash regularly
for (int i=0; i<26; i++) {
aString[i]= aLetter;
}

return 0;
}

编辑 - 我已经在反汇编中逐步完成并在 for 循环之后找到了这种保护:
0x100000f27:  movq   226(%rip), %rax           ; (void *)0x00007fff793f24b0: __stack_chk_guard
0x100000f2e: movq (%rax), %rax
0x100000f31: movq -8(%rbp), %rcx
0x100000f35: cmpq %rcx, %rax
0x100000f38: jne 0x100000f49 ; main + 121 at main.c:26
.
.
.
0x100000f49: callq 0x100000f4e ; symbol stub for: __stack_chk_fail

最佳答案

这是由于 mac 上的堆栈对齐操作系统

这不是什么大新闻,如果你用谷歌搜索,你会找到答案:

Why does the Mac ABI require 16-byte stack alignment for x86-32?

很高兴看到您实际上可以以小于 16 字节的块写入堆栈而不会产生副作用。

如果你多次利用它,你会进入一个状态,你的所有恶意代码都可以放下,你可以在堆栈上跳转执行它。

关于C 缓冲区溢出 - 为什么触发段错误的字节数是恒定的? (Mac OS 10.8 64 位, clang ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15038582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com