我写了一个非常简单的程序,它有一个我想利用的缓冲区溢出漏洞。该计划如下:
#include <stdio.h>
void
foo(char *asd) {
char b [2];
memcpy(b, asd, strlen(asd));
}
int main(int argc, char* argv[])
{
foo(argv[1]);
}
当我运行它时:
./a.out `perl -e 'print "A"x100'`
我当然得到了分段错误:
[2] 4466 segmentation fault (core dumped) ./a.out `perl -e 'print "A"x100'`
我不明白的是,当我运行dmesg时,我希望在发生故障时看到rip寄存器包含0x4141414141414141。相反,它包含不同的东西,如ip:7fba99a4141。最后两个字节似乎被覆盖,但无论我写多少,只要这两个字节似乎是根据dmesg写的。 另一方面,如果我使用gdb,返回的地址似乎被完全覆盖,我确实可以利用bof。为什么会出现这种差异?