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)
。 计数是将从源中读取的最大字符数,而不是目标缓冲区的大小。
所以我想在 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)
。 计数是将从源中读取的最大字符数,而不是目标缓冲区的大小。