我编写了一段 C 代码,并将其反汇编并读取寄存器以了解程序在汇编中的工作原理。
int test(char *this){
char sum_buf[6];
strncpy(sum_buf,this,32);
return 0;
}
我一直在检查的代码片段是测试函数。当我反汇编我的测试函数的输出时,我得到......
0x00000000004005c0 <+12>: mov %fs:0x28,%rax
=> 0x00000000004005c9 <+21>: mov %rax,-0x8(%rbp)
... stuff ..
0x00000000004005f0 <+60>: xor %fs:0x28,%rdx
0x00000000004005f9 <+69>: je 0x400600 <test+76>
0x00000000004005fb <+71>: callq 0x4004a0 <__stack_chk_fail@plt>
0x0000000000400600 <+76>: leaveq
0x0000000000400601 <+77>: retq
我想知道的是mov %fs:0x28,%rax
真的在做什么吗?
这俩FS
and GS
寄存器可以用作基指针地址,以便访问特殊的操作系统数据结构。因此,您看到的是一个与保存在中的值有一定偏移量的值FS
寄存器,而不是对内容的位操作FS
登记。
具体来说,正在发生的事情是FS:0x28
Linux 上存储一个特殊的哨兵堆栈保护值,并且代码正在执行堆栈保护检查。例如,如果您进一步查看代码,您会发现该值FS:0x28
存储在堆栈中,然后调用堆栈的内容并返回XOR
是用原始值执行的FS:0x28
。如果两个值相等,则意味着已设置零位,因为XOR
'ing 两个相同的值会产生零值,然后我们跳转到test
例程,否则我们跳转到一个特殊函数,该函数指示堆栈以某种方式损坏,并且存储在堆栈上的哨兵值已更改。
如果使用海湾合作委员会,这可以禁用:
-fno-stack-protector
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)