gpt4 book ai didi

c - 用汇编语言解释这一行?

转载 作者:太空狗 更新时间:2023-10-29 15:01:48 25 4
gpt4 key购买 nike

下面是反汇编的 C 程序的前 5 行,为了更好地学习汇编语言,我试图将其逆向工程回它的 C 代码。在这段代码的开头,我看到它在堆栈上腾出了空间并立即调用

0x000000000040054e <+8>:    mov    %fs:0x28,%rax

我很困惑这一行的作用,以及可能从相应的 C 程序调用它的是什么。到目前为止,我唯一一次看到这一行是在调用 C 程序中的不同方法时,但这次它后面没有任何 Callq 指令,所以我不太确定......任何想法还有什么可能在这个C 程序进行此调用?

0x0000000000400546 <+0>:    push   %rbp
0x0000000000400547 <+1>: mov %rsp,%rbp
0x000000000040054a <+4>: sub $0x40,%rsp
0x000000000040054e <+8>: mov %fs:0x28,%rax
0x0000000000400557 <+17>: mov %rax,-0x8(%rbp)
0x000000000040055b <+21>: xor %eax,%eax
0x000000000040055d <+23>: movl $0x17,-0x30(%rbp)
...

我知道这是为缓冲区溢出攻击提供某种形式的堆栈保护,我只需要知道如果不是单独的方法,什么 C 代码会提示这种保护。

最佳答案

正如你所说,这是用来防止缓冲区溢出的代码。编译器为具有局部变量的函数生成此“堆栈金丝雀检查”,这些局部变量可能是可能溢出的缓冲区。请注意您所询问的行上方和下方的说明:

sub  $0x40, %rsp
mov %fs:0x28, %rax
mov %rax, -0x8(%ebp)
xor %eax, %eax

sub 在堆栈上分配了 64 字节的空间,这足以容纳至少一个小数组。然后将一个 secret 值从 %fs:0x28 复制到该空间的顶部,就在前一帧指针和返回地址的下方,然后将其从寄存器文件中删除。

函数体对数组做一些事情;如果它写入数组末尾足够远的地方,它将覆盖 secret 值。在函数的末尾,将有如下代码

    mov    -0x8(%rbp), %rax
xor %fs:28, %rax
jne 1
mov %rbp, %rsp
pop %rbp
ret
1:
call __stack_chk_fail # does not return

这验证了 secret 值没有改变,如果改变了程序就会崩溃。这个想法是,有人试图利用一个简单的缓冲区溢出漏洞,就像您在使用 gets 时遇到的那样,如果不修改 secret 值,将无法更改返回地址。

编译器有 several different heuristics ,可通过命令行选项进行选择,用于决定何时需要生成 stack-canary 保护代码。

你不能自己写对应这个汇编语言的C代码,因为它使用了不常见的%fs:nnnn寻址方式; stack-canary 代码有意使用其他代码生成所不依赖的寻址模式,使对手尽可能难以了解 secret 值。

关于c - 用汇编语言解释这一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50278736/

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