汇编 movl %gs:20, %eax 的作用

本文详细解析了GCC编译器中的堆栈保护机制,包括如何通过特定指令在编译阶段加入堆栈金丝雀来检测堆栈溢出攻击。介绍了如何启用或禁用这一特性,并解释了其在汇编代码中的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将如下代码进行编译,输出的汇编版本为

int main()
{
    int a[2][3]= {{1,2,3},{4,5,6}};
    return 0;
}
	pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $36, %esp
    movl    %gs:20, %eax
    movl    %eax, -12(%ebp)
    xorl    %eax, %eax
    movl    $1, -36(%ebp)
    movl    $2, -32(%ebp)
    movl    $3, -28(%ebp)
    movl    $4, -24(%ebp)
    movl    $5, -20(%ebp)
    movl    $6, -16(%ebp)
    movl    $0, %eax
    movl    -12(%ebp), %edx
    xorl    %gs:20, %edx
    je  .L3 
    call    __stack_chk_fail

其中如下两行的作用是将 %gs:20 的值放在数组结束处,并在结束的时候判断这个值有没有被改变,从而判断堆栈是否损坏。这种叫做Stack canaries, 堆栈金丝雀

movl    %gs:20, %eax
xorl    %gs:20, %edx

gcc 默认情况下是开启堆栈检查,即 gcc -fstack-protector=strong
可以通过 gcc -fno-stack-protector关闭检查。

另,gs 一般 用来存放线程局部变量,比如 errno

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值