Strncat 复制到带有偏移量的目标

Strncat copied to the destination with an offset

所以我想在 strncat 上反汇编这个简单的 c 程序,

 #include <string.h>

 int main(int argc, char **argv) {  
    char buf[128];
    strncat(buf,argv[1],sizeof(buf));    
   }

拆解后

所以问题是 argv1 中的字符串将被复制到 [rbp-0x80] rsi 有一个指向 argv1 的指针,rdi 是 [rbp-0x80]

[rbp-0x80] 在我的例子中是 0x7fffffffe0d0

这是我作为 argv 传递的输入1 perl -e 'print "B"x10;print "A"x118'

所以 0x7fffffffe0d0 - 0x7fffffffe0da 应该有 4242... 但是有一个地址存储在 0x7fffffffe0d5 - 0x7fffffffe0d0

这是调用 strncat 函数之前的屏幕截图

调用strncat函数后的截图

我不明白为什么字符串从 0x7fffffffe0d6 而不是 0x7fffffffe0d0 开始

有什么想法吗?

编辑:

带输入的屏幕截图

你没有初始化buf[],里面的未初始化垃圾恰好不是以0开头的。您使用了 strncat,而不是 strncpy,因此它会查找现有字符串的开头。幸运的是,在缓冲区的开头附近有一个零,因此您实际上并没有溢出它。 (这是可能的,因为你使用 strncat 错误)。

令人惊讶的是,gcc 和 clang 对 strncat 的了解都不足以警告读取未初始化的数据。 clang-3.8 does warn that you got the size wrong:

strncat doesn't include the terminating 0 in the count, but it always writes one(不同于 strncpy)。而且计数也不包括 strlen(dst)计数是将从源中读取的最大字符数,而不是目标缓冲区的大小。