【发布时间】:2018-10-21 01:39:21
【问题描述】:
下面是一个反汇编的 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 代码会提示这种保护。
【问题讨论】:
-
可以设置stack canary吗?您可以尝试使用和不使用
-fno-stack-protector进行编译,看看它是否会改变。 -
可能是在堆栈上分配缓冲区的代码(我们已经看到这里发生了这种情况)并可能将其传递给其他函数(在函数后面,未显示)在自动启用时触发此保护。只需将代码转录为 C,然后看看它的发生。或者只是不关心它。
-
for / while 循环会触发这种类型的保护吗?我注意到在代码的末尾有一个 je 指令在 main() 中前进。
-
不太可能。但是我们看到
sub $0x040,%rsp这意味着分配了一些本地人。要么它本身就足够了,要么它被传递给其他函数。
标签: c gcc assembly x86 reverse-engineering