Linux 64位机器上的缓冲区溢出和dmesg

Linux 64位机器上的缓冲区溢出和dmesg,linux,gcc,64-bit,buffer-overflow,exploit,Linux,Gcc,64 Bit,Buffer Overflow,Exploit,我写了一个非常简单的程序,它有一个缓冲区溢出漏洞,我想利用它。计划如下: #include <stdio.h> void foo(char *asd) { char b [2]; memcpy(b, asd, strlen(asd)); } int main(int argc, char* argv[]) { foo(argv[1]); } 我当然得到了分段错误: [2] 4466 segmentation fault (cor

我写了一个非常简单的程序,它有一个缓冲区溢出漏洞,我想利用它。计划如下:

#include <stdio.h>

 void
 foo(char *asd) {
     char b [2];
     memcpy(b, asd, strlen(asd));
 }

 int main(int argc, char* argv[])
 {
    foo(argv[1]);

 }
我当然得到了分段错误:

 [2]    4466 segmentation fault (core dumped)  ./a.out `perl -e 'print "A"x100'`
我不明白的是,当我运行dmesg时,我希望在故障发生时看到rip寄存器包含0x4141。相反,它包含一些不同的内容,如ip:7fba99a4141。最后两个字节似乎被覆盖,但无论我写多少字节,根据dmesg写的似乎不超过这两个字节。
另一方面,如果我使用gdb,返回地址似乎被完全覆盖,我确实可以利用bof。为什么会有这种差异?

能否附加编译器生成的汇编代码?这应该有助于解释。如果您将b更改为char b[4],那么您在寄存器中看到了什么?
 [2]    4466 segmentation fault (core dumped)  ./a.out `perl -e 'print "A"x100'`