我在这里写了一个 C 函数(它确实存在缓冲区溢出漏洞)
void func(char *str)
{
char buffer[12];
int a=9;
strcpy(buffer,str);
}
它在 gdb 中的汇编转换为
|0x4005b4 <func> push %rbp
|0x4005b5 <func+1> mov %rsp,%rbp
|0x4005b8 <func+4> sub $0x40,%rsp
|0x4005bc <func+8> mov %rdi,-0x38(%rbp)
|0x4005c0 <func+12> mov %fs:0x28,%rax
|0x4005c9 <func+21> mov %rax,-0x8(%rbp)
|0x4005cd <func+25> xor %eax,%eax
|0x4005cf <func+27> movl $0x9,-0x24(%rbp)
|0x4005d6 <func+34> mov -0x38(%rbp),%rdx
|0x4005da <func+38> lea -0x20(%rbp),%rax
|0x4005de <func+42> mov %rdx,%rsi
|0x4005e1 <func+45> mov %rax,%rdi
|0x4005e4 <func+48> callq 0x400490 <strcpy@plt>
|0x4005e9 <func+53> mov -0x8(%rbp),%rax
|0x4005ed <func+57> xor %fs:0x28,%rax
|0x4005f6 <func+66> je 0x4005fd <func+73>
|0x4005f8 <func+68> callq 0x4004a0 <__stack_chk_fail@plt>
|0x4005fd <func+73> leaveq
|0x4005fe <func+74> retq
rdi
包含传递给函数的原始字符数组的地址。
1.In func+8
,是将这个 rdi 值移动到 -0x38(rbp) 以将值保存在函数的局部变量 str 中还是有其他含义?
2. 指令在func+8
完成什么?无论如何在 gdb 或 linux 中查看内容fs segment
?
3.指示func+12
做func+25
什么?
编辑:我在 gcc 4.6.3 中用 -O0 编译了这个