我已经读过堆栈通常从相同的地址开始,因此攻击者可能会猜到缓冲区的起始点是否溢出。这是了解此地址以使恶意代码运行所必需的。我创建了一个带有几行代码的程序,以便在每次启动时获取堆栈指针地址并将其打印在屏幕上:
int * get_stack_pointer(){
__asm__("mov %esp,%eax");
}
void main(){
printf("Address: %p\n",get_stack_pointer());
}
这是程序的反汇编:
<get_stack_pointer>:
push %rbp
mov %rsp,%rbp
mov %esp,%eax
pop %rbp
retq
<main>:
push %rbp
mov %rsp,%rbp
mov $0x0,%eax
callq 40050c <get_stack_pointer>
mov %rax,%rsi
mov $0x4005ec,%edi
mov $0x0,%eax
callq 4003e0 <printf@plt>
pop %rbp
retq
但每次启动程序时,我都会得到不同的地址。一些主题如下:
地址:0xc31b2c80 地址:0x2e041e0 地址:0x7b003190 地址:0xb3fd1350
那么在这种情况下,攻击者如何在易受攻击的程序上运行他的代码呢? (我的操作系统是Linux 64位)
编辑:我在汇编中创建了另一个程序,其中包含一些简单的行。我只是每次从调试器开始检查RSP的值,我看到RSP总是有相同的值但不是用c写的程序。